blob: 0aba5911e25bc9234eb3fe8a715808f221f2db6a [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
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, 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
Charles-François Natali30589c92011-10-07 22:47:08 +02001168#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
Charles-François Natali30589c92011-10-07 22:47:08 +02001592#ifdef AF_CAN
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
Charles-François Natali30589c92011-10-07 22:47:08 +02001799#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. */
1888 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001889 return 0;
1890 if (space < cmsg_len_end)
1891 space = cmsg_len_end;
1892 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1893 return (cmsg_offset <= (size_t)-1 - space &&
1894 cmsg_offset + space <= msg->msg_controllen);
1895}
1896
1897/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1898 *space to number of bytes following it in the buffer and return
1899 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1900 msg->msg_controllen are valid. */
1901static int
1902get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1903{
1904 size_t data_offset;
1905 char *data_ptr;
1906
1907 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1908 return 0;
1909 data_offset = data_ptr - (char *)msg->msg_control;
1910 if (data_offset > msg->msg_controllen)
1911 return 0;
1912 *space = msg->msg_controllen - data_offset;
1913 return 1;
1914}
1915
1916/* If cmsgh is invalid or not contained in the buffer pointed to by
1917 msg->msg_control, return -1. If cmsgh is valid and its associated
1918 data is entirely contained in the buffer, set *data_len to the
1919 length of the associated data and return 0. If only part of the
1920 associated data is contained in the buffer but cmsgh is otherwise
1921 valid, set *data_len to the length contained in the buffer and
1922 return 1. */
1923static int
1924get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1925{
1926 size_t space, cmsg_data_len;
1927
1928 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1929 cmsgh->cmsg_len < CMSG_LEN(0))
1930 return -1;
1931 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1932 if (!get_cmsg_data_space(msg, cmsgh, &space))
1933 return -1;
1934 if (space >= cmsg_data_len) {
1935 *data_len = cmsg_data_len;
1936 return 0;
1937 }
1938 *data_len = space;
1939 return 1;
1940}
1941#endif /* CMSG_LEN */
1942
1943
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001944/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001945
Guido van Rossum73624e91994-10-10 17:59:00 +00001946static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001947sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001948{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 sock_addr_t addrbuf;
1950 SOCKET_T newfd = INVALID_SOCKET;
1951 socklen_t addrlen;
1952 PyObject *sock = NULL;
1953 PyObject *addr = NULL;
1954 PyObject *res = NULL;
1955 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001956#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1957 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
1958 static int accept4_works = -1;
1959#endif
1960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 if (!getsockaddrlen(s, &addrlen))
1962 return NULL;
1963 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 if (!IS_SELECTABLE(s))
1966 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001967
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001968 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001971 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001972 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001973#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1974 if (accept4_works != 0) {
1975 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
1976 SOCK_CLOEXEC);
1977 if (newfd == INVALID_SOCKET && accept4_works == -1) {
1978 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
1979 accept4_works = (errno != ENOSYS);
1980 }
1981 }
1982 if (accept4_works == 0)
1983 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1984#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001986#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00001987 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 if (timeout == 1) {
1991 PyErr_SetString(socket_timeout, "timed out");
1992 return NULL;
1993 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001994 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 if (newfd == INVALID_SOCKET)
1997 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001998
Victor Stinnerdaf45552013-08-28 00:53:59 +02001999#ifdef MS_WINDOWS
2000 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2001 PyErr_SetFromWindowsErr(0);
2002 SOCKETCLOSE(newfd);
2003 goto finally;
2004 }
2005#else
2006
2007#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2008 if (!accept4_works)
2009#endif
2010 {
2011 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2012 SOCKETCLOSE(newfd);
2013 goto finally;
2014 }
2015 }
2016#endif
2017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 sock = PyLong_FromSocket_t(newfd);
2019 if (sock == NULL) {
2020 SOCKETCLOSE(newfd);
2021 goto finally;
2022 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2025 addrlen, s->sock_proto);
2026 if (addr == NULL)
2027 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002030
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 Py_XDECREF(sock);
2033 Py_XDECREF(addr);
2034 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002035}
2036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002037PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002038"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002039\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002040Wait for an incoming connection. Return a new socket file descriptor\n\
2041representing the connection, and the address of the client.\n\
2042For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002043
Guido van Rossum11ba0942002-06-13 15:07:44 +00002044/* s.setblocking(flag) method. Argument:
2045 False -- non-blocking mode; same as settimeout(0)
2046 True -- blocking mode; same as settimeout(None)
2047*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002048
Guido van Rossum73624e91994-10-10 17:59:00 +00002049static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002050sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002051{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002052 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 block = PyLong_AsLong(arg);
2055 if (block == -1 && PyErr_Occurred())
2056 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 s->sock_timeout = block ? -1.0 : 0.0;
2059 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 Py_INCREF(Py_None);
2062 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002063}
Guido van Rossume4485b01994-09-07 14:32:49 +00002064
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002065PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002066"setblocking(flag)\n\
2067\n\
2068Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002069setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002070setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002071
Guido van Rossum11ba0942002-06-13 15:07:44 +00002072/* s.settimeout(timeout) method. Argument:
2073 None -- no timeout, blocking mode; same as setblocking(True)
2074 0.0 -- non-blocking mode; same as setblocking(False)
2075 > 0 -- timeout mode; operations time out after timeout seconds
2076 < 0 -- illegal; raises an exception
2077*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002078static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002079sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 if (arg == Py_None)
2084 timeout = -1.0;
2085 else {
2086 timeout = PyFloat_AsDouble(arg);
2087 if (timeout < 0.0) {
2088 if (!PyErr_Occurred())
2089 PyErr_SetString(PyExc_ValueError,
2090 "Timeout value out of range");
2091 return NULL;
2092 }
2093 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 s->sock_timeout = timeout;
2096 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 Py_INCREF(Py_None);
2099 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002100}
2101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002102PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002103"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002104\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002105Set a timeout on socket operations. 'timeout' can be a float,\n\
2106giving in seconds, or None. Setting a timeout of None disables\n\
2107the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002108Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002109
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002110/* s.gettimeout() method.
2111 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002112static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002113sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 if (s->sock_timeout < 0.0) {
2116 Py_INCREF(Py_None);
2117 return Py_None;
2118 }
2119 else
2120 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002121}
2122
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002123PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002124"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002125\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002126Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002128operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002129
Guido van Rossumaee08791992-09-08 09:05:33 +00002130/* s.setsockopt() method.
2131 With an integer third argument, sets an integer option.
2132 With a string third argument, sets an option from a buffer;
2133 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002134
Guido van Rossum73624e91994-10-10 17:59:00 +00002135static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002136sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 int level;
2139 int optname;
2140 int res;
2141 char *buf;
2142 int buflen;
2143 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 if (PyArg_ParseTuple(args, "iii:setsockopt",
2146 &level, &optname, &flag)) {
2147 buf = (char *) &flag;
2148 buflen = sizeof flag;
2149 }
2150 else {
2151 PyErr_Clear();
2152 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2153 &level, &optname, &buf, &buflen))
2154 return NULL;
2155 }
2156 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2157 if (res < 0)
2158 return s->errorhandler();
2159 Py_INCREF(Py_None);
2160 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002161}
2162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002163PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002164"setsockopt(level, option, value)\n\
2165\n\
2166Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002167The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002168
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002169
Guido van Rossumaee08791992-09-08 09:05:33 +00002170/* s.getsockopt() method.
2171 With two arguments, retrieves an integer option.
2172 With a third integer argument, retrieves a string buffer of that size;
2173 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002174
Guido van Rossum73624e91994-10-10 17:59:00 +00002175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002176sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 int level;
2179 int optname;
2180 int res;
2181 PyObject *buf;
2182 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2185 &level, &optname, &buflen))
2186 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 if (buflen == 0) {
2189 int flag = 0;
2190 socklen_t flagsize = sizeof flag;
2191 res = getsockopt(s->sock_fd, level, optname,
2192 (void *)&flag, &flagsize);
2193 if (res < 0)
2194 return s->errorhandler();
2195 return PyLong_FromLong(flag);
2196 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002198 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 "getsockopt buflen out of range");
2200 return NULL;
2201 }
2202 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2203 if (buf == NULL)
2204 return NULL;
2205 res = getsockopt(s->sock_fd, level, optname,
2206 (void *)PyBytes_AS_STRING(buf), &buflen);
2207 if (res < 0) {
2208 Py_DECREF(buf);
2209 return s->errorhandler();
2210 }
2211 _PyBytes_Resize(&buf, buflen);
2212 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002213}
2214
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002215PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002216"getsockopt(level, option[, buffersize]) -> value\n\
2217\n\
2218Get a socket option. See the Unix manual for level and option.\n\
2219If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002220string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002221
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002222
Fred Drake728819a2000-07-01 03:40:12 +00002223/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224
Guido van Rossum73624e91994-10-10 17:59:00 +00002225static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002226sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 sock_addr_t addrbuf;
2229 int addrlen;
2230 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2233 return NULL;
2234 Py_BEGIN_ALLOW_THREADS
2235 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2236 Py_END_ALLOW_THREADS
2237 if (res < 0)
2238 return s->errorhandler();
2239 Py_INCREF(Py_None);
2240 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002241}
2242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244"bind(address)\n\
2245\n\
2246Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002247pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002248sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002249
Guido van Rossum30a685f1991-06-27 15:51:29 +00002250
2251/* s.close() method.
2252 Set the file descriptor to -1 so operations tried subsequently
2253 will surely fail. */
2254
Guido van Rossum73624e91994-10-10 17:59:00 +00002255static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002256sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if ((fd = s->sock_fd) != -1) {
2261 s->sock_fd = -1;
2262 Py_BEGIN_ALLOW_THREADS
2263 (void) SOCKETCLOSE(fd);
2264 Py_END_ALLOW_THREADS
2265 }
2266 Py_INCREF(Py_None);
2267 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002268}
2269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002270PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002271"close()\n\
2272\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002273Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002274
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002275static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002276sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002277{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002278 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002279 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002280 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002281}
2282
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002283PyDoc_STRVAR(detach_doc,
2284"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002285\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002286Close the socket object without closing the underlying file descriptor.\n\
2287The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002288can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002289
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002290static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002291internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 timeout = 0;
2297 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002298
2299#ifdef MS_WINDOWS
2300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 if (s->sock_timeout > 0.0) {
2302 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2303 IS_SELECTABLE(s)) {
2304 /* This is a mess. Best solution: trust select */
2305 fd_set fds;
2306 fd_set fds_exc;
2307 struct timeval tv;
2308 tv.tv_sec = (int)s->sock_timeout;
2309 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2310 FD_ZERO(&fds);
2311 FD_SET(s->sock_fd, &fds);
2312 FD_ZERO(&fds_exc);
2313 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002314 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2315 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 if (res == 0) {
2317 res = WSAEWOULDBLOCK;
2318 timeout = 1;
2319 } else if (res > 0) {
2320 if (FD_ISSET(s->sock_fd, &fds))
2321 /* The socket is in the writable set - this
2322 means connected */
2323 res = 0;
2324 else {
2325 /* As per MS docs, we need to call getsockopt()
2326 to get the underlying error */
2327 int res_size = sizeof res;
2328 /* It must be in the exception set */
2329 assert(FD_ISSET(s->sock_fd, &fds_exc));
2330 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2331 (char *)&res, &res_size))
2332 /* getsockopt also clears WSAGetLastError,
2333 so reset it back. */
2334 WSASetLastError(res);
2335 else
2336 res = WSAGetLastError();
2337 }
2338 }
2339 /* else if (res < 0) an error occurred */
2340 }
2341 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 if (res < 0)
2344 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002345
2346#else
2347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 if (s->sock_timeout > 0.0) {
2349 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2350 timeout = internal_select(s, 1);
2351 if (timeout == 0) {
2352 /* Bug #1019808: in case of an EINPROGRESS,
2353 use getsockopt(SO_ERROR) to get the real
2354 error. */
2355 socklen_t res_size = sizeof res;
2356 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2357 SO_ERROR, &res, &res_size);
2358 if (res == EISCONN)
2359 res = 0;
2360 errno = res;
2361 }
2362 else if (timeout == -1) {
2363 res = errno; /* had error */
2364 }
2365 else
2366 res = EWOULDBLOCK; /* timed out */
2367 }
2368 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 if (res < 0)
2371 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002372
2373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002377}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002378
Fred Drake728819a2000-07-01 03:40:12 +00002379/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002380
Guido van Rossum73624e91994-10-10 17:59:00 +00002381static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002382sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 sock_addr_t addrbuf;
2385 int addrlen;
2386 int res;
2387 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2390 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 Py_BEGIN_ALLOW_THREADS
2393 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2394 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 if (timeout == 1) {
2397 PyErr_SetString(socket_timeout, "timed out");
2398 return NULL;
2399 }
2400 if (res != 0)
2401 return s->errorhandler();
2402 Py_INCREF(Py_None);
2403 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002404}
2405
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002406PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002407"connect(address)\n\
2408\n\
2409Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002410is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002411
Guido van Rossum30a685f1991-06-27 15:51:29 +00002412
Fred Drake728819a2000-07-01 03:40:12 +00002413/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002414
2415static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002416sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 sock_addr_t addrbuf;
2419 int addrlen;
2420 int res;
2421 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2424 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 Py_BEGIN_ALLOW_THREADS
2427 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2428 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 /* Signals are not errors (though they may raise exceptions). Adapted
2431 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002432#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 if (res == EINTR && PyErr_CheckSignals())
2434 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002435#endif
2436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002438}
2439
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002440PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002441"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442\n\
2443This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002444instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002445
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002446
Guido van Rossumed233a51992-06-23 09:07:03 +00002447/* s.fileno() method */
2448
Guido van Rossum73624e91994-10-10 17:59:00 +00002449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002450sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002453}
2454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002455PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002456"fileno() -> integer\n\
2457\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002459
Guido van Rossumed233a51992-06-23 09:07:03 +00002460
Guido van Rossumc89705d1992-11-26 08:54:07 +00002461/* s.getsockname() method */
2462
Guido van Rossum73624e91994-10-10 17:59:00 +00002463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002464sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 sock_addr_t addrbuf;
2467 int res;
2468 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 if (!getsockaddrlen(s, &addrlen))
2471 return NULL;
2472 memset(&addrbuf, 0, addrlen);
2473 Py_BEGIN_ALLOW_THREADS
2474 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2475 Py_END_ALLOW_THREADS
2476 if (res < 0)
2477 return s->errorhandler();
2478 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2479 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002480}
2481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002482PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002483"getsockname() -> address info\n\
2484\n\
2485Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487
Guido van Rossumc89705d1992-11-26 08:54:07 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002490/* s.getpeername() method */
2491
Guido van Rossum73624e91994-10-10 17:59:00 +00002492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002493sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 sock_addr_t addrbuf;
2496 int res;
2497 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 if (!getsockaddrlen(s, &addrlen))
2500 return NULL;
2501 memset(&addrbuf, 0, addrlen);
2502 Py_BEGIN_ALLOW_THREADS
2503 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2504 Py_END_ALLOW_THREADS
2505 if (res < 0)
2506 return s->errorhandler();
2507 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2508 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002509}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002511PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002512"getpeername() -> address info\n\
2513\n\
2514Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002516
Guido van Rossumb6775db1994-08-01 11:34:53 +00002517#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002518
2519
Guido van Rossum30a685f1991-06-27 15:51:29 +00002520/* s.listen(n) method */
2521
Guido van Rossum73624e91994-10-10 17:59:00 +00002522static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002523sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 int backlog;
2526 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002527
Serhiy Storchaka78980432013-01-15 01:12:17 +02002528 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 if (backlog == -1 && PyErr_Occurred())
2530 return NULL;
2531 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002532 /* To avoid problems on systems that don't allow a negative backlog
2533 * (which doesn't make sense anyway) we force a minimum value of 0. */
2534 if (backlog < 0)
2535 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 res = listen(s->sock_fd, backlog);
2537 Py_END_ALLOW_THREADS
2538 if (res < 0)
2539 return s->errorhandler();
2540 Py_INCREF(Py_None);
2541 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002542}
2543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545"listen(backlog)\n\
2546\n\
2547Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002548least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2549unaccepted connections that the system will allow before refusing new\n\
2550connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002551
2552
Thomas Wouters477c8d52006-05-27 19:21:47 +00002553/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002554 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002555 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002556 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002557 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002558 * also possible that we return a number of bytes smaller than the request
2559 * bytes.
2560 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002561
Antoine Pitrou19467d22010-08-17 19:33:30 +00002562static Py_ssize_t
2563sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002564{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002565 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 if (!IS_SELECTABLE(s)) {
2569 select_error();
2570 return -1;
2571 }
2572 if (len == 0) {
2573 /* If 0 bytes were requested, do nothing. */
2574 return 0;
2575 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002576
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002577 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002579 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002580 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002581#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002582 if (len > INT_MAX)
2583 len = INT_MAX;
2584 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2585#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002587#endif
2588 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 if (timeout == 1) {
2592 PyErr_SetString(socket_timeout, "timed out");
2593 return -1;
2594 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002595 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 if (outlen < 0) {
2597 /* Note: the call to errorhandler() ALWAYS indirectly returned
2598 NULL, so ignore its return value */
2599 s->errorhandler();
2600 return -1;
2601 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002603}
2604
Guido van Rossum48a680c2001-03-02 06:34:14 +00002605
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002606/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002607
Guido van Rossum73624e91994-10-10 17:59:00 +00002608static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002609sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002610{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002611 Py_ssize_t recvlen, outlen;
2612 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002614
Antoine Pitrou19467d22010-08-17 19:33:30 +00002615 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 if (recvlen < 0) {
2619 PyErr_SetString(PyExc_ValueError,
2620 "negative buffersize in recv");
2621 return NULL;
2622 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 /* Allocate a new string. */
2625 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2626 if (buf == NULL)
2627 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 /* Call the guts */
2630 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2631 if (outlen < 0) {
2632 /* An error occurred, release the string and return an
2633 error. */
2634 Py_DECREF(buf);
2635 return NULL;
2636 }
2637 if (outlen != recvlen) {
2638 /* We did not read as many bytes as we anticipated, resize the
2639 string if possible and be successful. */
2640 _PyBytes_Resize(&buf, outlen);
2641 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002644}
2645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002646PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002647"recv(buffersize[, flags]) -> data\n\
2648\n\
2649Receive up to buffersize bytes from the socket. For the optional flags\n\
2650argument, see the Unix manual. When no data is available, block until\n\
2651at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002652the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002653
Guido van Rossum30a685f1991-06-27 15:51:29 +00002654
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002655/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002656
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002658sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002661
Antoine Pitrou19467d22010-08-17 19:33:30 +00002662 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 Py_buffer pbuf;
2664 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002665 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002668 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 &pbuf, &recvlen, &flags))
2670 return NULL;
2671 buf = pbuf.buf;
2672 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 if (recvlen < 0) {
2675 PyBuffer_Release(&pbuf);
2676 PyErr_SetString(PyExc_ValueError,
2677 "negative buffersize in recv_into");
2678 return NULL;
2679 }
2680 if (recvlen == 0) {
2681 /* If nbytes was not specified, use the buffer's length */
2682 recvlen = buflen;
2683 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 /* Check if the buffer is large enough */
2686 if (buflen < recvlen) {
2687 PyBuffer_Release(&pbuf);
2688 PyErr_SetString(PyExc_ValueError,
2689 "buffer too small for requested bytes");
2690 return NULL;
2691 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 /* Call the guts */
2694 readlen = sock_recv_guts(s, buf, recvlen, flags);
2695 if (readlen < 0) {
2696 /* Return an error. */
2697 PyBuffer_Release(&pbuf);
2698 return NULL;
2699 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 PyBuffer_Release(&pbuf);
2702 /* Return the number of bytes read. Note that we do not do anything
2703 special here in the case that readlen < recvlen. */
2704 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002705}
2706
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002707PyDoc_STRVAR(recv_into_doc,
2708"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002709\n\
2710A version of recv() that stores its data into a buffer rather than creating \n\
2711a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2712is not specified (or 0), receive up to the size available in the given buffer.\n\
2713\n\
2714See recv() for documentation about the flags.");
2715
2716
2717/*
Christian Heimes99170a52007-12-19 02:07:34 +00002718 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2719 * into a char buffer. If you have any inc/def ref to do to the objects that
2720 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002721 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002722 * that it is also possible that we return a number of bytes smaller than the
2723 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002724 *
2725 * 'addr' is a return value for the address object. Note that you must decref
2726 * it yourself.
2727 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002728static Py_ssize_t
2729sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 sock_addr_t addrbuf;
2733 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002734 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 if (!getsockaddrlen(s, &addrlen))
2740 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 if (!IS_SELECTABLE(s)) {
2743 select_error();
2744 return -1;
2745 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002746
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002747 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 Py_BEGIN_ALLOW_THREADS
2749 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002750 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002752#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002753 if (len > INT_MAX)
2754 len = INT_MAX;
2755 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 n = recvfrom(s->sock_fd, cbuf, len, flags,
2759 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 }
2762 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 if (timeout == 1) {
2765 PyErr_SetString(socket_timeout, "timed out");
2766 return -1;
2767 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002768 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 if (n < 0) {
2770 s->errorhandler();
2771 return -1;
2772 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2775 addrlen, s->sock_proto)))
2776 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002779}
2780
2781/* s.recvfrom(nbytes [,flags]) method */
2782
2783static PyObject *
2784sock_recvfrom(PySocketSockObject *s, PyObject *args)
2785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 PyObject *buf = NULL;
2787 PyObject *addr = NULL;
2788 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002789 int flags = 0;
2790 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002791
Antoine Pitrou19467d22010-08-17 19:33:30 +00002792 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 if (recvlen < 0) {
2796 PyErr_SetString(PyExc_ValueError,
2797 "negative buffersize in recvfrom");
2798 return NULL;
2799 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2802 if (buf == NULL)
2803 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2806 recvlen, flags, &addr);
2807 if (outlen < 0) {
2808 goto finally;
2809 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 if (outlen != recvlen) {
2812 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002813 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002815 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 goto finally;
2817 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002820
2821finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 Py_XDECREF(buf);
2823 Py_XDECREF(addr);
2824 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002825}
2826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002827PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002828"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2829\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002830Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002831
Thomas Wouters477c8d52006-05-27 19:21:47 +00002832
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002833/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002834
2835static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002836sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002839
Antoine Pitrou19467d22010-08-17 19:33:30 +00002840 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 Py_buffer pbuf;
2842 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002843 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846
Antoine Pitrou19467d22010-08-17 19:33:30 +00002847 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 kwlist, &pbuf,
2849 &recvlen, &flags))
2850 return NULL;
2851 buf = pbuf.buf;
2852 buflen = pbuf.len;
2853 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 if (recvlen < 0) {
2856 PyBuffer_Release(&pbuf);
2857 PyErr_SetString(PyExc_ValueError,
2858 "negative buffersize in recvfrom_into");
2859 return NULL;
2860 }
2861 if (recvlen == 0) {
2862 /* If nbytes was not specified, use the buffer's length */
2863 recvlen = buflen;
2864 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2867 if (readlen < 0) {
2868 PyBuffer_Release(&pbuf);
2869 /* Return an error */
2870 Py_XDECREF(addr);
2871 return NULL;
2872 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 PyBuffer_Release(&pbuf);
2875 /* Return the number of bytes read and the address. Note that we do
2876 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002877 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002878}
2879
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002880PyDoc_STRVAR(recvfrom_into_doc,
2881"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002882\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002883Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884
2885
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002886/* The sendmsg() and recvmsg[_into]() methods require a working
2887 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2888#ifdef CMSG_LEN
2889/*
2890 * Call recvmsg() with the supplied iovec structures, flags, and
2891 * ancillary data buffer size (controllen). Returns the tuple return
2892 * value for recvmsg() or recvmsg_into(), with the first item provided
2893 * by the supplied makeval() function. makeval() will be called with
2894 * the length read and makeval_data as arguments, and must return a
2895 * new reference (which will be decrefed if there is a subsequent
2896 * error). On error, closes any file descriptors received via
2897 * SCM_RIGHTS.
2898 */
2899static PyObject *
2900sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2901 int flags, Py_ssize_t controllen,
2902 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2903{
2904 ssize_t bytes_received = -1;
2905 int timeout;
2906 sock_addr_t addrbuf;
2907 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002908 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002909 PyObject *cmsg_list = NULL, *retval = NULL;
2910 void *controlbuf = NULL;
2911 struct cmsghdr *cmsgh;
2912 size_t cmsgdatalen = 0;
2913 int cmsg_status;
2914
2915 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2916 ignored" when the socket is connected (Linux fills them in
2917 anyway for AF_UNIX sockets at least). Normally msg_namelen
2918 seems to be set to 0 if there's no address, but try to
2919 initialize msg_name to something that won't be mistaken for a
2920 real address if that doesn't happen. */
2921 if (!getsockaddrlen(s, &addrbuflen))
2922 return NULL;
2923 memset(&addrbuf, 0, addrbuflen);
2924 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2925
2926 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2927 PyErr_SetString(PyExc_ValueError,
2928 "invalid ancillary data buffer length");
2929 return NULL;
2930 }
2931 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2932 return PyErr_NoMemory();
2933
2934 /* Make the system call. */
2935 if (!IS_SELECTABLE(s)) {
2936 select_error();
2937 goto finally;
2938 }
2939
2940 BEGIN_SELECT_LOOP(s)
2941 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002942 msg.msg_name = SAS2SA(&addrbuf);
2943 msg.msg_namelen = addrbuflen;
2944 msg.msg_iov = iov;
2945 msg.msg_iovlen = iovlen;
2946 msg.msg_control = controlbuf;
2947 msg.msg_controllen = controllen;
2948 timeout = internal_select_ex(s, 0, interval);
2949 if (!timeout)
2950 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2951 Py_END_ALLOW_THREADS;
2952 if (timeout == 1) {
2953 PyErr_SetString(socket_timeout, "timed out");
2954 goto finally;
2955 }
2956 END_SELECT_LOOP(s)
2957
2958 if (bytes_received < 0) {
2959 s->errorhandler();
2960 goto finally;
2961 }
2962
2963 /* Make list of (level, type, data) tuples from control messages. */
2964 if ((cmsg_list = PyList_New(0)) == NULL)
2965 goto err_closefds;
2966 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2967 implementations didn't do so. */
2968 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2969 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2970 PyObject *bytes, *tuple;
2971 int tmp;
2972
2973 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2974 if (cmsg_status != 0) {
2975 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2976 "received malformed or improperly-truncated "
2977 "ancillary data", 1) == -1)
2978 goto err_closefds;
2979 }
2980 if (cmsg_status < 0)
2981 break;
2982 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002983 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002984 goto err_closefds;
2985 }
2986
2987 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2988 cmsgdatalen);
2989 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2990 (int)cmsgh->cmsg_type, bytes);
2991 if (tuple == NULL)
2992 goto err_closefds;
2993 tmp = PyList_Append(cmsg_list, tuple);
2994 Py_DECREF(tuple);
2995 if (tmp != 0)
2996 goto err_closefds;
2997
2998 if (cmsg_status != 0)
2999 break;
3000 }
3001
3002 retval = Py_BuildValue("NOiN",
3003 (*makeval)(bytes_received, makeval_data),
3004 cmsg_list,
3005 (int)msg.msg_flags,
3006 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3007 ((msg.msg_namelen > addrbuflen) ?
3008 addrbuflen : msg.msg_namelen),
3009 s->sock_proto));
3010 if (retval == NULL)
3011 goto err_closefds;
3012
3013finally:
3014 Py_XDECREF(cmsg_list);
3015 PyMem_Free(controlbuf);
3016 return retval;
3017
3018err_closefds:
3019#ifdef SCM_RIGHTS
3020 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3021 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3022 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3023 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3024 if (cmsg_status < 0)
3025 break;
3026 if (cmsgh->cmsg_level == SOL_SOCKET &&
3027 cmsgh->cmsg_type == SCM_RIGHTS) {
3028 size_t numfds;
3029 int *fdp;
3030
3031 numfds = cmsgdatalen / sizeof(int);
3032 fdp = (int *)CMSG_DATA(cmsgh);
3033 while (numfds-- > 0)
3034 close(*fdp++);
3035 }
3036 if (cmsg_status != 0)
3037 break;
3038 }
3039#endif /* SCM_RIGHTS */
3040 goto finally;
3041}
3042
3043
3044static PyObject *
3045makeval_recvmsg(ssize_t received, void *data)
3046{
3047 PyObject **buf = data;
3048
3049 if (received < PyBytes_GET_SIZE(*buf))
3050 _PyBytes_Resize(buf, received);
3051 Py_XINCREF(*buf);
3052 return *buf;
3053}
3054
3055/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3056
3057static PyObject *
3058sock_recvmsg(PySocketSockObject *s, PyObject *args)
3059{
3060 Py_ssize_t bufsize, ancbufsize = 0;
3061 int flags = 0;
3062 struct iovec iov;
3063 PyObject *buf = NULL, *retval = NULL;
3064
3065 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3066 return NULL;
3067
3068 if (bufsize < 0) {
3069 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3070 return NULL;
3071 }
3072 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3073 return NULL;
3074 iov.iov_base = PyBytes_AS_STRING(buf);
3075 iov.iov_len = bufsize;
3076
3077 /* Note that we're passing a pointer to *our pointer* to the bytes
3078 object here (&buf); makeval_recvmsg() may incref the object, or
3079 deallocate it and set our pointer to NULL. */
3080 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3081 &makeval_recvmsg, &buf);
3082 Py_XDECREF(buf);
3083 return retval;
3084}
3085
3086PyDoc_STRVAR(recvmsg_doc,
3087"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3088\n\
3089Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3090socket. The ancbufsize argument sets the size in bytes of the\n\
3091internal buffer used to receive the ancillary data; it defaults to 0,\n\
3092meaning that no ancillary data will be received. Appropriate buffer\n\
3093sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3094CMSG_LEN(), and items which do not fit into the buffer might be\n\
3095truncated or discarded. The flags argument defaults to 0 and has the\n\
3096same meaning as for recv().\n\
3097\n\
3098The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3099The data item is a bytes object holding the non-ancillary data\n\
3100received. The ancdata item is a list of zero or more tuples\n\
3101(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3102(control messages) received: cmsg_level and cmsg_type are integers\n\
3103specifying the protocol level and protocol-specific type respectively,\n\
3104and cmsg_data is a bytes object holding the associated data. The\n\
3105msg_flags item is the bitwise OR of various flags indicating\n\
3106conditions on the received message; see your system documentation for\n\
3107details. If the receiving socket is unconnected, address is the\n\
3108address of the sending socket, if available; otherwise, its value is\n\
3109unspecified.\n\
3110\n\
3111If recvmsg() raises an exception after the system call returns, it\n\
3112will first attempt to close any file descriptors received via the\n\
3113SCM_RIGHTS mechanism.");
3114
3115
3116static PyObject *
3117makeval_recvmsg_into(ssize_t received, void *data)
3118{
3119 return PyLong_FromSsize_t(received);
3120}
3121
3122/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3123
3124static PyObject *
3125sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3126{
3127 Py_ssize_t ancbufsize = 0;
3128 int flags = 0;
3129 struct iovec *iovs = NULL;
3130 Py_ssize_t i, nitems, nbufs = 0;
3131 Py_buffer *bufs = NULL;
3132 PyObject *buffers_arg, *fast, *retval = NULL;
3133
3134 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3135 &buffers_arg, &ancbufsize, &flags))
3136 return NULL;
3137
3138 if ((fast = PySequence_Fast(buffers_arg,
3139 "recvmsg_into() argument 1 must be an "
3140 "iterable")) == NULL)
3141 return NULL;
3142 nitems = PySequence_Fast_GET_SIZE(fast);
3143 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003144 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003145 goto finally;
3146 }
3147
3148 /* Fill in an iovec for each item, and save the Py_buffer
3149 structs to release afterwards. */
3150 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3151 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3152 PyErr_NoMemory();
3153 goto finally;
3154 }
3155 for (; nbufs < nitems; nbufs++) {
3156 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3157 "w*;recvmsg_into() argument 1 must be an iterable "
3158 "of single-segment read-write buffers",
3159 &bufs[nbufs]))
3160 goto finally;
3161 iovs[nbufs].iov_base = bufs[nbufs].buf;
3162 iovs[nbufs].iov_len = bufs[nbufs].len;
3163 }
3164
3165 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3166 &makeval_recvmsg_into, NULL);
3167finally:
3168 for (i = 0; i < nbufs; i++)
3169 PyBuffer_Release(&bufs[i]);
3170 PyMem_Free(bufs);
3171 PyMem_Free(iovs);
3172 Py_DECREF(fast);
3173 return retval;
3174}
3175
3176PyDoc_STRVAR(recvmsg_into_doc,
3177"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3178\n\
3179Receive normal data and ancillary data from the socket, scattering the\n\
3180non-ancillary data into a series of buffers. The buffers argument\n\
3181must be an iterable of objects that export writable buffers\n\
3182(e.g. bytearray objects); these will be filled with successive chunks\n\
3183of the non-ancillary data until it has all been written or there are\n\
3184no more buffers. The ancbufsize argument sets the size in bytes of\n\
3185the internal buffer used to receive the ancillary data; it defaults to\n\
31860, meaning that no ancillary data will be received. Appropriate\n\
3187buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3188or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3189truncated or discarded. The flags argument defaults to 0 and has the\n\
3190same meaning as for recv().\n\
3191\n\
3192The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3193The nbytes item is the total number of bytes of non-ancillary data\n\
3194written into the buffers. The ancdata item is a list of zero or more\n\
3195tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3196data (control messages) received: cmsg_level and cmsg_type are\n\
3197integers specifying the protocol level and protocol-specific type\n\
3198respectively, and cmsg_data is a bytes object holding the associated\n\
3199data. The msg_flags item is the bitwise OR of various flags\n\
3200indicating conditions on the received message; see your system\n\
3201documentation for details. If the receiving socket is unconnected,\n\
3202address is the address of the sending socket, if available; otherwise,\n\
3203its value is unspecified.\n\
3204\n\
3205If recvmsg_into() raises an exception after the system call returns,\n\
3206it will first attempt to close any file descriptors received via the\n\
3207SCM_RIGHTS mechanism.");
3208#endif /* CMSG_LEN */
3209
3210
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003211/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003212
Guido van Rossum73624e91994-10-10 17:59:00 +00003213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003214sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003217 Py_ssize_t len, n = -1;
3218 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3222 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 if (!IS_SELECTABLE(s)) {
3225 PyBuffer_Release(&pbuf);
3226 return select_error();
3227 }
3228 buf = pbuf.buf;
3229 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003230
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003231 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003233 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003234 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003235#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003236 if (len > INT_MAX)
3237 len = INT_MAX;
3238 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003239#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003241#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003242 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003245 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 PyErr_SetString(socket_timeout, "timed out");
3247 return NULL;
3248 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003249 END_SELECT_LOOP(s)
3250
3251 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 if (n < 0)
3253 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003254 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003255}
3256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003257PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003258"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003259\n\
3260Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003261argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003262sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003263
3264
3265/* s.sendall(data [,flags]) method */
3266
3267static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003268sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003271 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003272 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3276 return NULL;
3277 buf = pbuf.buf;
3278 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 if (!IS_SELECTABLE(s)) {
3281 PyBuffer_Release(&pbuf);
3282 return select_error();
3283 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003286 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 timeout = internal_select(s, 1);
3288 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003289 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003290#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003291 if (len > INT_MAX)
3292 len = INT_MAX;
3293 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003294#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003295 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003296#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003297 }
3298 Py_END_ALLOW_THREADS
3299 if (timeout == 1) {
3300 PyBuffer_Release(&pbuf);
3301 PyErr_SetString(socket_timeout, "timed out");
3302 return NULL;
3303 }
3304 /* PyErr_CheckSignals() might change errno */
3305 saved_errno = errno;
3306 /* We must run our signal handlers before looping again.
3307 send() can return a successful partial write when it is
3308 interrupted, so we can't restrict ourselves to EINTR. */
3309 if (PyErr_CheckSignals()) {
3310 PyBuffer_Release(&pbuf);
3311 return NULL;
3312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003314 /* If interrupted, try again */
3315 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003317 else
3318 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 }
3320 buf += n;
3321 len -= n;
3322 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (n < 0)
3326 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 Py_INCREF(Py_None);
3329 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003330}
3331
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003332PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003333"sendall(data[, flags])\n\
3334\n\
3335Send a data string to the socket. For the optional flags\n\
3336argument, see the Unix manual. This calls send() repeatedly\n\
3337until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003338to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003339
Guido van Rossum30a685f1991-06-27 15:51:29 +00003340
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003341/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003342
Guido van Rossum73624e91994-10-10 17:59:00 +00003343static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003344sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 Py_buffer pbuf;
3347 PyObject *addro;
3348 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003349 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 sock_addr_t addrbuf;
3351 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003354 arglen = PyTuple_Size(args);
3355 switch (arglen) {
3356 case 2:
3357 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3358 break;
3359 case 3:
3360 PyArg_ParseTuple(args, "y*iO:sendto",
3361 &pbuf, &flags, &addro);
3362 break;
3363 default:
3364 PyErr_Format(PyExc_TypeError,
3365 "sendto() takes 2 or 3 arguments (%d given)",
3366 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003367 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003369 if (PyErr_Occurred())
3370 return NULL;
3371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 buf = pbuf.buf;
3373 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 if (!IS_SELECTABLE(s)) {
3376 PyBuffer_Release(&pbuf);
3377 return select_error();
3378 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3381 PyBuffer_Release(&pbuf);
3382 return NULL;
3383 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003384
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003385 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003387 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003388 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003389#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003390 if (len > INT_MAX)
3391 len = INT_MAX;
3392 n = sendto(s->sock_fd, buf, (int)len, flags,
3393 SAS2SA(&addrbuf), addrlen);
3394#else
3395 n = sendto(s->sock_fd, buf, len, flags,
3396 SAS2SA(&addrbuf), addrlen);
3397#endif
3398 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003402 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 PyErr_SetString(socket_timeout, "timed out");
3404 return NULL;
3405 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003406 END_SELECT_LOOP(s)
3407 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 if (n < 0)
3409 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003410 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003411}
3412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003413PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003414"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003415\n\
3416Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003417For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003418
Guido van Rossum30a685f1991-06-27 15:51:29 +00003419
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420/* The sendmsg() and recvmsg[_into]() methods require a working
3421 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3422#ifdef CMSG_LEN
3423/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3424
3425static PyObject *
3426sock_sendmsg(PySocketSockObject *s, PyObject *args)
3427{
3428 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3429 Py_buffer *databufs = NULL;
3430 struct iovec *iovs = NULL;
3431 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003432 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003433 struct cmsginfo {
3434 int level;
3435 int type;
3436 Py_buffer data;
3437 } *cmsgs = NULL;
3438 void *controlbuf = NULL;
3439 size_t controllen, controllen_last;
3440 ssize_t bytes_sent = -1;
3441 int addrlen, timeout, flags = 0;
3442 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3443 *cmsg_fast = NULL, *retval = NULL;
3444
3445 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3446 &data_arg, &cmsg_arg, &flags, &addr_arg))
3447 return NULL;
3448
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003449 /* Parse destination address. */
3450 if (addr_arg != NULL && addr_arg != Py_None) {
3451 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3452 goto finally;
3453 msg.msg_name = &addrbuf;
3454 msg.msg_namelen = addrlen;
3455 }
3456
3457 /* Fill in an iovec for each message part, and save the Py_buffer
3458 structs to release afterwards. */
3459 if ((data_fast = PySequence_Fast(data_arg,
3460 "sendmsg() argument 1 must be an "
3461 "iterable")) == NULL)
3462 goto finally;
3463 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3464 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003465 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003466 goto finally;
3467 }
3468 msg.msg_iovlen = ndataparts;
3469 if (ndataparts > 0 &&
3470 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3471 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3472 PyErr_NoMemory();
3473 goto finally;
3474 }
3475 for (; ndatabufs < ndataparts; ndatabufs++) {
3476 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3477 "y*;sendmsg() argument 1 must be an iterable of "
3478 "buffer-compatible objects",
3479 &databufs[ndatabufs]))
3480 goto finally;
3481 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3482 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3483 }
3484
3485 if (cmsg_arg == NULL)
3486 ncmsgs = 0;
3487 else {
3488 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3489 "sendmsg() argument 2 must be an "
3490 "iterable")) == NULL)
3491 goto finally;
3492 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3493 }
3494
3495#ifndef CMSG_SPACE
3496 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003497 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003498 "sending multiple control messages is not supported "
3499 "on this system");
3500 goto finally;
3501 }
3502#endif
3503 /* Save level, type and Py_buffer for each control message,
3504 and calculate total size. */
3505 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3506 PyErr_NoMemory();
3507 goto finally;
3508 }
3509 controllen = controllen_last = 0;
3510 while (ncmsgbufs < ncmsgs) {
3511 size_t bufsize, space;
3512
3513 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3514 "(iiy*):[sendmsg() ancillary data items]",
3515 &cmsgs[ncmsgbufs].level,
3516 &cmsgs[ncmsgbufs].type,
3517 &cmsgs[ncmsgbufs].data))
3518 goto finally;
3519 bufsize = cmsgs[ncmsgbufs++].data.len;
3520
3521#ifdef CMSG_SPACE
3522 if (!get_CMSG_SPACE(bufsize, &space)) {
3523#else
3524 if (!get_CMSG_LEN(bufsize, &space)) {
3525#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003526 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003527 goto finally;
3528 }
3529 controllen += space;
3530 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003531 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003532 goto finally;
3533 }
3534 controllen_last = controllen;
3535 }
3536
3537 /* Construct ancillary data block from control message info. */
3538 if (ncmsgbufs > 0) {
3539 struct cmsghdr *cmsgh = NULL;
3540
3541 if ((msg.msg_control = controlbuf =
3542 PyMem_Malloc(controllen)) == NULL) {
3543 PyErr_NoMemory();
3544 goto finally;
3545 }
3546 msg.msg_controllen = controllen;
3547
3548 /* Need to zero out the buffer as a workaround for glibc's
3549 CMSG_NXTHDR() implementation. After getting the pointer to
3550 the next header, it checks its (uninitialized) cmsg_len
3551 member to see if the "message" fits in the buffer, and
3552 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003553 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003554 memset(controlbuf, 0, controllen);
3555
3556 for (i = 0; i < ncmsgbufs; i++) {
3557 size_t msg_len, data_len = cmsgs[i].data.len;
3558 int enough_space = 0;
3559
3560 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3561 if (cmsgh == NULL) {
3562 PyErr_Format(PyExc_RuntimeError,
3563 "unexpected NULL result from %s()",
3564 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3565 goto finally;
3566 }
3567 if (!get_CMSG_LEN(data_len, &msg_len)) {
3568 PyErr_SetString(PyExc_RuntimeError,
3569 "item size out of range for CMSG_LEN()");
3570 goto finally;
3571 }
3572 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3573 size_t space;
3574
3575 cmsgh->cmsg_len = msg_len;
3576 if (get_cmsg_data_space(&msg, cmsgh, &space))
3577 enough_space = (space >= data_len);
3578 }
3579 if (!enough_space) {
3580 PyErr_SetString(PyExc_RuntimeError,
3581 "ancillary data does not fit in calculated "
3582 "space");
3583 goto finally;
3584 }
3585 cmsgh->cmsg_level = cmsgs[i].level;
3586 cmsgh->cmsg_type = cmsgs[i].type;
3587 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3588 }
3589 }
3590
3591 /* Make the system call. */
3592 if (!IS_SELECTABLE(s)) {
3593 select_error();
3594 goto finally;
3595 }
3596
3597 BEGIN_SELECT_LOOP(s)
3598 Py_BEGIN_ALLOW_THREADS;
3599 timeout = internal_select_ex(s, 1, interval);
3600 if (!timeout)
3601 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3602 Py_END_ALLOW_THREADS;
3603 if (timeout == 1) {
3604 PyErr_SetString(socket_timeout, "timed out");
3605 goto finally;
3606 }
3607 END_SELECT_LOOP(s)
3608
3609 if (bytes_sent < 0) {
3610 s->errorhandler();
3611 goto finally;
3612 }
3613 retval = PyLong_FromSsize_t(bytes_sent);
3614
3615finally:
3616 PyMem_Free(controlbuf);
3617 for (i = 0; i < ncmsgbufs; i++)
3618 PyBuffer_Release(&cmsgs[i].data);
3619 PyMem_Free(cmsgs);
3620 Py_XDECREF(cmsg_fast);
3621 for (i = 0; i < ndatabufs; i++)
3622 PyBuffer_Release(&databufs[i]);
3623 PyMem_Free(databufs);
3624 PyMem_Free(iovs);
3625 Py_XDECREF(data_fast);
3626 return retval;
3627}
3628
3629PyDoc_STRVAR(sendmsg_doc,
3630"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3631\n\
3632Send normal and ancillary data to the socket, gathering the\n\
3633non-ancillary data from a series of buffers and concatenating it into\n\
3634a single message. The buffers argument specifies the non-ancillary\n\
3635data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3636The ancdata argument specifies the ancillary data (control messages)\n\
3637as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3638cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3639protocol level and protocol-specific type respectively, and cmsg_data\n\
3640is a buffer-compatible object holding the associated data. The flags\n\
3641argument defaults to 0 and has the same meaning as for send(). If\n\
3642address is supplied and not None, it sets a destination address for\n\
3643the message. The return value is the number of bytes of non-ancillary\n\
3644data sent.");
3645#endif /* CMSG_LEN */
3646
3647
Guido van Rossum30a685f1991-06-27 15:51:29 +00003648/* s.shutdown(how) method */
3649
Guido van Rossum73624e91994-10-10 17:59:00 +00003650static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003651sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 int how;
3654 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003655
Serhiy Storchaka78980432013-01-15 01:12:17 +02003656 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 if (how == -1 && PyErr_Occurred())
3658 return NULL;
3659 Py_BEGIN_ALLOW_THREADS
3660 res = shutdown(s->sock_fd, how);
3661 Py_END_ALLOW_THREADS
3662 if (res < 0)
3663 return s->errorhandler();
3664 Py_INCREF(Py_None);
3665 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003666}
3667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003668PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003669"shutdown(flag)\n\
3670\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003671Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3672of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003673
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003674#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003675static PyObject*
3676sock_ioctl(PySocketSockObject *s, PyObject *arg)
3677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 unsigned long cmd = SIO_RCVALL;
3679 PyObject *argO;
3680 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3683 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 switch (cmd) {
3686 case SIO_RCVALL: {
3687 unsigned int option = RCVALL_ON;
3688 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3689 return NULL;
3690 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3691 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3692 return set_error();
3693 }
3694 return PyLong_FromUnsignedLong(recv); }
3695 case SIO_KEEPALIVE_VALS: {
3696 struct tcp_keepalive ka;
3697 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3698 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3699 return NULL;
3700 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3701 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3702 return set_error();
3703 }
3704 return PyLong_FromUnsignedLong(recv); }
3705 default:
3706 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3707 return NULL;
3708 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003709}
3710PyDoc_STRVAR(sock_ioctl_doc,
3711"ioctl(cmd, option) -> long\n\
3712\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003713Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3714SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3715SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003716#endif
3717
3718#if defined(MS_WINDOWS)
3719static PyObject*
3720sock_share(PySocketSockObject *s, PyObject *arg)
3721{
3722 WSAPROTOCOL_INFO info;
3723 DWORD processId;
3724 int result;
3725
3726 if (!PyArg_ParseTuple(arg, "I", &processId))
3727 return NULL;
3728
3729 Py_BEGIN_ALLOW_THREADS
3730 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3731 Py_END_ALLOW_THREADS
3732 if (result == SOCKET_ERROR)
3733 return set_error();
3734 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3735}
3736PyDoc_STRVAR(sock_share_doc,
3737"share(process_id) -> bytes\n\
3738\n\
3739Share the socket with another process. The target process id\n\
3740must be provided and the resulting bytes object passed to the target\n\
3741process. There the shared socket can be instantiated by calling\n\
3742socket.fromshare().");
3743
Christian Heimesfaf2f632008-01-06 16:59:19 +00003744
3745#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003746
3747/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003748
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003749static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3751 accept_doc},
3752 {"bind", (PyCFunction)sock_bind, METH_O,
3753 bind_doc},
3754 {"close", (PyCFunction)sock_close, METH_NOARGS,
3755 close_doc},
3756 {"connect", (PyCFunction)sock_connect, METH_O,
3757 connect_doc},
3758 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3759 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003760 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3761 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3763 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003764#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 {"getpeername", (PyCFunction)sock_getpeername,
3766 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 {"getsockname", (PyCFunction)sock_getsockname,
3769 METH_NOARGS, getsockname_doc},
3770 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3771 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003772#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3774 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003775#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003776#if defined(MS_WINDOWS)
3777 {"share", (PyCFunction)sock_share, METH_VARARGS,
3778 sock_share_doc},
3779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003780 {"listen", (PyCFunction)sock_listen, METH_O,
3781 listen_doc},
3782 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3783 recv_doc},
3784 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3785 recv_into_doc},
3786 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3787 recvfrom_doc},
3788 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3789 recvfrom_into_doc},
3790 {"send", (PyCFunction)sock_send, METH_VARARGS,
3791 send_doc},
3792 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3793 sendall_doc},
3794 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3795 sendto_doc},
3796 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3797 setblocking_doc},
3798 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3799 settimeout_doc},
3800 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3801 gettimeout_doc},
3802 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3803 setsockopt_doc},
3804 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3805 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806#ifdef CMSG_LEN
3807 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3808 recvmsg_doc},
3809 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3810 recvmsg_into_doc,},
3811 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3812 sendmsg_doc},
3813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003815};
3816
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003817/* SockObject members */
3818static PyMemberDef sock_memberlist[] = {
3819 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3820 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3821 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3822 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3823 {0},
3824};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003825
Guido van Rossum73624e91994-10-10 17:59:00 +00003826/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003827 First close the file description. */
3828
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003829static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003830sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003831{
Antoine Pitroue033e062010-10-29 10:38:18 +00003832 if (s->sock_fd != -1) {
3833 PyObject *exc, *val, *tb;
3834 Py_ssize_t old_refcount = Py_REFCNT(s);
3835 ++Py_REFCNT(s);
3836 PyErr_Fetch(&exc, &val, &tb);
3837 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3838 "unclosed %R", s))
3839 /* Spurious errors can appear at shutdown */
3840 if (PyErr_ExceptionMatches(PyExc_Warning))
3841 PyErr_WriteUnraisable((PyObject *) s);
3842 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003844 Py_REFCNT(s) = old_refcount;
3845 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003847}
3848
Guido van Rossum30a685f1991-06-27 15:51:29 +00003849
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003851sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003852{
Fred Drakea04eaad2000-06-30 02:46:07 +00003853#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 if (s->sock_fd > LONG_MAX) {
3855 /* this can occur on Win64, and actually there is a special
3856 ugly printf formatter for decimal pointer length integer
3857 printing, only bother if necessary*/
3858 PyErr_SetString(PyExc_OverflowError,
3859 "no printf formatter to display "
3860 "the socket descriptor in decimal");
3861 return NULL;
3862 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 return PyUnicode_FromFormat(
3865 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3866 (long)s->sock_fd, s->sock_family,
3867 s->sock_type,
3868 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003869}
3870
3871
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003872/* Create a new, uninitialized socket object. */
3873
3874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003875sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 new = type->tp_alloc(type, 0);
3880 if (new != NULL) {
3881 ((PySocketSockObject *)new)->sock_fd = -1;
3882 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3883 ((PySocketSockObject *)new)->errorhandler = &set_error;
3884 }
3885 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003886}
3887
3888
3889/* Initialize a new socket object. */
3890
Victor Stinnerdaf45552013-08-28 00:53:59 +02003891#ifdef SOCK_CLOEXEC
3892/* socket() and socketpair() fail with EINVAL on Linux kernel older
3893 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3894static int sock_cloexec_works = -1;
3895#endif
3896
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003897/*ARGSUSED*/
3898static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003899sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003901 PySocketSockObject *s = (PySocketSockObject *)self;
3902 PyObject *fdobj = NULL;
3903 SOCKET_T fd = INVALID_SOCKET;
3904 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3905 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003906#ifndef MS_WINDOWS
3907#ifdef SOCK_CLOEXEC
3908 int *atomic_flag_works = &sock_cloexec_works;
3909#else
3910 int *atomic_flag_works = NULL;
3911#endif
3912#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3915 "|iiiO:socket", keywords,
3916 &family, &type, &proto, &fdobj))
3917 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003919 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003920#ifdef MS_WINDOWS
3921 /* recreate a socket that was duplicated */
3922 if (PyBytes_Check(fdobj)) {
3923 WSAPROTOCOL_INFO info;
3924 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3925 PyErr_Format(PyExc_ValueError,
3926 "socket descriptor string has wrong size, "
3927 "should be %zu bytes.", sizeof(info));
3928 return -1;
3929 }
3930 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3931 Py_BEGIN_ALLOW_THREADS
3932 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3933 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3934 Py_END_ALLOW_THREADS
3935 if (fd == INVALID_SOCKET) {
3936 set_error();
3937 return -1;
3938 }
3939 family = info.iAddressFamily;
3940 type = info.iSocketType;
3941 proto = info.iProtocol;
3942 }
3943 else
3944#endif
3945 {
3946 fd = PyLong_AsSocket_t(fdobj);
3947 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3948 return -1;
3949 if (fd == INVALID_SOCKET) {
3950 PyErr_SetString(PyExc_ValueError,
3951 "can't use invalid socket value");
3952 return -1;
3953 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 }
3955 }
3956 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02003957#ifdef MS_WINDOWS
3958 /* Windows implementation */
3959#ifndef WSA_FLAG_NO_HANDLE_INHERIT
3960#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
3961#endif
3962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02003964 if (support_wsa_no_inherit) {
3965 fd = WSASocket(family, type, proto,
3966 NULL, 0,
3967 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
3968 if (fd == INVALID_SOCKET) {
3969 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
3970 support_wsa_no_inherit = 0;
3971 fd = socket(family, type, proto);
3972 }
3973 }
3974 else {
3975 fd = socket(family, type, proto);
3976 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 if (fd == INVALID_SOCKET) {
3980 set_error();
3981 return -1;
3982 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02003983
3984 if (!support_wsa_no_inherit) {
3985 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
3986 closesocket(fd);
3987 PyErr_SetFromWindowsErr(0);
3988 return -1;
3989 }
3990 }
3991#else
3992 /* UNIX */
3993 Py_BEGIN_ALLOW_THREADS
3994#ifdef SOCK_CLOEXEC
3995 if (sock_cloexec_works != 0) {
3996 fd = socket(family, type | SOCK_CLOEXEC, proto);
3997 if (sock_cloexec_works == -1) {
3998 if (fd >= 0) {
3999 sock_cloexec_works = 1;
4000 }
4001 else if (errno == EINVAL) {
4002 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4003 sock_cloexec_works = 0;
4004 fd = socket(family, type, proto);
4005 }
4006 }
4007 }
4008 else
4009#endif
4010 {
4011 fd = socket(family, type, proto);
4012 }
4013 Py_END_ALLOW_THREADS
4014
4015 if (fd == INVALID_SOCKET) {
4016 set_error();
4017 return -1;
4018 }
4019
4020 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4021 SOCKETCLOSE(fd);
4022 return -1;
4023 }
4024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 }
4026 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004029
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004030}
4031
4032
Guido van Rossumb6775db1994-08-01 11:34:53 +00004033/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004034
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004035static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4037 "_socket.socket", /* tp_name */
4038 sizeof(PySocketSockObject), /* tp_basicsize */
4039 0, /* tp_itemsize */
4040 (destructor)sock_dealloc, /* tp_dealloc */
4041 0, /* tp_print */
4042 0, /* tp_getattr */
4043 0, /* tp_setattr */
4044 0, /* tp_reserved */
4045 (reprfunc)sock_repr, /* tp_repr */
4046 0, /* tp_as_number */
4047 0, /* tp_as_sequence */
4048 0, /* tp_as_mapping */
4049 0, /* tp_hash */
4050 0, /* tp_call */
4051 0, /* tp_str */
4052 PyObject_GenericGetAttr, /* tp_getattro */
4053 0, /* tp_setattro */
4054 0, /* tp_as_buffer */
4055 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4056 sock_doc, /* tp_doc */
4057 0, /* tp_traverse */
4058 0, /* tp_clear */
4059 0, /* tp_richcompare */
4060 0, /* tp_weaklistoffset */
4061 0, /* tp_iter */
4062 0, /* tp_iternext */
4063 sock_methods, /* tp_methods */
4064 sock_memberlist, /* tp_members */
4065 0, /* tp_getset */
4066 0, /* tp_base */
4067 0, /* tp_dict */
4068 0, /* tp_descr_get */
4069 0, /* tp_descr_set */
4070 0, /* tp_dictoffset */
4071 sock_initobj, /* tp_init */
4072 PyType_GenericAlloc, /* tp_alloc */
4073 sock_new, /* tp_new */
4074 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004075};
4076
Guido van Rossum30a685f1991-06-27 15:51:29 +00004077
Guido van Rossum81194471991-07-27 21:42:02 +00004078/* Python interface to gethostname(). */
4079
4080/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004081static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004082socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004083{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004084#ifdef MS_WINDOWS
4085 /* Don't use winsock's gethostname, as this returns the ANSI
4086 version of the hostname, whereas we need a Unicode string.
4087 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004088 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004089 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004090 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004091 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004092
4093 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004094 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004095
4096 if (GetLastError() != ERROR_MORE_DATA)
4097 return PyErr_SetFromWindowsErr(0);
4098
4099 if (size == 0)
4100 return PyUnicode_New(0, 0);
4101
4102 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4103 names */
4104 name = PyMem_Malloc(size * sizeof(wchar_t));
4105 if (!name)
4106 return NULL;
4107 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4108 name,
4109 &size))
4110 {
4111 PyMem_Free(name);
4112 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004113 }
Victor Stinner74168972011-11-17 01:11:36 +01004114
4115 result = PyUnicode_FromWideChar(name, size);
4116 PyMem_Free(name);
4117 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 char buf[1024];
4120 int res;
4121 Py_BEGIN_ALLOW_THREADS
4122 res = gethostname(buf, (int) sizeof buf - 1);
4123 Py_END_ALLOW_THREADS
4124 if (res < 0)
4125 return set_error();
4126 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004127 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004128#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004129}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004130
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004131PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004132"gethostname() -> string\n\
4133\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004134Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004135
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004136#ifdef HAVE_SETHOSTNAME
4137PyDoc_STRVAR(sethostname_doc,
4138"sethostname(name)\n\n\
4139Sets the hostname to name.");
4140
4141static PyObject *
4142socket_sethostname(PyObject *self, PyObject *args)
4143{
4144 PyObject *hnobj;
4145 Py_buffer buf;
4146 int res, flag = 0;
4147
Christian Heimesd2774c72013-06-19 02:06:29 +02004148#ifdef _AIX
4149/* issue #18259, not declared in any useful header file */
4150extern int sethostname(const char *, size_t);
4151#endif
4152
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004153 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4154 PyErr_Clear();
4155 if (!PyArg_ParseTuple(args, "O&:sethostname",
4156 PyUnicode_FSConverter, &hnobj))
4157 return NULL;
4158 flag = 1;
4159 }
4160 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4161 if (!res) {
4162 res = sethostname(buf.buf, buf.len);
4163 PyBuffer_Release(&buf);
4164 }
4165 if (flag)
4166 Py_DECREF(hnobj);
4167 if (res)
4168 return set_error();
4169 Py_RETURN_NONE;
4170}
4171#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004172
Guido van Rossum30a685f1991-06-27 15:51:29 +00004173/* Python interface to gethostbyname(name). */
4174
4175/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004176static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004177socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 char *name;
4180 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004181 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004182
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004183 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 return NULL;
4185 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004186 goto finally;
4187 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4188finally:
4189 PyMem_Free(name);
4190 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004191}
4192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004193PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004194"gethostbyname(host) -> address\n\
4195\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004196Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004197
4198
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004199/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4200
4201static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004202gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 char **pch;
4205 PyObject *rtn_tuple = (PyObject *)NULL;
4206 PyObject *name_list = (PyObject *)NULL;
4207 PyObject *addr_list = (PyObject *)NULL;
4208 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 if (h == NULL) {
4211 /* Let's get real error message to return */
4212 set_herror(h_errno);
4213 return NULL;
4214 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004216 if (h->h_addrtype != af) {
4217 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004218 errno = EAFNOSUPPORT;
4219 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 return NULL;
4221 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 case AF_INET:
4226 if (alen < sizeof(struct sockaddr_in))
4227 return NULL;
4228 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004229
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004230#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004231 case AF_INET6:
4232 if (alen < sizeof(struct sockaddr_in6))
4233 return NULL;
4234 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004235#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 if ((name_list = PyList_New(0)) == NULL)
4240 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004242 if ((addr_list = PyList_New(0)) == NULL)
4243 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 /* SF #1511317: h_aliases can be NULL */
4246 if (h->h_aliases) {
4247 for (pch = h->h_aliases; *pch != NULL; pch++) {
4248 int status;
4249 tmp = PyUnicode_FromString(*pch);
4250 if (tmp == NULL)
4251 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 status = PyList_Append(name_list, tmp);
4254 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 if (status)
4257 goto err;
4258 }
4259 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4262 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 case AF_INET:
4267 {
4268 struct sockaddr_in sin;
4269 memset(&sin, 0, sizeof(sin));
4270 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4275 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 if (pch == h->h_addr_list && alen >= sizeof(sin))
4278 memcpy((char *) addr, &sin, sizeof(sin));
4279 break;
4280 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004281
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004282#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 case AF_INET6:
4284 {
4285 struct sockaddr_in6 sin6;
4286 memset(&sin6, 0, sizeof(sin6));
4287 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004288#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4292 tmp = makeipaddr((struct sockaddr *)&sin6,
4293 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4296 memcpy((char *) addr, &sin6, sizeof(sin6));
4297 break;
4298 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004299#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004302 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 "unsupported address family");
4304 return NULL;
4305 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004307 if (tmp == NULL)
4308 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004310 status = PyList_Append(addr_list, tmp);
4311 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 if (status)
4314 goto err;
4315 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004318
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004319 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 Py_XDECREF(name_list);
4321 Py_XDECREF(addr_list);
4322 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004323}
4324
4325
4326/* Python interface to gethostbyname_ex(name). */
4327
4328/*ARGSUSED*/
4329static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004330socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 char *name;
4333 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004334 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004336 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004337#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004338 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004339#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004340 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004341#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 char buf[16384];
4343 int buf_len = (sizeof buf) - 1;
4344 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004345#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004346#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004348#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004349#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004350
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004351 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004353 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004354 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004356#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004357#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004358 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004360#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004362#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 memset((void *) &data, '\0', sizeof(data));
4364 result = gethostbyname_r(name, &hp_allocated, &data);
4365 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004366#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004367#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004368#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004372#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 Py_END_ALLOW_THREADS
4374 /* Some C libraries would require addr.__ss_family instead of
4375 addr.ss_family.
4376 Therefore, we cast the sockaddr_storage into sockaddr to
4377 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004378 sa = SAS2SA(&addr);
4379 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004381#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004383#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004384finally:
4385 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004387}
4388
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004389PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004390"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4391\n\
4392Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004393for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004394
4395
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004396/* Python interface to gethostbyaddr(IP). */
4397
4398/*ARGSUSED*/
4399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004400socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004401{
Charles-François Natali8b759652011-12-23 16:44:51 +01004402 sock_addr_t addr;
4403 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 char *ip_num;
4405 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004406 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004407#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004409#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004411#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 /* glibcs up to 2.10 assume that the buf argument to
4413 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4414 does not ensure. The attribute below instructs the compiler
4415 to maintain this alignment. */
4416 char buf[16384] Py_ALIGNED(8);
4417 int buf_len = (sizeof buf) - 1;
4418 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004419#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004420#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004422#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004423#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 char *ap;
4425 int al;
4426 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004427
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004428 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 return NULL;
4430 af = AF_UNSPEC;
4431 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004432 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 af = sa->sa_family;
4434 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004435 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 switch (af) {
4437 case AF_INET:
4438 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4439 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4440 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004441#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 case AF_INET6:
4443 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4444 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4445 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004448 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004449 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 }
4451 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004452#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004453#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004454 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 &hp_allocated, buf, buf_len,
4456 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004457#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 h = gethostbyaddr_r(ap, al, af,
4459 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004460#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 memset((void *) &data, '\0', sizeof(data));
4462 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4463 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004464#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004465#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004466#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004470#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004472 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004473#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004475#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004476finally:
4477 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004479}
4480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004481PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004482"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4483\n\
4484Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004485for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004486
Guido van Rossum30a685f1991-06-27 15:51:29 +00004487
4488/* Python interface to getservbyname(name).
4489 This only returns the port number, since the other info is already
4490 known or not useful (like the list of aliases). */
4491
4492/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004493static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004494socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 char *name, *proto=NULL;
4497 struct servent *sp;
4498 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4499 return NULL;
4500 Py_BEGIN_ALLOW_THREADS
4501 sp = getservbyname(name, proto);
4502 Py_END_ALLOW_THREADS
4503 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004504 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 return NULL;
4506 }
4507 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004508}
4509
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004510PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004511"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004512\n\
4513Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004514The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4515otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004516
Guido van Rossum30a685f1991-06-27 15:51:29 +00004517
Barry Warsaw11b91a02004-06-28 00:50:43 +00004518/* Python interface to getservbyport(port).
4519 This only returns the service name, since the other info is already
4520 known or not useful (like the list of aliases). */
4521
4522/*ARGSUSED*/
4523static PyObject *
4524socket_getservbyport(PyObject *self, PyObject *args)
4525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 int port;
4527 char *proto=NULL;
4528 struct servent *sp;
4529 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4530 return NULL;
4531 if (port < 0 || port > 0xffff) {
4532 PyErr_SetString(
4533 PyExc_OverflowError,
4534 "getservbyport: port must be 0-65535.");
4535 return NULL;
4536 }
4537 Py_BEGIN_ALLOW_THREADS
4538 sp = getservbyport(htons((short)port), proto);
4539 Py_END_ALLOW_THREADS
4540 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004541 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 return NULL;
4543 }
4544 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004545}
4546
4547PyDoc_STRVAR(getservbyport_doc,
4548"getservbyport(port[, protocolname]) -> string\n\
4549\n\
4550Return the service name from a port number and protocol name.\n\
4551The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4552otherwise any protocol will match.");
4553
Guido van Rossum3901d851996-12-19 16:35:04 +00004554/* Python interface to getprotobyname(name).
4555 This only returns the protocol number, since the other info is
4556 already known or not useful (like the list of aliases). */
4557
4558/*ARGSUSED*/
4559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004560socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 char *name;
4563 struct protoent *sp;
4564 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4565 return NULL;
4566 Py_BEGIN_ALLOW_THREADS
4567 sp = getprotobyname(name);
4568 Py_END_ALLOW_THREADS
4569 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004570 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 return NULL;
4572 }
4573 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004574}
4575
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004576PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004577"getprotobyname(name) -> integer\n\
4578\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004579Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004580
Guido van Rossum3901d851996-12-19 16:35:04 +00004581
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004582#ifndef NO_DUP
4583/* dup() function for socket fds */
4584
4585static PyObject *
4586socket_dup(PyObject *self, PyObject *fdobj)
4587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 SOCKET_T fd, newfd;
4589 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004590#ifdef MS_WINDOWS
4591 WSAPROTOCOL_INFO info;
4592#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 fd = PyLong_AsSocket_t(fdobj);
4595 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4596 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004597
Victor Stinnerdaf45552013-08-28 00:53:59 +02004598#ifdef MS_WINDOWS
4599 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4600 return set_error();
4601
4602 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4603 FROM_PROTOCOL_INFO,
4604 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 if (newfd == INVALID_SOCKET)
4606 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004607
Victor Stinnerdaf45552013-08-28 00:53:59 +02004608 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4609 closesocket(newfd);
4610 PyErr_SetFromWindowsErr(0);
4611 return NULL;
4612 }
4613#else
4614 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4615 newfd = _Py_dup(fd);
4616 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004617 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004618#endif
4619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 newfdobj = PyLong_FromSocket_t(newfd);
4621 if (newfdobj == NULL)
4622 SOCKETCLOSE(newfd);
4623 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004624}
4625
4626PyDoc_STRVAR(dup_doc,
4627"dup(integer) -> integer\n\
4628\n\
4629Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4630sockets; on some platforms os.dup() won't work for socket file descriptors.");
4631#endif
4632
4633
Dave Cole331708b2004-08-09 04:51:41 +00004634#ifdef HAVE_SOCKETPAIR
4635/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004636 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004637 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004638
4639/*ARGSUSED*/
4640static PyObject *
4641socket_socketpair(PyObject *self, PyObject *args)
4642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 PySocketSockObject *s0 = NULL, *s1 = NULL;
4644 SOCKET_T sv[2];
4645 int family, type = SOCK_STREAM, proto = 0;
4646 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004647#ifdef SOCK_CLOEXEC
4648 int *atomic_flag_works = &sock_cloexec_works;
4649#else
4650 int *atomic_flag_works = NULL;
4651#endif
4652 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004653
4654#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004656#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4660 &family, &type, &proto))
4661 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004664 Py_BEGIN_ALLOW_THREADS
4665#ifdef SOCK_CLOEXEC
4666 if (sock_cloexec_works != 0) {
4667 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4668 if (sock_cloexec_works == -1) {
4669 if (ret >= 0) {
4670 sock_cloexec_works = 1;
4671 }
4672 else if (errno == EINVAL) {
4673 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4674 sock_cloexec_works = 0;
4675 ret = socketpair(family, type, proto, sv);
4676 }
4677 }
4678 }
4679 else
4680#endif
4681 {
4682 ret = socketpair(family, type, proto, sv);
4683 }
4684 Py_END_ALLOW_THREADS
4685
4686 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004688
4689 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4690 goto finally;
4691 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4692 goto finally;
4693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 s0 = new_sockobject(sv[0], family, type, proto);
4695 if (s0 == NULL)
4696 goto finally;
4697 s1 = new_sockobject(sv[1], family, type, proto);
4698 if (s1 == NULL)
4699 goto finally;
4700 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004701
4702finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 if (res == NULL) {
4704 if (s0 == NULL)
4705 SOCKETCLOSE(sv[0]);
4706 if (s1 == NULL)
4707 SOCKETCLOSE(sv[1]);
4708 }
4709 Py_XDECREF(s0);
4710 Py_XDECREF(s1);
4711 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004712}
4713
4714PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004715"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004716\n\
4717Create a pair of socket objects from the sockets returned by the platform\n\
4718socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004719The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004720AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004721
4722#endif /* HAVE_SOCKETPAIR */
4723
4724
Guido van Rossum006bf911996-06-12 04:04:55 +00004725static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004726socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4731 return NULL;
4732 }
4733 if (x1 < 0) {
4734 PyErr_SetString(PyExc_OverflowError,
4735 "can't convert negative number to unsigned long");
4736 return NULL;
4737 }
4738 x2 = (unsigned int)ntohs((unsigned short)x1);
4739 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004740}
4741
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004742PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004743"ntohs(integer) -> integer\n\
4744\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004745Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004746
4747
Guido van Rossum006bf911996-06-12 04:04:55 +00004748static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004749socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 if (PyLong_Check(arg)) {
4754 x = PyLong_AsUnsignedLong(arg);
4755 if (x == (unsigned long) -1 && PyErr_Occurred())
4756 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004757#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 {
4759 unsigned long y;
4760 /* only want the trailing 32 bits */
4761 y = x & 0xFFFFFFFFUL;
4762 if (y ^ x)
4763 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004764 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 x = y;
4766 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 }
4769 else
4770 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004771 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004774}
4775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004776PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004777"ntohl(integer) -> integer\n\
4778\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004779Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004780
4781
Guido van Rossum006bf911996-06-12 04:04:55 +00004782static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004783socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4788 return NULL;
4789 }
4790 if (x1 < 0) {
4791 PyErr_SetString(PyExc_OverflowError,
4792 "can't convert negative number to unsigned long");
4793 return NULL;
4794 }
4795 x2 = (unsigned int)htons((unsigned short)x1);
4796 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004797}
4798
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004799PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004800"htons(integer) -> integer\n\
4801\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004802Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004803
4804
Guido van Rossum006bf911996-06-12 04:04:55 +00004805static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004806socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 if (PyLong_Check(arg)) {
4811 x = PyLong_AsUnsignedLong(arg);
4812 if (x == (unsigned long) -1 && PyErr_Occurred())
4813 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004814#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 {
4816 unsigned long y;
4817 /* only want the trailing 32 bits */
4818 y = x & 0xFFFFFFFFUL;
4819 if (y ^ x)
4820 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004821 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 x = y;
4823 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 }
4826 else
4827 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004828 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004829 Py_TYPE(arg)->tp_name);
4830 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004831}
4832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004833PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004834"htonl(integer) -> integer\n\
4835\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004836Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004837
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004838/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004840PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004841"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004842\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004843Convert 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 +00004844binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004845
4846static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004847socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004848{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004849#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004851#endif
4852
4853#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004854#if (SIZEOF_INT != 4)
4855#error "Not sure if in_addr_t exists and int is not 32-bits."
4856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 /* Have to use inet_addr() instead */
4858 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4863 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004864
Tim Peters1df9fdd2003-02-13 03:13:40 +00004865
4866#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004867
4868#ifdef USE_INET_ATON_WEAKLINK
4869 if (inet_aton != NULL) {
4870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 if (inet_aton(ip_addr, &buf))
4872 return PyBytes_FromStringAndSize((char *)(&buf),
4873 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004874
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004875 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 "illegal IP address string passed to inet_aton");
4877 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004878
Thomas Wouters477c8d52006-05-27 19:21:47 +00004879#ifdef USE_INET_ATON_WEAKLINK
4880 } else {
4881#endif
4882
4883#endif
4884
4885#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 /* special-case this address as inet_addr might return INADDR_NONE
4888 * for this */
4889 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004890 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004893 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004896 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 "illegal IP address string passed to inet_aton");
4898 return NULL;
4899 }
4900 }
4901 return PyBytes_FromStringAndSize((char *) &packed_addr,
4902 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004903
4904#ifdef USE_INET_ATON_WEAKLINK
4905 }
4906#endif
4907
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004908#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004909}
4910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004911PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004912"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004914Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004915
4916static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004917socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 char *packed_str;
4920 int addr_len;
4921 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4924 return NULL;
4925 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004928 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 "packed IP wrong length for inet_ntoa");
4930 return NULL;
4931 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004936}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004937
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004938#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004939
4940PyDoc_STRVAR(inet_pton_doc,
4941"inet_pton(af, ip) -> packed IP address string\n\
4942\n\
4943Convert an IP address from string format to a packed string suitable\n\
4944for use with low-level network functions.");
4945
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004946#endif
4947
4948#ifdef HAVE_INET_PTON
4949
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004950static PyObject *
4951socket_inet_pton(PyObject *self, PyObject *args)
4952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 int af;
4954 char* ip;
4955 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004956#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02004957 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004958#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4962 return NULL;
4963 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004964
Martin v. Löwis04697e82004-06-02 12:35:29 +00004965#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004967 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 "can't use AF_INET6, IPv6 is disabled");
4969 return NULL;
4970 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004971#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 retval = inet_pton(af, ip, packed);
4974 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004975 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 return NULL;
4977 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004978 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 "illegal IP address string passed to inet_pton");
4980 return NULL;
4981 } else if (af == AF_INET) {
4982 return PyBytes_FromStringAndSize(packed,
4983 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004984#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 } else if (af == AF_INET6) {
4986 return PyBytes_FromStringAndSize(packed,
4987 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004990 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 return NULL;
4992 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004993}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004994#elif defined(MS_WINDOWS)
4995
4996static PyObject *
4997socket_inet_pton(PyObject *self, PyObject *args)
4998{
4999 int af;
5000 char* ip;
5001 struct sockaddr_in6 addr;
5002 INT ret, size;
5003
5004 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5005 return NULL;
5006 }
5007
Victor Stinnere990c6e2013-11-16 00:18:58 +01005008 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005009 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5010
5011 if (ret) {
5012 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5013 return NULL;
5014 } else if(af == AF_INET) {
5015 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005016 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005017 sizeof(addr4->sin_addr));
5018 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005019 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005020 sizeof(addr.sin6_addr));
5021 } else {
5022 PyErr_SetString(PyExc_OSError, "unknown address family");
5023 return NULL;
5024 }
5025}
5026
5027#endif
5028
5029#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005030
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005031PyDoc_STRVAR(inet_ntop_doc,
5032"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5033\n\
5034Convert a packed IP address of the given family to string format.");
5035
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005036#endif
5037
5038
5039#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005040static PyObject *
5041socket_inet_ntop(PyObject *self, PyObject *args)
5042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 int af;
5044 char* packed;
5045 int len;
5046 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005047#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005048 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005049#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005051#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5054 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5057 return NULL;
5058 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 if (af == AF_INET) {
5061 if (len != sizeof(struct in_addr)) {
5062 PyErr_SetString(PyExc_ValueError,
5063 "invalid length of packed IP address string");
5064 return NULL;
5065 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005066#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 } else if (af == AF_INET6) {
5068 if (len != sizeof(struct in6_addr)) {
5069 PyErr_SetString(PyExc_ValueError,
5070 "invalid length of packed IP address string");
5071 return NULL;
5072 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 } else {
5075 PyErr_Format(PyExc_ValueError,
5076 "unknown address family %d", af);
5077 return NULL;
5078 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 retval = inet_ntop(af, packed, ip, sizeof(ip));
5081 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005082 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 return NULL;
5084 } else {
5085 return PyUnicode_FromString(retval);
5086 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 /* NOTREACHED */
5089 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5090 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005091}
5092
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005093#elif defined(MS_WINDOWS)
5094
5095static PyObject *
5096socket_inet_ntop(PyObject *self, PyObject *args)
5097{
5098 int af;
5099 char* packed;
5100 int len;
5101 struct sockaddr_in6 addr;
5102 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005103#ifdef ENABLE_IPV6
5104 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5105#else
5106 char ip[INET_ADDRSTRLEN + 1];
5107#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005108
5109 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5110 memset((void *) &ip[0], '\0', sizeof(ip));
5111
5112 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5113 return NULL;
5114 }
5115
5116 if (af == AF_INET) {
5117 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5118
5119 if (len != sizeof(struct in_addr)) {
5120 PyErr_SetString(PyExc_ValueError,
5121 "invalid length of packed IP address string");
5122 return NULL;
5123 }
5124 memset(addr4, 0, sizeof(struct sockaddr_in));
5125 addr4->sin_family = AF_INET;
5126 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5127 addrlen = sizeof(struct sockaddr_in);
5128 } else if (af == AF_INET6) {
5129 if (len != sizeof(struct in6_addr)) {
5130 PyErr_SetString(PyExc_ValueError,
5131 "invalid length of packed IP address string");
5132 return NULL;
5133 }
5134
5135 memset(&addr, 0, sizeof(addr));
5136 addr.sin6_family = AF_INET6;
5137 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5138 addrlen = sizeof(addr);
5139 } else {
5140 PyErr_Format(PyExc_ValueError,
5141 "unknown address family %d", af);
5142 return NULL;
5143 }
5144
5145 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005146 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005147 ip, &retlen);
5148
5149 if (ret) {
5150 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5151 return NULL;
5152 } else {
5153 return PyUnicode_FromString(ip);
5154 }
5155}
5156
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005157#endif /* HAVE_INET_PTON */
5158
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005159/* Python interface to getaddrinfo(host, port). */
5160
5161/*ARGSUSED*/
5162static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005163socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005164{
Victor Stinner77af1722011-05-26 14:05:59 +02005165 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005166 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 struct addrinfo hints, *res;
5168 struct addrinfo *res0 = NULL;
5169 PyObject *hobj = NULL;
5170 PyObject *pobj = (PyObject *)NULL;
5171 char pbuf[30];
5172 char *hptr, *pptr;
5173 int family, socktype, protocol, flags;
5174 int error;
5175 PyObject *all = (PyObject *)NULL;
5176 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005177
Georg Brandl6083a4b2013-10-14 06:51:46 +02005178 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005180 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005181 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 &protocol, &flags)) {
5183 return NULL;
5184 }
5185 if (hobj == Py_None) {
5186 hptr = NULL;
5187 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005188 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005189
5190 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 if (!idna)
5192 return NULL;
5193 assert(PyBytes_Check(idna));
5194 hptr = PyBytes_AS_STRING(idna);
5195 } else if (PyBytes_Check(hobj)) {
5196 hptr = PyBytes_AsString(hobj);
5197 } else {
5198 PyErr_SetString(PyExc_TypeError,
5199 "getaddrinfo() argument 1 must be string or None");
5200 return NULL;
5201 }
5202 if (PyLong_CheckExact(pobj)) {
5203 long value = PyLong_AsLong(pobj);
5204 if (value == -1 && PyErr_Occurred())
5205 goto err;
5206 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5207 pptr = pbuf;
5208 } else if (PyUnicode_Check(pobj)) {
5209 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005210 if (pptr == NULL)
5211 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005213 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 } else if (pobj == Py_None) {
5215 pptr = (char *)NULL;
5216 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005217 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 goto err;
5219 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005220#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005221 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5222 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005223 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5224 * This workaround avoids a segfault in libsystem.
5225 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005226 pptr = "00";
5227 }
5228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 memset(&hints, 0, sizeof(hints));
5230 hints.ai_family = family;
5231 hints.ai_socktype = socktype;
5232 hints.ai_protocol = protocol;
5233 hints.ai_flags = flags;
5234 Py_BEGIN_ALLOW_THREADS
5235 ACQUIRE_GETADDRINFO_LOCK
5236 error = getaddrinfo(hptr, pptr, &hints, &res0);
5237 Py_END_ALLOW_THREADS
5238 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5239 if (error) {
5240 set_gaierror(error);
5241 goto err;
5242 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 if ((all = PyList_New(0)) == NULL)
5245 goto err;
5246 for (res = res0; res; res = res->ai_next) {
5247 PyObject *single;
5248 PyObject *addr =
5249 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5250 if (addr == NULL)
5251 goto err;
5252 single = Py_BuildValue("iiisO", res->ai_family,
5253 res->ai_socktype, res->ai_protocol,
5254 res->ai_canonname ? res->ai_canonname : "",
5255 addr);
5256 Py_DECREF(addr);
5257 if (single == NULL)
5258 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 if (PyList_Append(all, single))
5261 goto err;
5262 Py_XDECREF(single);
5263 }
5264 Py_XDECREF(idna);
5265 if (res0)
5266 freeaddrinfo(res0);
5267 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005268 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 Py_XDECREF(all);
5270 Py_XDECREF(idna);
5271 if (res0)
5272 freeaddrinfo(res0);
5273 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005274}
5275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005276PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005277"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5278 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005279\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005280Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005281
5282/* Python interface to getnameinfo(sa, flags). */
5283
5284/*ARGSUSED*/
5285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005286socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 PyObject *sa = (PyObject *)NULL;
5289 int flags;
5290 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005291 int port;
5292 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5294 struct addrinfo hints, *res = NULL;
5295 int error;
5296 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 flags = flowinfo = scope_id = 0;
5299 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5300 return NULL;
5301 if (!PyTuple_Check(sa)) {
5302 PyErr_SetString(PyExc_TypeError,
5303 "getnameinfo() argument 1 must be a tuple");
5304 return NULL;
5305 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005306 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 &hostp, &port, &flowinfo, &scope_id))
5308 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005309 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005310 PyErr_SetString(PyExc_OverflowError,
5311 "getsockaddrarg: flowinfo must be 0-1048575.");
5312 return NULL;
5313 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5315 memset(&hints, 0, sizeof(hints));
5316 hints.ai_family = AF_UNSPEC;
5317 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005318 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 Py_BEGIN_ALLOW_THREADS
5320 ACQUIRE_GETADDRINFO_LOCK
5321 error = getaddrinfo(hostp, pbuf, &hints, &res);
5322 Py_END_ALLOW_THREADS
5323 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5324 if (error) {
5325 set_gaierror(error);
5326 goto fail;
5327 }
5328 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005329 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 "sockaddr resolved to multiple addresses");
5331 goto fail;
5332 }
5333 switch (res->ai_family) {
5334 case AF_INET:
5335 {
5336 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005337 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 "IPv4 sockaddr must be 2 tuple");
5339 goto fail;
5340 }
5341 break;
5342 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005343#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 case AF_INET6:
5345 {
5346 struct sockaddr_in6 *sin6;
5347 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005348 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 sin6->sin6_scope_id = scope_id;
5350 break;
5351 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005354 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5356 if (error) {
5357 set_gaierror(error);
5358 goto fail;
5359 }
5360 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005361
5362fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 if (res)
5364 freeaddrinfo(res);
5365 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005366}
5367
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005368PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005369"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005371Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005372
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005373
5374/* Python API to getting and setting the default timeout value. */
5375
5376static PyObject *
5377socket_getdefaulttimeout(PyObject *self)
5378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 if (defaulttimeout < 0.0) {
5380 Py_INCREF(Py_None);
5381 return Py_None;
5382 }
5383 else
5384 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005385}
5386
5387PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005388"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005389\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005390Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005391A value of None indicates that new socket objects have no timeout.\n\
5392When the socket module is first imported, the default is None.");
5393
5394static PyObject *
5395socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 if (arg == Py_None)
5400 timeout = -1.0;
5401 else {
5402 timeout = PyFloat_AsDouble(arg);
5403 if (timeout < 0.0) {
5404 if (!PyErr_Occurred())
5405 PyErr_SetString(PyExc_ValueError,
5406 "Timeout value out of range");
5407 return NULL;
5408 }
5409 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 Py_INCREF(Py_None);
5414 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005415}
5416
5417PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005418"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005419\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005420Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005421A value of None indicates that new socket objects have no timeout.\n\
5422When the socket module is first imported, the default is None.");
5423
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005424#ifdef HAVE_IF_NAMEINDEX
5425/* Python API for getting interface indices and names */
5426
5427static PyObject *
5428socket_if_nameindex(PyObject *self, PyObject *arg)
5429{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005430 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005431 int i;
5432 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005433
Charles-François Natali60713592011-05-20 16:55:06 +02005434 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005435 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005436 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005437 return NULL;
5438 }
5439
5440 list = PyList_New(0);
5441 if (list == NULL) {
5442 if_freenameindex(ni);
5443 return NULL;
5444 }
5445
Charles-François Natali60713592011-05-20 16:55:06 +02005446 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5447 PyObject *ni_tuple = Py_BuildValue("IO&",
5448 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005449
5450 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5451 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005452 Py_DECREF(list);
5453 if_freenameindex(ni);
5454 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005455 }
5456 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005457 }
5458
5459 if_freenameindex(ni);
5460 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005461}
5462
5463PyDoc_STRVAR(if_nameindex_doc,
5464"if_nameindex()\n\
5465\n\
5466Returns a list of network interface information (index, name) tuples.");
5467
Charles-François Natali60713592011-05-20 16:55:06 +02005468static PyObject *
5469socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005470{
Charles-François Natali60713592011-05-20 16:55:06 +02005471 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005472 unsigned long index;
5473
Charles-François Natali60713592011-05-20 16:55:06 +02005474 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5475 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005476 return NULL;
5477
Charles-François Natali60713592011-05-20 16:55:06 +02005478 index = if_nametoindex(PyBytes_AS_STRING(oname));
5479 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005480 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005481 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005482 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005483 return NULL;
5484 }
5485
5486 return PyLong_FromUnsignedLong(index);
5487}
5488
5489PyDoc_STRVAR(if_nametoindex_doc,
5490"if_nametoindex(if_name)\n\
5491\n\
5492Returns the interface index corresponding to the interface name if_name.");
5493
Charles-François Natali60713592011-05-20 16:55:06 +02005494static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005495socket_if_indextoname(PyObject *self, PyObject *arg)
5496{
Charles-François Natali60713592011-05-20 16:55:06 +02005497 unsigned long index;
5498 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005499
Charles-François Natali60713592011-05-20 16:55:06 +02005500 index = PyLong_AsUnsignedLong(arg);
5501 if (index == (unsigned long) -1)
5502 return NULL;
5503
5504 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005505 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005506 return NULL;
5507 }
5508
Charles-François Natali60713592011-05-20 16:55:06 +02005509 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005510}
5511
5512PyDoc_STRVAR(if_indextoname_doc,
5513"if_indextoname(if_index)\n\
5514\n\
5515Returns the interface name corresponding to the interface index if_index.");
5516
5517#endif /* HAVE_IF_NAMEINDEX */
5518
5519
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005520#ifdef CMSG_LEN
5521/* Python interface to CMSG_LEN(length). */
5522
5523static PyObject *
5524socket_CMSG_LEN(PyObject *self, PyObject *args)
5525{
5526 Py_ssize_t length;
5527 size_t result;
5528
5529 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5530 return NULL;
5531 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5532 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5533 return NULL;
5534 }
5535 return PyLong_FromSize_t(result);
5536}
5537
5538PyDoc_STRVAR(CMSG_LEN_doc,
5539"CMSG_LEN(length) -> control message length\n\
5540\n\
5541Return the total length, without trailing padding, of an ancillary\n\
5542data item with associated data of the given length. This value can\n\
5543often be used as the buffer size for recvmsg() to receive a single\n\
5544item of ancillary data, but RFC 3542 requires portable applications to\n\
5545use CMSG_SPACE() and thus include space for padding, even when the\n\
5546item will be the last in the buffer. Raises OverflowError if length\n\
5547is outside the permissible range of values.");
5548
5549
5550#ifdef CMSG_SPACE
5551/* Python interface to CMSG_SPACE(length). */
5552
5553static PyObject *
5554socket_CMSG_SPACE(PyObject *self, PyObject *args)
5555{
5556 Py_ssize_t length;
5557 size_t result;
5558
5559 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5560 return NULL;
5561 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5562 PyErr_SetString(PyExc_OverflowError,
5563 "CMSG_SPACE() argument out of range");
5564 return NULL;
5565 }
5566 return PyLong_FromSize_t(result);
5567}
5568
5569PyDoc_STRVAR(CMSG_SPACE_doc,
5570"CMSG_SPACE(length) -> buffer size\n\
5571\n\
5572Return the buffer size needed for recvmsg() to receive an ancillary\n\
5573data item with associated data of the given length, along with any\n\
5574trailing padding. The buffer space needed to receive multiple items\n\
5575is the sum of the CMSG_SPACE() values for their associated data\n\
5576lengths. Raises OverflowError if length is outside the permissible\n\
5577range of values.");
5578#endif /* CMSG_SPACE */
5579#endif /* CMSG_LEN */
5580
5581
Guido van Rossum30a685f1991-06-27 15:51:29 +00005582/* List of functions exported by this module. */
5583
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005584static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 {"gethostbyname", socket_gethostbyname,
5586 METH_VARARGS, gethostbyname_doc},
5587 {"gethostbyname_ex", socket_gethostbyname_ex,
5588 METH_VARARGS, ghbn_ex_doc},
5589 {"gethostbyaddr", socket_gethostbyaddr,
5590 METH_VARARGS, gethostbyaddr_doc},
5591 {"gethostname", socket_gethostname,
5592 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005593#ifdef HAVE_SETHOSTNAME
5594 {"sethostname", socket_sethostname,
5595 METH_VARARGS, sethostname_doc},
5596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 {"getservbyname", socket_getservbyname,
5598 METH_VARARGS, getservbyname_doc},
5599 {"getservbyport", socket_getservbyport,
5600 METH_VARARGS, getservbyport_doc},
5601 {"getprotobyname", socket_getprotobyname,
5602 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005603#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 {"dup", socket_dup,
5605 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005606#endif
Dave Cole331708b2004-08-09 04:51:41 +00005607#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 {"socketpair", socket_socketpair,
5609 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 {"ntohs", socket_ntohs,
5612 METH_VARARGS, ntohs_doc},
5613 {"ntohl", socket_ntohl,
5614 METH_O, ntohl_doc},
5615 {"htons", socket_htons,
5616 METH_VARARGS, htons_doc},
5617 {"htonl", socket_htonl,
5618 METH_O, htonl_doc},
5619 {"inet_aton", socket_inet_aton,
5620 METH_VARARGS, inet_aton_doc},
5621 {"inet_ntoa", socket_inet_ntoa,
5622 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005623#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 {"inet_pton", socket_inet_pton,
5625 METH_VARARGS, inet_pton_doc},
5626 {"inet_ntop", socket_inet_ntop,
5627 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005628#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005629 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5630 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 {"getnameinfo", socket_getnameinfo,
5632 METH_VARARGS, getnameinfo_doc},
5633 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5634 METH_NOARGS, getdefaulttimeout_doc},
5635 {"setdefaulttimeout", socket_setdefaulttimeout,
5636 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005637#ifdef HAVE_IF_NAMEINDEX
5638 {"if_nameindex", socket_if_nameindex,
5639 METH_NOARGS, if_nameindex_doc},
5640 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005641 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005642 {"if_indextoname", socket_if_indextoname,
5643 METH_O, if_indextoname_doc},
5644#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005645#ifdef CMSG_LEN
5646 {"CMSG_LEN", socket_CMSG_LEN,
5647 METH_VARARGS, CMSG_LEN_doc},
5648#ifdef CMSG_SPACE
5649 {"CMSG_SPACE", socket_CMSG_SPACE,
5650 METH_VARARGS, CMSG_SPACE_doc},
5651#endif
5652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005654};
5655
Guido van Rossum30a685f1991-06-27 15:51:29 +00005656
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005657#ifdef MS_WINDOWS
5658#define OS_INIT_DEFINED
5659
5660/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005661
5662static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005663os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005666}
5667
5668static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005669os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 WSADATA WSAData;
5672 int ret;
5673 ret = WSAStartup(0x0101, &WSAData);
5674 switch (ret) {
5675 case 0: /* No error */
5676 Py_AtExit(os_cleanup);
5677 return 1; /* Success */
5678 case WSASYSNOTREADY:
5679 PyErr_SetString(PyExc_ImportError,
5680 "WSAStartup failed: network not ready");
5681 break;
5682 case WSAVERNOTSUPPORTED:
5683 case WSAEINVAL:
5684 PyErr_SetString(
5685 PyExc_ImportError,
5686 "WSAStartup failed: requested version not supported");
5687 break;
5688 default:
5689 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5690 break;
5691 }
5692 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005693}
5694
Guido van Rossum8d665e61996-06-26 18:22:49 +00005695#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005696
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005697
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005698
5699#ifndef OS_INIT_DEFINED
5700static int
5701os_init(void)
5702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005704}
5705#endif
5706
5707
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005708/* C API table - always add new things to the end for binary
5709 compatibility. */
5710static
5711PySocketModule_APIObject PySocketModuleAPI =
5712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005714 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005716};
5717
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005718
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005719/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005720
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005721 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005722 "socket.py" which implements some additional functionality.
5723 The import of "_socket" may fail with an ImportError exception if
5724 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005725 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005726 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005727*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005729PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005730"Implementation module for socket operations.\n\
5731\n\
5732See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005733
Martin v. Löwis1a214512008-06-11 05:26:20 +00005734static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 PyModuleDef_HEAD_INIT,
5736 PySocket_MODULE_NAME,
5737 socket_doc,
5738 -1,
5739 socket_methods,
5740 NULL,
5741 NULL,
5742 NULL,
5743 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005744};
5745
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005746PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005747PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 if (!os_init())
5752 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005753
Victor Stinnerdaf45552013-08-28 00:53:59 +02005754#ifdef MS_WINDOWS
5755 if (support_wsa_no_inherit == -1) {
5756 DWORD version = GetVersion();
5757 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5758 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5759 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5760 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5761 }
5762#endif
5763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 Py_TYPE(&sock_type) = &PyType_Type;
5765 m = PyModule_Create(&socketmodule);
5766 if (m == NULL)
5767 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005768
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005769 Py_INCREF(PyExc_OSError);
5770 PySocketModuleAPI.error = PyExc_OSError;
5771 Py_INCREF(PyExc_OSError);
5772 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005774 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 if (socket_herror == NULL)
5776 return NULL;
5777 Py_INCREF(socket_herror);
5778 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005779 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 NULL);
5781 if (socket_gaierror == NULL)
5782 return NULL;
5783 Py_INCREF(socket_gaierror);
5784 PyModule_AddObject(m, "gaierror", socket_gaierror);
5785 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005786 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 if (socket_timeout == NULL)
5788 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005789 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 Py_INCREF(socket_timeout);
5791 PyModule_AddObject(m, "timeout", socket_timeout);
5792 Py_INCREF((PyObject *)&sock_type);
5793 if (PyModule_AddObject(m, "SocketType",
5794 (PyObject *)&sock_type) != 0)
5795 return NULL;
5796 Py_INCREF((PyObject *)&sock_type);
5797 if (PyModule_AddObject(m, "socket",
5798 (PyObject *)&sock_type) != 0)
5799 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005800
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005801#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005803#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 Py_INCREF(has_ipv6);
5807 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 /* Export C API */
5810 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5811 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5812 ) != 0)
5813 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005816#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005817 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005818#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005819 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005820#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005821 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005822#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005823#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005824 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005825#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005826#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005828 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005829#endif
5830#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005831 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005832#endif
5833#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005835 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005836#endif
5837#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005839 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005840#endif
5841#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005843 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005844#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005845#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005847 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005848#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005849#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005851 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005852#endif
5853#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005855 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005856#endif
5857#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005858 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005859#endif
5860#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005862 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005863#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005864#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005866 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005867#endif
5868#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005870 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005871#endif
5872#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005874 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005875#endif
5876#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005878 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005879#endif
5880#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005882 PyModule_AddIntMacro(m, AF_NETLINK);
5883 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005884#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005885 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005886#endif
5887#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005888 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005889#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005890 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5891 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005892#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005893 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005894#endif
5895#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005896 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005897#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005898#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005899 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005900#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005901#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005902 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005903#endif
5904#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005905 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005906#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005907 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005908#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005909 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005910#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005911#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005912 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005913#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005914#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005915#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005917 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005918#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02005919#ifdef AF_LINK
5920 PyModule_AddIntMacro(m, AF_LINK);
5921#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005922#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005924 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005925#endif
5926#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005928 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005929#endif
5930#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005932 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005933#endif
5934#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005936 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005937#endif
5938#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005940 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005941#endif
5942#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005944 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005945#endif
5946#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005948 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005949#endif
5950#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005952 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005953#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005954
Hye-Shik Chang81268602004-02-02 06:05:24 +00005955#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005956 PyModule_AddIntMacro(m, AF_BLUETOOTH);
5957 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
5958 PyModule_AddIntMacro(m, BTPROTO_HCI);
5959 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005960#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005961 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005962#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005963#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005964#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005965 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005966#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005967 PyModule_AddIntMacro(m, HCI_DATA_DIR);
5968 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005969#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005970 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5972 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005973#endif
5974
Charles-François Natali47413c12011-10-06 19:47:44 +02005975#ifdef AF_CAN
5976 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005977 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005978#endif
5979#ifdef PF_CAN
5980 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005982#endif
5983
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005984/* Reliable Datagram Sockets */
5985#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005986 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005987#endif
5988#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005989 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005990#endif
5991
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005992/* Kernel event messages */
5993#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005994 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005995#endif
5996#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005997 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005998#endif
5999
Antoine Pitroub156a462010-10-27 20:13:57 +00006000#ifdef AF_PACKET
6001 PyModule_AddIntMacro(m, AF_PACKET);
6002#endif
6003#ifdef PF_PACKET
6004 PyModule_AddIntMacro(m, PF_PACKET);
6005#endif
6006#ifdef PACKET_HOST
6007 PyModule_AddIntMacro(m, PACKET_HOST);
6008#endif
6009#ifdef PACKET_BROADCAST
6010 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6011#endif
6012#ifdef PACKET_MULTICAST
6013 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6014#endif
6015#ifdef PACKET_OTHERHOST
6016 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6017#endif
6018#ifdef PACKET_OUTGOING
6019 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6020#endif
6021#ifdef PACKET_LOOPBACK
6022 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6023#endif
6024#ifdef PACKET_FASTROUTE
6025 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006026#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006027
Christian Heimes043d6f62008-01-07 17:19:16 +00006028#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006029 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006032 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6033 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6034 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006035
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006036 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6037 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6038 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006041 PyModule_AddIntMacro(m, SOL_TIPC);
6042 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6043 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6044 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6045 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006046
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006047 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6048 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6049 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6050 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006053 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6054 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006055#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006058#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006059 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6060 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6061 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6062 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6063 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6064 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006065#endif
6066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006068 PyModule_AddIntMacro(m, SOCK_STREAM);
6069 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006070/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006071 PyModule_AddIntMacro(m, SOCK_RAW);
6072 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006073#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006075#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006076#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006077 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006078#endif
6079#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006080 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006081#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006084 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006087 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006090 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006091#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006092#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006093 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006094#endif
6095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006097 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006100 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006103 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006106 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006109 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006112 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006115 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006118 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006121 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006124 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006127 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006130 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006136 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006139 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006142 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006143#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006144#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006146#endif
6147#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006148 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006149#endif
6150#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006151 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006152#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006153#ifdef SO_BINDTODEVICE
6154 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6155#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006156#ifdef SO_PRIORITY
6157 PyModule_AddIntMacro(m, SO_PRIORITY);
6158#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 /* Maximum number of connections for "listen" */
6161#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006163#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006165#endif
6166
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006167 /* Ancilliary message types */
6168#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006169 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006170#endif
6171#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006173#endif
6174#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006176#endif
6177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 /* Flags for send, recv */
6179#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006180 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006186 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006192 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006204 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006208#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006209#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006210 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006211#endif
6212#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006213 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006214#endif
6215#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006216 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006217#endif
6218#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006219 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006220#endif
6221#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006223#endif
6224#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006225 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006226#endif
6227#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006229#endif
6230#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006231 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006232#endif
6233#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006235#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006236#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006238#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 /* Protocol level and numbers, usable for [gs]etsockopt */
6241#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006245 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006246#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006250 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006256 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006259 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006266#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006271#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006273#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006274#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006275 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006276#endif
6277#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006278 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6279 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006280#endif
6281#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6283 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6284 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006285
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6287 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6288 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006289#endif
6290#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6292 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6293 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6294 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006295#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006296#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006298 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6299 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6300 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6301 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6302 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6303 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6304 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6305 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6306 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6307 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6308 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6309 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6310#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006311#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006313#endif
6314#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006315 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006316#endif
6317#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006319#endif
6320#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006321 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006322#endif
6323#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006324 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006325#endif
6326#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006327 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006328#endif
6329#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006330 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006331#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006333 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006334#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006349 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006352 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006355 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006358 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006361 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006362#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006366 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006369 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006372 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006373#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006380 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006398 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006401 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006404 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006407 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006410 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006413 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006419 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006422 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006425 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006434 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006435#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006436#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006437 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006440 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006441#endif
6442/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006444 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006445#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006449 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006450#endif
6451
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006452#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006454#endif
6455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456 /* Some port configuration */
6457#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006458 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006459#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006464#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006466#endif
6467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 /* Some reserved IP v.4 addresses */
6469#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006471#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006476#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006481#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006486#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef INADDR_ALLHOSTS_GROUP
6490 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6491 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006492#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006497#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006502#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006504#endif
6505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506 /* IPv4 [gs]etsockopt options */
6507#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006508 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006517 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006554#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006555#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006557#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6560#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006567 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006579#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006583#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006584 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006585#endif
6586#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006588#endif
6589#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006591#endif
6592#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006594#endif
6595#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006597#endif
6598#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006600#endif
6601#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006603#endif
6604#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006606#endif
6607#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006609#endif
6610#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006612#endif
6613#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006615#endif
6616#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006618#endif
6619#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006621#endif
6622#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006624#endif
6625#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006627#endif
6628#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006630#endif
6631#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006633#endif
6634#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006636#endif
6637#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006639#endif
6640#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006642#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 /* TCP options */
6645#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006680#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006681#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006683#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* IPX options */
6686#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006688#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006689
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006690/* Reliable Datagram Sockets */
6691#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006693#endif
6694#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006696#endif
6697#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006699#endif
6700#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006702#endif
6703#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006705#endif
6706#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006708#endif
6709#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006711#endif
6712#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006714#endif
6715#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006717#endif
6718#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006720#endif
6721#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006723#endif
6724#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006726#endif
6727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006729#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006731#endif
6732#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006734#endif
6735#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006737#endif
6738#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006740#endif
6741#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006743#endif
6744#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006746#endif
6747#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006749#endif
6750#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006752#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006753#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006754 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006755#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006756#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006758#endif
6759#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006761#endif
6762#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006764#endif
6765#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006767#endif
6768#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006770#endif
6771#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006773#endif
6774#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006776#endif
6777#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006779#endif
6780#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006782#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006783#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006785#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006786#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006788#endif
6789#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006791#endif
6792#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006794#endif
6795#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006797#endif
6798#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006800#endif
6801#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006803#endif
6804#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006806#endif
6807#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006809#endif
6810#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006812#endif
6813#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006815#endif
6816#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006818#endif
6819#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006821#endif
6822#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006824#endif
6825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006827#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006829#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006831#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006833#endif
6834#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006836#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006837 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006838#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006839 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006840#endif
6841#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006843#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006844 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006845#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006846 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006847#endif
6848
Christian Heimesfaf2f632008-01-06 16:59:19 +00006849#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850 {
6851 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6852 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6853 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006854 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855 PyObject *tmp;
6856 tmp = PyLong_FromUnsignedLong(codes[i]);
6857 if (tmp == NULL)
6858 return NULL;
6859 PyModule_AddObject(m, names[i], tmp);
6860 }
6861 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, RCVALL_OFF);
6863 PyModule_AddIntMacro(m, RCVALL_ON);
6864 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006865#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006867#endif
6868#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006870#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006871#endif /* _MSTCPIP_ */
6872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006874#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006878}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006879
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006880
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006881#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006882#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006883
6884/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006885/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006886
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006887int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006888inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006891#if (SIZEOF_INT != 4)
6892#error "Not sure if in_addr_t exists and int is not 32-bits."
6893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894 unsigned int packed_addr;
6895 packed_addr = inet_addr(src);
6896 if (packed_addr == INADDR_NONE)
6897 return 0;
6898 memcpy(dst, &packed_addr, 4);
6899 return 1;
6900 }
6901 /* Should set errno to EAFNOSUPPORT */
6902 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006903}
6904
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006905const char *
6906inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006908 if (af == AF_INET) {
6909 struct in_addr packed_addr;
6910 if (size < 16)
6911 /* Should set errno to ENOSPC. */
6912 return NULL;
6913 memcpy(&packed_addr, src, sizeof(packed_addr));
6914 return strncpy(dst, inet_ntoa(packed_addr), size);
6915 }
6916 /* Should set errno to EAFNOSUPPORT */
6917 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006918}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006919
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006920#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006921#endif