blob: b9bc932d1d172a1f904886990cf4da8d5a0c08ae [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__) || \
191 defined(__VMS) || !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öwis9e437302002-12-06 12:57:26 +0000215#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000216# include <ioctl.h>
217#endif
218
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100219#ifdef __APPLE__
220# include <sys/ioctl.h>
221#endif
222
223
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000225/* make sure that the reentrant (gethostbyaddr_r etc)
226 functions are declared correctly if compiling with
227 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228
Thomas Wouters477c8d52006-05-27 19:21:47 +0000229/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000230 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000231#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000232#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000233
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000234#undef _XOPEN_SOURCE
235#include <sys/socket.h>
236#include <sys/types.h>
237#include <netinet/in.h>
238#ifdef _SS_ALIGNSIZE
239#define HAVE_GETADDRINFO 1
240#define HAVE_GETNAMEINFO 1
241#endif
242
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000243#define HAVE_INET_PTON
244#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000245#endif
246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* Irix 6.5 fails to define this variable at all. This is needed
248 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000249 are just busted. Same thing for Solaris. */
250#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000251#define INET_ADDRSTRLEN 16
252#endif
253
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000255#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000256#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000257#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700259#ifdef HAVE_SYS_SOCKET_H
260#include <sys/socket.h>
261#endif
262
263#ifdef HAVE_NET_IF_H
264#include <net/if.h>
265#endif
266
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000267/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000269#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Addressing includes */
272
Guido van Rossum6f489d91996-06-28 20:15:15 +0000273#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Non-MS WINDOWS includes */
276# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000277# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000278
Guido van Rossum9376b741999-09-15 22:01:40 +0000279/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000284#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000285
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000287# ifdef HAVE_FCNTL_H
288# include <fcntl.h>
289# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000290
Jeremy Hylton22308652001-02-02 03:23:09 +0000291#endif
292
Skip Montanaro7befb992004-02-10 16:50:21 +0000293#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000294
295#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000297#endif
298
Neal Norwitz39d22e52002-11-02 19:55:21 +0000299#ifndef O_NONBLOCK
300# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000301#endif
302
Trent Micka708d6e2004-09-07 17:48:26 +0000303/* include Python's addrinfo.h unless it causes trouble */
304#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
305 /* Do not include addinfo.h on some newer IRIX versions.
306 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
307 * for example, but not by 6.5.10.
308 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000310 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
311 * EAI_* constants are defined in (the already included) ws2tcpip.h.
312 */
313#else
314# include "addrinfo.h"
315#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000316
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000317#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000318#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000319int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000320const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000321#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000322#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000323
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000324#ifdef __APPLE__
325/* On OS X, getaddrinfo returns no error indication of lookup
326 failure, so we must use the emulation instead of the libinfo
327 implementation. Unfortunately, performing an autoconf test
328 for this bug would require DNS access for the machine performing
329 the configuration, which is not acceptable. Therefore, we
330 determine the bug just by checking for __APPLE__. If this bug
331 gets ever fixed, perhaps checking for sys/version.h would be
332 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000333#ifndef HAVE_GETNAMEINFO
334/* This bug seems to be fixed in Jaguar. Ths easiest way I could
335 Find to check for Jaguar is that it has getnameinfo(), which
336 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000338#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000339
340#ifdef HAVE_INET_ATON
341#define USE_INET_ATON_WEAKLINK
342#endif
343
Jack Jansen84262fb2002-07-02 14:40:42 +0000344#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000345
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000346/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000348/* avoid clashes with the C library definition of the symbol. */
349#define getaddrinfo fake_getaddrinfo
350#define gai_strerror fake_gai_strerror
351#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000352#include "getaddrinfo.c"
353#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000355#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000356#include "getnameinfo.c"
357#endif
358
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000359#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000360#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000361#endif
362
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000363#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000364#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000365#define EAFNOSUPPORT WSAEAFNOSUPPORT
366#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000367#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000368
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000369#ifndef SOCKETCLOSE
370#define SOCKETCLOSE close
371#endif
372
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000373#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000374#define USE_BLUETOOTH 1
375#if defined(__FreeBSD__)
376#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
377#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000378#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000379#define SOL_HCI SOL_HCI_RAW
380#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define sockaddr_l2 sockaddr_l2cap
382#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000383#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
385#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000386#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000387#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_l2 sockaddr_bt
389#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000390#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000392#define SOL_HCI BTPROTO_HCI
393#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
395#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000398#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
400#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000401#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
403#endif
404#endif
405
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000406#ifdef __VMS
407/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
408#define SEGMENT_SIZE (32 * 1024 -1)
409#endif
410
Charles-François Natali8b759652011-12-23 16:44:51 +0100411/* Convert "sock_addr_t *" to "struct sockaddr *". */
412#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413
Martin v. Löwise9416172003-05-03 10:12:45 +0000414/*
415 * Constants for getnameinfo()
416 */
417#if !defined(NI_MAXHOST)
418#define NI_MAXHOST 1025
419#endif
420#if !defined(NI_MAXSERV)
421#define NI_MAXSERV 32
422#endif
423
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000424#ifndef INVALID_SOCKET /* MS defines this */
425#define INVALID_SOCKET (-1)
426#endif
427
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000428/* XXX There's a problem here: *static* functions are not supposed to have
429 a Py prefix (or use CapitalizedWords). Later... */
430
Guido van Rossum30a685f1991-06-27 15:51:29 +0000431/* Global variable holding the exception type for errors detected
432 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000433static PyObject *socket_herror;
434static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000435static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436
Tim Peters643a7fc2002-02-17 04:13:21 +0000437/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000438 The sock_type variable contains pointers to various functions,
439 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000440 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000441static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000442
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000443#if defined(HAVE_POLL_H)
444#include <poll.h>
445#elif defined(HAVE_SYS_POLL_H)
446#include <sys/poll.h>
447#endif
448
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000449/* Largest value to try to store in a socklen_t (used when handling
450 ancillary data). POSIX requires socklen_t to hold at least
451 (2**31)-1 and recommends against storing larger values, but
452 socklen_t was originally int in the BSD interface, so to be on the
453 safe side we use the smaller of (2**31)-1 and INT_MAX. */
454#if INT_MAX > 0x7fffffff
455#define SOCKLEN_T_LIMIT 0x7fffffff
456#else
457#define SOCKLEN_T_LIMIT INT_MAX
458#endif
459
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200460#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461/* Instead of select(), we'll use poll() since poll() works on any fd. */
462#define IS_SELECTABLE(s) 1
463/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200465/* If there's no timeout left, we don't have to call select, so it's a safe,
466 * little white lie. */
467#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000469
470static PyObject*
471select_error(void)
472{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200473 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000475}
476
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000478#ifndef WSAEAGAIN
479#define WSAEAGAIN WSAEWOULDBLOCK
480#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000481#define CHECK_ERRNO(expected) \
482 (WSAGetLastError() == WSA ## expected)
483#else
484#define CHECK_ERRNO(expected) \
485 (errno == expected)
486#endif
487
Victor Stinnerdaf45552013-08-28 00:53:59 +0200488#ifdef MS_WINDOWS
489/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
490static int support_wsa_no_inherit = -1;
491#endif
492
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493/* Convenience function to raise an error according to errno
494 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495
Guido van Rossum73624e91994-10-10 17:59:00 +0000496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000497set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000498{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000499#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 int err_no = WSAGetLastError();
501 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
502 recognizes the error codes used by both GetLastError() and
503 WSAGetLastError */
504 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200505 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000506#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000507
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200508 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000509}
510
Guido van Rossum30a685f1991-06-27 15:51:29 +0000511
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000513set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516
517#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000519#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 if (v != NULL) {
523 PyErr_SetObject(socket_herror, v);
524 Py_DECREF(v);
525 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528}
529
530
531static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000532set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535
Martin v. Löwis272cb402002-03-01 08:31:07 +0000536#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 /* EAI_SYSTEM is not available on Windows XP. */
538 if (error == EAI_SYSTEM)
539 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000540#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000542#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000544#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 if (v != NULL) {
548 PyErr_SetObject(socket_gaierror, v);
549 Py_DECREF(v);
550 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553}
554
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000555#ifdef __VMS
556/* Function to send in segments */
557static int
558sendsegmented(int sock_fd, char *buf, int len, int flags)
559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 int n = 0;
561 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 while (remaining > 0) {
564 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
567 n = send(sock_fd, buf, segment, flags);
568 if (n < 0) {
569 return n;
570 }
571 remaining -= segment;
572 buf += segment;
573 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000576}
577#endif
578
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000579/* Function to perform the setting of socket blocking mode
580 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000581static int
582internal_setblocking(PySocketSockObject *s, int block)
583{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000586#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000587#ifdef SOCK_NONBLOCK
588 if (block)
589 s->sock_type &= (~SOCK_NONBLOCK);
590 else
591 s->sock_type |= SOCK_NONBLOCK;
592#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000595#ifndef MS_WINDOWS
Jesus Cea14c81ab2012-10-05 02:11:36 +0200596#if defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 block = !block;
598 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200599#else /* !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
601 if (block)
602 delay_flag &= (~O_NONBLOCK);
603 else
604 delay_flag |= O_NONBLOCK;
605 fcntl(s->sock_fd, F_SETFL, delay_flag);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200606#endif /* !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 block = !block;
609 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 /* Since these don't return anything */
614 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000615}
616
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000617/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000618 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000619 This does not raise an exception; we'll let our caller do that
620 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000622static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000623internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* Nothing to do unless we're in timeout mode (not non-blocking) */
628 if (s->sock_timeout <= 0.0)
629 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* Guard against closed socket */
632 if (s->sock_fd < 0)
633 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000634
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000635 /* Handling this condition here simplifies the select loops */
636 if (interval < 0.0)
637 return 1;
638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Prefer poll, if available, since you can poll() any fd
640 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000641#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 {
643 struct pollfd pollfd;
644 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 pollfd.fd = s->sock_fd;
647 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000650 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 n = poll(&pollfd, 1, timeout);
652 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 {
655 /* Construct the arguments to select */
656 fd_set fds;
657 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000658 tv.tv_sec = (int)interval;
659 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 FD_ZERO(&fds);
661 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 /* See if the socket is ready */
664 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000665 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
666 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000668 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
669 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000671#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 if (n < 0)
674 return -1;
675 if (n == 0)
676 return 1;
677 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678}
679
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000680static int
681internal_select(PySocketSockObject *s, int writing)
682{
683 return internal_select_ex(s, writing, s->sock_timeout);
684}
685
686/*
687 Two macros for automatic retry of select() in case of false positives
688 (for example, select() could indicate a socket is ready for reading
689 but the data then discarded by the OS because of a wrong checksum).
690 Here is an example of use:
691
692 BEGIN_SELECT_LOOP(s)
693 Py_BEGIN_ALLOW_THREADS
694 timeout = internal_select_ex(s, 0, interval);
695 if (!timeout)
696 outlen = recv(s->sock_fd, cbuf, len, flags);
697 Py_END_ALLOW_THREADS
698 if (timeout == 1) {
699 PyErr_SetString(socket_timeout, "timed out");
700 return -1;
701 }
702 END_SELECT_LOOP(s)
703*/
704
705#define BEGIN_SELECT_LOOP(s) \
706 { \
707 _PyTime_timeval now, deadline = {0, 0}; \
708 double interval = s->sock_timeout; \
709 int has_timeout = s->sock_timeout > 0.0; \
710 if (has_timeout) { \
711 _PyTime_gettimeofday(&now); \
712 deadline = now; \
713 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
714 } \
715 while (1) { \
716 errno = 0; \
717
718#define END_SELECT_LOOP(s) \
719 if (!has_timeout || \
720 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
721 break; \
722 _PyTime_gettimeofday(&now); \
723 interval = _PyTime_INTERVAL(now, deadline); \
724 } \
725 } \
726
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000727/* Initialize a new socket object. */
728
Tim Petersa12b4cf2002-07-18 22:38:44 +0000729static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000730
Martin v. Löwis1a214512008-06-11 05:26:20 +0000731static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000732init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 s->sock_fd = fd;
736 s->sock_family = family;
737 s->sock_type = type;
738 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000741#ifdef SOCK_NONBLOCK
742 if (type & SOCK_NONBLOCK)
743 s->sock_timeout = 0.0;
744 else
745#endif
746 {
747 s->sock_timeout = defaulttimeout;
748 if (defaulttimeout >= 0.0)
749 internal_setblocking(s, 0);
750 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000751
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000752}
753
754
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755/* Create a new socket object.
756 This just creates the object and initializes it.
757 If the creation fails, return NULL and set an exception (implicit
758 in NEWOBJ()). */
759
Guido van Rossum73624e91994-10-10 17:59:00 +0000760static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000761new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 PySocketSockObject *s;
764 s = (PySocketSockObject *)
765 PyType_GenericNew(&sock_type, NULL, NULL);
766 if (s != NULL)
767 init_sockobject(s, fd, family, type, proto);
768 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769}
770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771
Guido van Rossum48a680c2001-03-02 06:34:14 +0000772/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000773 thread to be in gethostbyname or getaddrinfo */
774#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200775static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000776#endif
777
778
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779/* Convert a string specifying a host name or one of a few symbolic
780 names to a numeric IP address. This usually calls gethostbyname()
781 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000782 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783 an error occurred; then an exception is raised. */
784
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000786setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 struct addrinfo hints, *res;
789 int error;
790 int d1, d2, d3, d4;
791 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
794 if (name[0] == '\0') {
795 int siz;
796 memset(&hints, 0, sizeof(hints));
797 hints.ai_family = af;
798 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
799 hints.ai_flags = AI_PASSIVE;
800 Py_BEGIN_ALLOW_THREADS
801 ACQUIRE_GETADDRINFO_LOCK
802 error = getaddrinfo(NULL, "0", &hints, &res);
803 Py_END_ALLOW_THREADS
804 /* We assume that those thread-unsafe getaddrinfo() versions
805 *are* safe regarding their return value, ie. that a
806 subsequent call to getaddrinfo() does not destroy the
807 outcome of the first call. */
808 RELEASE_GETADDRINFO_LOCK
809 if (error) {
810 set_gaierror(error);
811 return -1;
812 }
813 switch (res->ai_family) {
814 case AF_INET:
815 siz = 4;
816 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000817#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 case AF_INET6:
819 siz = 16;
820 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 default:
823 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200824 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 "unsupported address family");
826 return -1;
827 }
828 if (res->ai_next) {
829 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200830 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 "wildcard resolved to multiple address");
832 return -1;
833 }
834 if (res->ai_addrlen < addr_ret_size)
835 addr_ret_size = res->ai_addrlen;
836 memcpy(addr_ret, res->ai_addr, addr_ret_size);
837 freeaddrinfo(res);
838 return siz;
839 }
840 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
841 struct sockaddr_in *sin;
842 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200843 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 "address family mismatched");
845 return -1;
846 }
847 sin = (struct sockaddr_in *)addr_ret;
848 memset((void *) sin, '\0', sizeof(*sin));
849 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 sin->sin_addr.s_addr = INADDR_BROADCAST;
854 return sizeof(sin->sin_addr);
855 }
856 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
857 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
858 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
859 struct sockaddr_in *sin;
860 sin = (struct sockaddr_in *)addr_ret;
861 sin->sin_addr.s_addr = htonl(
862 ((long) d1 << 24) | ((long) d2 << 16) |
863 ((long) d3 << 8) | ((long) d4 << 0));
864 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000865#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 return 4;
869 }
870 memset(&hints, 0, sizeof(hints));
871 hints.ai_family = af;
872 Py_BEGIN_ALLOW_THREADS
873 ACQUIRE_GETADDRINFO_LOCK
874 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000875#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 if (error == EAI_NONAME && af == AF_UNSPEC) {
877 /* On Tru64 V5.1, numeric-to-addr conversion fails
878 if no address family is given. Assume IPv4 for now.*/
879 hints.ai_family = AF_INET;
880 error = getaddrinfo(name, NULL, &hints, &res);
881 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 Py_END_ALLOW_THREADS
884 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
885 if (error) {
886 set_gaierror(error);
887 return -1;
888 }
889 if (res->ai_addrlen < addr_ret_size)
890 addr_ret_size = res->ai_addrlen;
891 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
892 freeaddrinfo(res);
893 switch (addr_ret->sa_family) {
894 case AF_INET:
895 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000896#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 case AF_INET6:
898 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200901 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 return -1;
903 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904}
905
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907/* Create a string object representing an IP address.
908 This is always a string of the form 'dd.dd.dd.dd' (with variable
909 size numbers). */
910
Guido van Rossum73624e91994-10-10 17:59:00 +0000911static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000912makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 char buf[NI_MAXHOST];
915 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
918 NI_NUMERICHOST);
919 if (error) {
920 set_gaierror(error);
921 return NULL;
922 }
923 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924}
925
926
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000927#ifdef USE_BLUETOOTH
928/* Convert a string representation of a Bluetooth address into a numeric
929 address. Returns the length (6), or raises an exception and returns -1 if
930 an error occurred. */
931
932static int
933setbdaddr(char *name, bdaddr_t *bdaddr)
934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 unsigned int b0, b1, b2, b3, b4, b5;
936 char ch;
937 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
940 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
941 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
942 bdaddr->b[0] = b0;
943 bdaddr->b[1] = b1;
944 bdaddr->b[2] = b2;
945 bdaddr->b[3] = b3;
946 bdaddr->b[4] = b4;
947 bdaddr->b[5] = b5;
948 return 6;
949 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200950 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 return -1;
952 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000953}
954
955/* Create a string representation of the Bluetooth address. This is always a
956 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
957 value (zero padded if necessary). */
958
959static PyObject *
960makebdaddr(bdaddr_t *bdaddr)
961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
965 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
966 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
967 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000968}
969#endif
970
971
Guido van Rossum30a685f1991-06-27 15:51:29 +0000972/* Create an object representing the given socket address,
973 suitable for passing it back to bind(), connect() etc.
974 The family field of the sockaddr structure is inspected
975 to determine what kind of address it really is. */
976
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000978static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000979makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 if (addrlen == 0) {
982 /* No address -- may be recvfrom() from known socket */
983 Py_INCREF(Py_None);
984 return Py_None;
985 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 case AF_INET:
990 {
991 struct sockaddr_in *a;
992 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
993 PyObject *ret = NULL;
994 if (addrobj) {
995 a = (struct sockaddr_in *)addr;
996 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
997 Py_DECREF(addrobj);
998 }
999 return ret;
1000 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001001
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001002#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 case AF_UNIX:
1004 {
1005 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001006#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1008 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001009 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 }
1011 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 {
1014 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001015 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 }
1017 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001018#endif /* AF_UNIX */
1019
Martin v. Löwis11017b12006-01-14 18:12:57 +00001020#if defined(AF_NETLINK)
1021 case AF_NETLINK:
1022 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1024 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001025 }
1026#endif /* AF_NETLINK */
1027
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001028#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 case AF_INET6:
1030 {
1031 struct sockaddr_in6 *a;
1032 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1033 PyObject *ret = NULL;
1034 if (addrobj) {
1035 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001036 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 addrobj,
1038 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001039 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 a->sin6_scope_id);
1041 Py_DECREF(addrobj);
1042 }
1043 return ret;
1044 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001045#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001047#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 case AF_BLUETOOTH:
1049 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case BTPROTO_L2CAP:
1052 {
1053 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1054 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1055 PyObject *ret = NULL;
1056 if (addrobj) {
1057 ret = Py_BuildValue("Oi",
1058 addrobj,
1059 _BT_L2_MEMB(a, psm));
1060 Py_DECREF(addrobj);
1061 }
1062 return ret;
1063 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case BTPROTO_RFCOMM:
1066 {
1067 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1068 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1069 PyObject *ret = NULL;
1070 if (addrobj) {
1071 ret = Py_BuildValue("Oi",
1072 addrobj,
1073 _BT_RC_MEMB(a, channel));
1074 Py_DECREF(addrobj);
1075 }
1076 return ret;
1077 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 case BTPROTO_HCI:
1080 {
1081 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001082#if defined(__NetBSD__) || defined(__DragonFly__)
1083 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1084#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 PyObject *ret = NULL;
1086 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1087 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001090
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001091#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 case BTPROTO_SCO:
1093 {
1094 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1095 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1096 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097#endif
1098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 default:
1100 PyErr_SetString(PyExc_ValueError,
1101 "Unknown Bluetooth protocol");
1102 return NULL;
1103 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001104#endif
1105
Antoine Pitroub156a462010-10-27 20:13:57 +00001106#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 case AF_PACKET:
1108 {
1109 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1110 char *ifname = "";
1111 struct ifreq ifr;
1112 /* need to look up interface name give index */
1113 if (a->sll_ifindex) {
1114 ifr.ifr_ifindex = a->sll_ifindex;
1115 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1116 ifname = ifr.ifr_name;
1117 }
1118 return Py_BuildValue("shbhy#",
1119 ifname,
1120 ntohs(a->sll_protocol),
1121 a->sll_pkttype,
1122 a->sll_hatype,
1123 a->sll_addr,
1124 a->sll_halen);
1125 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001126#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001127
Christian Heimes043d6f62008-01-07 17:19:16 +00001128#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 case AF_TIPC:
1130 {
1131 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1132 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1133 return Py_BuildValue("IIIII",
1134 a->addrtype,
1135 a->addr.nameseq.type,
1136 a->addr.nameseq.lower,
1137 a->addr.nameseq.upper,
1138 a->scope);
1139 } else if (a->addrtype == TIPC_ADDR_NAME) {
1140 return Py_BuildValue("IIIII",
1141 a->addrtype,
1142 a->addr.name.name.type,
1143 a->addr.name.name.instance,
1144 a->addr.name.name.instance,
1145 a->scope);
1146 } else if (a->addrtype == TIPC_ADDR_ID) {
1147 return Py_BuildValue("IIIII",
1148 a->addrtype,
1149 a->addr.id.node,
1150 a->addr.id.ref,
1151 0,
1152 a->scope);
1153 } else {
1154 PyErr_SetString(PyExc_ValueError,
1155 "Invalid address type");
1156 return NULL;
1157 }
1158 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001159#endif
1160
Charles-François Natali30589c92011-10-07 22:47:08 +02001161#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001162 case AF_CAN:
1163 {
1164 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1165 char *ifname = "";
1166 struct ifreq ifr;
1167 /* need to look up interface name given index */
1168 if (a->can_ifindex) {
1169 ifr.ifr_ifindex = a->can_ifindex;
1170 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1171 ifname = ifr.ifr_name;
1172 }
1173
1174 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1175 ifname,
1176 a->can_family);
1177 }
1178#endif
1179
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001180#ifdef PF_SYSTEM
1181 case PF_SYSTEM:
1182 switch(proto) {
1183#ifdef SYSPROTO_CONTROL
1184 case SYSPROTO_CONTROL:
1185 {
1186 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1187 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1188 }
1189#endif
1190 default:
1191 PyErr_SetString(PyExc_ValueError,
1192 "Invalid address type");
1193 return 0;
1194 }
1195#endif
1196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 default:
1200 /* If we don't know the address family, don't raise an
1201 exception -- return it as an (int, bytes) tuple. */
1202 return Py_BuildValue("iy#",
1203 addr->sa_family,
1204 addr->sa_data,
1205 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001208}
1209
Guido van Rossum30a685f1991-06-27 15:51:29 +00001210
1211/* Parse a socket address argument according to the socket object's
1212 address family. Return 1 if the address was in the proper format,
1213 0 of not. The address is returned through addr_ret, its length
1214 through len_ret. */
1215
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001217getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001221
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001222#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 case AF_UNIX:
1224 {
1225 struct sockaddr_un* addr;
1226 char *path;
1227 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001228 int retval = 0;
1229
1230 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1231 allow embedded nulls on Linux. */
1232 if (PyUnicode_Check(args)) {
1233 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1234 return 0;
1235 }
1236 else
1237 Py_INCREF(args);
1238 if (!PyArg_Parse(args, "y#", &path, &len))
1239 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001242#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 if (len > 0 && path[0] == 0) {
1244 /* Linux abstract namespace extension */
1245 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001246 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001248 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 }
1250 }
1251 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001252#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 {
1254 /* regular NULL-terminated string */
1255 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001256 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001258 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 }
1260 addr->sun_path[len] = 0;
1261 }
1262 addr->sun_family = s->sock_family;
1263 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001265 retval = 1;
1266 unix_out:
1267 Py_DECREF(args);
1268 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001270#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271
Martin v. Löwis11017b12006-01-14 18:12:57 +00001272#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 case AF_NETLINK:
1274 {
1275 struct sockaddr_nl* addr;
1276 int pid, groups;
1277 addr = (struct sockaddr_nl *)addr_ret;
1278 if (!PyTuple_Check(args)) {
1279 PyErr_Format(
1280 PyExc_TypeError,
1281 "getsockaddrarg: "
1282 "AF_NETLINK address must be tuple, not %.500s",
1283 Py_TYPE(args)->tp_name);
1284 return 0;
1285 }
1286 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1287 return 0;
1288 addr->nl_family = AF_NETLINK;
1289 addr->nl_pid = pid;
1290 addr->nl_groups = groups;
1291 *len_ret = sizeof(*addr);
1292 return 1;
1293 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001294#endif
1295
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001296#ifdef AF_RDS
1297 case AF_RDS:
1298 /* RDS sockets use sockaddr_in: fall-through */
1299#endif
1300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 case AF_INET:
1302 {
1303 struct sockaddr_in* addr;
1304 char *host;
1305 int port, result;
1306 if (!PyTuple_Check(args)) {
1307 PyErr_Format(
1308 PyExc_TypeError,
1309 "getsockaddrarg: "
1310 "AF_INET address must be tuple, not %.500s",
1311 Py_TYPE(args)->tp_name);
1312 return 0;
1313 }
1314 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1315 "idna", &host, &port))
1316 return 0;
1317 addr=(struct sockaddr_in*)addr_ret;
1318 result = setipaddr(host, (struct sockaddr *)addr,
1319 sizeof(*addr), AF_INET);
1320 PyMem_Free(host);
1321 if (result < 0)
1322 return 0;
1323 if (port < 0 || port > 0xffff) {
1324 PyErr_SetString(
1325 PyExc_OverflowError,
1326 "getsockaddrarg: port must be 0-65535.");
1327 return 0;
1328 }
1329 addr->sin_family = AF_INET;
1330 addr->sin_port = htons((short)port);
1331 *len_ret = sizeof *addr;
1332 return 1;
1333 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001334
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001335#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case AF_INET6:
1337 {
1338 struct sockaddr_in6* addr;
1339 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001340 int port, result;
1341 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 flowinfo = scope_id = 0;
1343 if (!PyTuple_Check(args)) {
1344 PyErr_Format(
1345 PyExc_TypeError,
1346 "getsockaddrarg: "
1347 "AF_INET6 address must be tuple, not %.500s",
1348 Py_TYPE(args)->tp_name);
1349 return 0;
1350 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001351 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 "idna", &host, &port, &flowinfo,
1353 &scope_id)) {
1354 return 0;
1355 }
1356 addr = (struct sockaddr_in6*)addr_ret;
1357 result = setipaddr(host, (struct sockaddr *)addr,
1358 sizeof(*addr), AF_INET6);
1359 PyMem_Free(host);
1360 if (result < 0)
1361 return 0;
1362 if (port < 0 || port > 0xffff) {
1363 PyErr_SetString(
1364 PyExc_OverflowError,
1365 "getsockaddrarg: port must be 0-65535.");
1366 return 0;
1367 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001368 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001369 PyErr_SetString(
1370 PyExc_OverflowError,
1371 "getsockaddrarg: flowinfo must be 0-1048575.");
1372 return 0;
1373 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 addr->sin6_family = s->sock_family;
1375 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001376 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 addr->sin6_scope_id = scope_id;
1378 *len_ret = sizeof *addr;
1379 return 1;
1380 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001381#endif
1382
Hye-Shik Chang81268602004-02-02 06:05:24 +00001383#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 case AF_BLUETOOTH:
1385 {
1386 switch (s->sock_proto) {
1387 case BTPROTO_L2CAP:
1388 {
1389 struct sockaddr_l2 *addr;
1390 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 addr = (struct sockaddr_l2 *)addr_ret;
1393 memset(addr, 0, sizeof(struct sockaddr_l2));
1394 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1395 if (!PyArg_ParseTuple(args, "si", &straddr,
1396 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001397 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 "wrong format");
1399 return 0;
1400 }
1401 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1402 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 *len_ret = sizeof *addr;
1405 return 1;
1406 }
1407 case BTPROTO_RFCOMM:
1408 {
1409 struct sockaddr_rc *addr;
1410 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 addr = (struct sockaddr_rc *)addr_ret;
1413 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1414 if (!PyArg_ParseTuple(args, "si", &straddr,
1415 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001416 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 "wrong format");
1418 return 0;
1419 }
1420 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1421 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 *len_ret = sizeof *addr;
1424 return 1;
1425 }
1426 case BTPROTO_HCI:
1427 {
1428 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001429#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001430 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001431
Alexander Belopolskye239d232010-12-08 23:31:48 +00001432 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001433 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001434 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001435 "wrong format");
1436 return 0;
1437 }
1438 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1439 return 0;
1440#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1442 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001443 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 "wrong format");
1445 return 0;
1446 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 *len_ret = sizeof *addr;
1449 return 1;
1450 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001451#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 case BTPROTO_SCO:
1453 {
1454 struct sockaddr_sco *addr;
1455 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 addr = (struct sockaddr_sco *)addr_ret;
1458 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1459 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001460 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 "wrong format");
1462 return 0;
1463 }
1464 straddr = PyBytes_AS_STRING(args);
1465 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1466 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 *len_ret = sizeof *addr;
1469 return 1;
1470 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001473 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 return 0;
1475 }
1476 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001477#endif
1478
Antoine Pitroub156a462010-10-27 20:13:57 +00001479#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 case AF_PACKET:
1481 {
1482 struct sockaddr_ll* addr;
1483 struct ifreq ifr;
1484 char *interfaceName;
1485 int protoNumber;
1486 int hatype = 0;
1487 int pkttype = 0;
1488 char *haddr = NULL;
1489 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 if (!PyTuple_Check(args)) {
1492 PyErr_Format(
1493 PyExc_TypeError,
1494 "getsockaddrarg: "
1495 "AF_PACKET address must be tuple, not %.500s",
1496 Py_TYPE(args)->tp_name);
1497 return 0;
1498 }
1499 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1500 &protoNumber, &pkttype, &hatype,
1501 &haddr, &halen))
1502 return 0;
1503 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1504 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1505 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1506 s->errorhandler();
1507 return 0;
1508 }
1509 if (halen > 8) {
1510 PyErr_SetString(PyExc_ValueError,
1511 "Hardware address must be 8 bytes or less");
1512 return 0;
1513 }
1514 if (protoNumber < 0 || protoNumber > 0xffff) {
1515 PyErr_SetString(
1516 PyExc_OverflowError,
1517 "getsockaddrarg: protoNumber must be 0-65535.");
1518 return 0;
1519 }
1520 addr = (struct sockaddr_ll*)addr_ret;
1521 addr->sll_family = AF_PACKET;
1522 addr->sll_protocol = htons((short)protoNumber);
1523 addr->sll_ifindex = ifr.ifr_ifindex;
1524 addr->sll_pkttype = pkttype;
1525 addr->sll_hatype = hatype;
1526 if (halen != 0) {
1527 memcpy(&addr->sll_addr, haddr, halen);
1528 }
1529 addr->sll_halen = halen;
1530 *len_ret = sizeof *addr;
1531 return 1;
1532 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001533#endif
1534
Christian Heimes043d6f62008-01-07 17:19:16 +00001535#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 case AF_TIPC:
1537 {
1538 unsigned int atype, v1, v2, v3;
1539 unsigned int scope = TIPC_CLUSTER_SCOPE;
1540 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 if (!PyTuple_Check(args)) {
1543 PyErr_Format(
1544 PyExc_TypeError,
1545 "getsockaddrarg: "
1546 "AF_TIPC address must be tuple, not %.500s",
1547 Py_TYPE(args)->tp_name);
1548 return 0;
1549 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 if (!PyArg_ParseTuple(args,
1552 "IIII|I;Invalid TIPC address format",
1553 &atype, &v1, &v2, &v3, &scope))
1554 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 addr = (struct sockaddr_tipc *) addr_ret;
1557 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 addr->family = AF_TIPC;
1560 addr->scope = scope;
1561 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (atype == TIPC_ADDR_NAMESEQ) {
1564 addr->addr.nameseq.type = v1;
1565 addr->addr.nameseq.lower = v2;
1566 addr->addr.nameseq.upper = v3;
1567 } else if (atype == TIPC_ADDR_NAME) {
1568 addr->addr.name.name.type = v1;
1569 addr->addr.name.name.instance = v2;
1570 } else if (atype == TIPC_ADDR_ID) {
1571 addr->addr.id.node = v1;
1572 addr->addr.id.ref = v2;
1573 } else {
1574 /* Shouldn't happen */
1575 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1576 return 0;
1577 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 return 1;
1582 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001583#endif
1584
Charles-François Natali30589c92011-10-07 22:47:08 +02001585#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001586 case AF_CAN:
1587 switch (s->sock_proto) {
1588 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001589 /* fall-through */
1590 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001591 {
1592 struct sockaddr_can *addr;
1593 PyObject *interfaceName;
1594 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001595 Py_ssize_t len;
1596
Benjamin Peterson18b71912013-05-16 15:29:44 -05001597 addr = (struct sockaddr_can *)addr_ret;
1598
Charles-François Natali47413c12011-10-06 19:47:44 +02001599 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1600 &interfaceName))
1601 return 0;
1602
1603 len = PyBytes_GET_SIZE(interfaceName);
1604
1605 if (len == 0) {
1606 ifr.ifr_ifindex = 0;
1607 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001608 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1609 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001610 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1611 s->errorhandler();
1612 Py_DECREF(interfaceName);
1613 return 0;
1614 }
1615 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001616 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001617 "AF_CAN interface name too long");
1618 Py_DECREF(interfaceName);
1619 return 0;
1620 }
1621
1622 addr->can_family = AF_CAN;
1623 addr->can_ifindex = ifr.ifr_ifindex;
1624
1625 *len_ret = sizeof(*addr);
1626 Py_DECREF(interfaceName);
1627 return 1;
1628 }
1629 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001630 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001631 "getsockaddrarg: unsupported CAN protocol");
1632 return 0;
1633 }
1634#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001635
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001636#ifdef PF_SYSTEM
1637 case PF_SYSTEM:
1638 switch (s->sock_proto) {
1639#ifdef SYSPROTO_CONTROL
1640 case SYSPROTO_CONTROL:
1641 {
1642 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001643
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001644 addr = (struct sockaddr_ctl *)addr_ret;
1645 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001646 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001647
1648 if (PyUnicode_Check(args)) {
1649 struct ctl_info info;
1650 PyObject *ctl_name;
1651
1652 if (!PyArg_Parse(args, "O&",
1653 PyUnicode_FSConverter, &ctl_name)) {
1654 return 0;
1655 }
1656
1657 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1658 PyErr_SetString(PyExc_ValueError,
1659 "provided string is too long");
1660 Py_DECREF(ctl_name);
1661 return 0;
1662 }
1663 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1664 sizeof(info.ctl_name));
1665 Py_DECREF(ctl_name);
1666
1667 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1668 PyErr_SetString(PyExc_OSError,
1669 "cannot find kernel control with provided name");
1670 return 0;
1671 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001672
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001673 addr->sc_id = info.ctl_id;
1674 addr->sc_unit = 0;
1675 } else if (!PyArg_ParseTuple(args, "II",
1676 &(addr->sc_id), &(addr->sc_unit))) {
1677 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1678 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001679
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001680 return 0;
1681 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001682
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001683 *len_ret = sizeof(*addr);
1684 return 1;
1685 }
1686#endif
1687 default:
1688 PyErr_SetString(PyExc_OSError,
1689 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1690 return 0;
1691 }
1692#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001697 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001701}
1702
Guido van Rossum30a685f1991-06-27 15:51:29 +00001703
Guido van Rossum48a680c2001-03-02 06:34:14 +00001704/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001705 Return 1 if the family is known, 0 otherwise. The length is returned
1706 through len_ret. */
1707
1708static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001709getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001712
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001713#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 case AF_UNIX:
1715 {
1716 *len_ret = sizeof (struct sockaddr_un);
1717 return 1;
1718 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001719#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001720#if defined(AF_NETLINK)
1721 case AF_NETLINK:
1722 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 *len_ret = sizeof (struct sockaddr_nl);
1724 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001725 }
1726#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001727
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001728#ifdef AF_RDS
1729 case AF_RDS:
1730 /* RDS sockets use sockaddr_in: fall-through */
1731#endif
1732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 case AF_INET:
1734 {
1735 *len_ret = sizeof (struct sockaddr_in);
1736 return 1;
1737 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001738
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001739#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 case AF_INET6:
1741 {
1742 *len_ret = sizeof (struct sockaddr_in6);
1743 return 1;
1744 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001745#endif
1746
Hye-Shik Chang81268602004-02-02 06:05:24 +00001747#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 case AF_BLUETOOTH:
1749 {
1750 switch(s->sock_proto)
1751 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 case BTPROTO_L2CAP:
1754 *len_ret = sizeof (struct sockaddr_l2);
1755 return 1;
1756 case BTPROTO_RFCOMM:
1757 *len_ret = sizeof (struct sockaddr_rc);
1758 return 1;
1759 case BTPROTO_HCI:
1760 *len_ret = sizeof (struct sockaddr_hci);
1761 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001762#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 case BTPROTO_SCO:
1764 *len_ret = sizeof (struct sockaddr_sco);
1765 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001768 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 "unknown BT protocol");
1770 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 }
1773 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001774#endif
1775
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001776#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 case AF_PACKET:
1778 {
1779 *len_ret = sizeof (struct sockaddr_ll);
1780 return 1;
1781 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001782#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001783
Christian Heimes043d6f62008-01-07 17:19:16 +00001784#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 case AF_TIPC:
1786 {
1787 *len_ret = sizeof (struct sockaddr_tipc);
1788 return 1;
1789 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001790#endif
1791
Charles-François Natali30589c92011-10-07 22:47:08 +02001792#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001793 case AF_CAN:
1794 {
1795 *len_ret = sizeof (struct sockaddr_can);
1796 return 1;
1797 }
1798#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001799
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001800#ifdef PF_SYSTEM
1801 case PF_SYSTEM:
1802 switch(s->sock_proto) {
1803#ifdef SYSPROTO_CONTROL
1804 case SYSPROTO_CONTROL:
1805 *len_ret = sizeof (struct sockaddr_ctl);
1806 return 1;
1807#endif
1808 default:
1809 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1810 "unknown PF_SYSTEM protocol");
1811 return 0;
1812 }
1813#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001818 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001822}
1823
1824
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001825/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1826 Currently, these methods are only compiled if the RFC 2292/3542
1827 CMSG_LEN() macro is available. Older systems seem to have used
1828 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1829 it may be possible to define CMSG_LEN() that way if it's not
1830 provided. Some architectures might need extra padding after the
1831 cmsghdr, however, and CMSG_LEN() would have to take account of
1832 this. */
1833#ifdef CMSG_LEN
1834/* If length is in range, set *result to CMSG_LEN(length) and return
1835 true; otherwise, return false. */
1836static int
1837get_CMSG_LEN(size_t length, size_t *result)
1838{
1839 size_t tmp;
1840
1841 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1842 return 0;
1843 tmp = CMSG_LEN(length);
1844 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1845 return 0;
1846 *result = tmp;
1847 return 1;
1848}
1849
1850#ifdef CMSG_SPACE
1851/* If length is in range, set *result to CMSG_SPACE(length) and return
1852 true; otherwise, return false. */
1853static int
1854get_CMSG_SPACE(size_t length, size_t *result)
1855{
1856 size_t tmp;
1857
1858 /* Use CMSG_SPACE(1) here in order to take account of the padding
1859 necessary before *and* after the data. */
1860 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1861 return 0;
1862 tmp = CMSG_SPACE(length);
1863 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1864 return 0;
1865 *result = tmp;
1866 return 1;
1867}
1868#endif
1869
1870/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1871 pointer in msg->msg_control with at least "space" bytes after it,
1872 and its cmsg_len member inside the buffer. */
1873static int
1874cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1875{
1876 size_t cmsg_offset;
1877 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1878 sizeof(cmsgh->cmsg_len));
1879
Charles-François Natali466517d2011-08-28 18:23:43 +02001880 /* Note that POSIX allows msg_controllen to be of signed type. */
1881 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001882 return 0;
1883 if (space < cmsg_len_end)
1884 space = cmsg_len_end;
1885 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1886 return (cmsg_offset <= (size_t)-1 - space &&
1887 cmsg_offset + space <= msg->msg_controllen);
1888}
1889
1890/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1891 *space to number of bytes following it in the buffer and return
1892 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1893 msg->msg_controllen are valid. */
1894static int
1895get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1896{
1897 size_t data_offset;
1898 char *data_ptr;
1899
1900 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1901 return 0;
1902 data_offset = data_ptr - (char *)msg->msg_control;
1903 if (data_offset > msg->msg_controllen)
1904 return 0;
1905 *space = msg->msg_controllen - data_offset;
1906 return 1;
1907}
1908
1909/* If cmsgh is invalid or not contained in the buffer pointed to by
1910 msg->msg_control, return -1. If cmsgh is valid and its associated
1911 data is entirely contained in the buffer, set *data_len to the
1912 length of the associated data and return 0. If only part of the
1913 associated data is contained in the buffer but cmsgh is otherwise
1914 valid, set *data_len to the length contained in the buffer and
1915 return 1. */
1916static int
1917get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1918{
1919 size_t space, cmsg_data_len;
1920
1921 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1922 cmsgh->cmsg_len < CMSG_LEN(0))
1923 return -1;
1924 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1925 if (!get_cmsg_data_space(msg, cmsgh, &space))
1926 return -1;
1927 if (space >= cmsg_data_len) {
1928 *data_len = cmsg_data_len;
1929 return 0;
1930 }
1931 *data_len = space;
1932 return 1;
1933}
1934#endif /* CMSG_LEN */
1935
1936
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001937/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001938
Guido van Rossum73624e91994-10-10 17:59:00 +00001939static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001940sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 sock_addr_t addrbuf;
1943 SOCKET_T newfd = INVALID_SOCKET;
1944 socklen_t addrlen;
1945 PyObject *sock = NULL;
1946 PyObject *addr = NULL;
1947 PyObject *res = NULL;
1948 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001949#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1950 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
1951 static int accept4_works = -1;
1952#endif
1953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 if (!getsockaddrlen(s, &addrlen))
1955 return NULL;
1956 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 if (!IS_SELECTABLE(s))
1959 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001960
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001961 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001964 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001965 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001966#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1967 if (accept4_works != 0) {
1968 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
1969 SOCK_CLOEXEC);
1970 if (newfd == INVALID_SOCKET && accept4_works == -1) {
1971 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
1972 accept4_works = (errno != ENOSYS);
1973 }
1974 }
1975 if (accept4_works == 0)
1976 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1977#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001979#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00001980 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 if (timeout == 1) {
1984 PyErr_SetString(socket_timeout, "timed out");
1985 return NULL;
1986 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001987 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 if (newfd == INVALID_SOCKET)
1990 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001991
Victor Stinnerdaf45552013-08-28 00:53:59 +02001992#ifdef MS_WINDOWS
1993 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
1994 PyErr_SetFromWindowsErr(0);
1995 SOCKETCLOSE(newfd);
1996 goto finally;
1997 }
1998#else
1999
2000#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2001 if (!accept4_works)
2002#endif
2003 {
2004 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2005 SOCKETCLOSE(newfd);
2006 goto finally;
2007 }
2008 }
2009#endif
2010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 sock = PyLong_FromSocket_t(newfd);
2012 if (sock == NULL) {
2013 SOCKETCLOSE(newfd);
2014 goto finally;
2015 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2018 addrlen, s->sock_proto);
2019 if (addr == NULL)
2020 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002023
Guido van Rossum67f7a382002-06-06 21:08:16 +00002024finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 Py_XDECREF(sock);
2026 Py_XDECREF(addr);
2027 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002028}
2029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002030PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002031"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002032\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002033Wait for an incoming connection. Return a new socket file descriptor\n\
2034representing the connection, and the address of the client.\n\
2035For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002036
Guido van Rossum11ba0942002-06-13 15:07:44 +00002037/* s.setblocking(flag) method. Argument:
2038 False -- non-blocking mode; same as settimeout(0)
2039 True -- blocking mode; same as settimeout(None)
2040*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002041
Guido van Rossum73624e91994-10-10 17:59:00 +00002042static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002043sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002044{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002045 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 block = PyLong_AsLong(arg);
2048 if (block == -1 && PyErr_Occurred())
2049 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 s->sock_timeout = block ? -1.0 : 0.0;
2052 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 Py_INCREF(Py_None);
2055 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002056}
Guido van Rossume4485b01994-09-07 14:32:49 +00002057
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002058PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002059"setblocking(flag)\n\
2060\n\
2061Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002062setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002063setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002064
Guido van Rossum11ba0942002-06-13 15:07:44 +00002065/* s.settimeout(timeout) method. Argument:
2066 None -- no timeout, blocking mode; same as setblocking(True)
2067 0.0 -- non-blocking mode; same as setblocking(False)
2068 > 0 -- timeout mode; operations time out after timeout seconds
2069 < 0 -- illegal; raises an exception
2070*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002071static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002072sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 if (arg == Py_None)
2077 timeout = -1.0;
2078 else {
2079 timeout = PyFloat_AsDouble(arg);
2080 if (timeout < 0.0) {
2081 if (!PyErr_Occurred())
2082 PyErr_SetString(PyExc_ValueError,
2083 "Timeout value out of range");
2084 return NULL;
2085 }
2086 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 s->sock_timeout = timeout;
2089 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 Py_INCREF(Py_None);
2092 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002093}
2094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002096"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002097\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002098Set a timeout on socket operations. 'timeout' can be a float,\n\
2099giving in seconds, or None. Setting a timeout of None disables\n\
2100the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002101Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002102
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002103/* s.gettimeout() method.
2104 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002105static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002106sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (s->sock_timeout < 0.0) {
2109 Py_INCREF(Py_None);
2110 return Py_None;
2111 }
2112 else
2113 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002114}
2115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002116PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002117"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002118\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002119Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002120operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002121operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002122
Guido van Rossumaee08791992-09-08 09:05:33 +00002123/* s.setsockopt() method.
2124 With an integer third argument, sets an integer option.
2125 With a string third argument, sets an option from a buffer;
2126 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002127
Guido van Rossum73624e91994-10-10 17:59:00 +00002128static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002129sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 int level;
2132 int optname;
2133 int res;
2134 char *buf;
2135 int buflen;
2136 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 if (PyArg_ParseTuple(args, "iii:setsockopt",
2139 &level, &optname, &flag)) {
2140 buf = (char *) &flag;
2141 buflen = sizeof flag;
2142 }
2143 else {
2144 PyErr_Clear();
2145 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2146 &level, &optname, &buf, &buflen))
2147 return NULL;
2148 }
2149 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2150 if (res < 0)
2151 return s->errorhandler();
2152 Py_INCREF(Py_None);
2153 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002154}
2155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002156PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002157"setsockopt(level, option, value)\n\
2158\n\
2159Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002160The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002161
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002162
Guido van Rossumaee08791992-09-08 09:05:33 +00002163/* s.getsockopt() method.
2164 With two arguments, retrieves an integer option.
2165 With a third integer argument, retrieves a string buffer of that size;
2166 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002167
Guido van Rossum73624e91994-10-10 17:59:00 +00002168static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002169sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 int level;
2172 int optname;
2173 int res;
2174 PyObject *buf;
2175 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2178 &level, &optname, &buflen))
2179 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 if (buflen == 0) {
2182 int flag = 0;
2183 socklen_t flagsize = sizeof flag;
2184 res = getsockopt(s->sock_fd, level, optname,
2185 (void *)&flag, &flagsize);
2186 if (res < 0)
2187 return s->errorhandler();
2188 return PyLong_FromLong(flag);
2189 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002190#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 /* socklen_t is unsigned so no negative test is needed,
2192 test buflen == 0 is previously done */
2193 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002194#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002196#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002197 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 "getsockopt buflen out of range");
2199 return NULL;
2200 }
2201 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2202 if (buf == NULL)
2203 return NULL;
2204 res = getsockopt(s->sock_fd, level, optname,
2205 (void *)PyBytes_AS_STRING(buf), &buflen);
2206 if (res < 0) {
2207 Py_DECREF(buf);
2208 return s->errorhandler();
2209 }
2210 _PyBytes_Resize(&buf, buflen);
2211 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002212}
2213
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002214PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002215"getsockopt(level, option[, buffersize]) -> value\n\
2216\n\
2217Get a socket option. See the Unix manual for level and option.\n\
2218If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002219string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002220
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002221
Fred Drake728819a2000-07-01 03:40:12 +00002222/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002223
Guido van Rossum73624e91994-10-10 17:59:00 +00002224static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002225sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 sock_addr_t addrbuf;
2228 int addrlen;
2229 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2232 return NULL;
2233 Py_BEGIN_ALLOW_THREADS
2234 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2235 Py_END_ALLOW_THREADS
2236 if (res < 0)
2237 return s->errorhandler();
2238 Py_INCREF(Py_None);
2239 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002240}
2241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002242PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002243"bind(address)\n\
2244\n\
2245Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002246pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002247sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002248
Guido van Rossum30a685f1991-06-27 15:51:29 +00002249
2250/* s.close() method.
2251 Set the file descriptor to -1 so operations tried subsequently
2252 will surely fail. */
2253
Guido van Rossum73624e91994-10-10 17:59:00 +00002254static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002255sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if ((fd = s->sock_fd) != -1) {
2260 s->sock_fd = -1;
2261 Py_BEGIN_ALLOW_THREADS
2262 (void) SOCKETCLOSE(fd);
2263 Py_END_ALLOW_THREADS
2264 }
2265 Py_INCREF(Py_None);
2266 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002267}
2268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002269PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002270"close()\n\
2271\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002272Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002273
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002274static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002275sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002276{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002277 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002278 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002279 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002280}
2281
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002282PyDoc_STRVAR(detach_doc,
2283"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002284\n\
2285Close the socket object without closing the underlying file descriptor.\
2286The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002287can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002288
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002289static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002290internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 timeout = 0;
2296 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002297
2298#ifdef MS_WINDOWS
2299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 if (s->sock_timeout > 0.0) {
2301 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2302 IS_SELECTABLE(s)) {
2303 /* This is a mess. Best solution: trust select */
2304 fd_set fds;
2305 fd_set fds_exc;
2306 struct timeval tv;
2307 tv.tv_sec = (int)s->sock_timeout;
2308 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2309 FD_ZERO(&fds);
2310 FD_SET(s->sock_fd, &fds);
2311 FD_ZERO(&fds_exc);
2312 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002313 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2314 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 if (res == 0) {
2316 res = WSAEWOULDBLOCK;
2317 timeout = 1;
2318 } else if (res > 0) {
2319 if (FD_ISSET(s->sock_fd, &fds))
2320 /* The socket is in the writable set - this
2321 means connected */
2322 res = 0;
2323 else {
2324 /* As per MS docs, we need to call getsockopt()
2325 to get the underlying error */
2326 int res_size = sizeof res;
2327 /* It must be in the exception set */
2328 assert(FD_ISSET(s->sock_fd, &fds_exc));
2329 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2330 (char *)&res, &res_size))
2331 /* getsockopt also clears WSAGetLastError,
2332 so reset it back. */
2333 WSASetLastError(res);
2334 else
2335 res = WSAGetLastError();
2336 }
2337 }
2338 /* else if (res < 0) an error occurred */
2339 }
2340 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 if (res < 0)
2343 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002344
2345#else
2346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 if (s->sock_timeout > 0.0) {
2348 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2349 timeout = internal_select(s, 1);
2350 if (timeout == 0) {
2351 /* Bug #1019808: in case of an EINPROGRESS,
2352 use getsockopt(SO_ERROR) to get the real
2353 error. */
2354 socklen_t res_size = sizeof res;
2355 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2356 SO_ERROR, &res, &res_size);
2357 if (res == EISCONN)
2358 res = 0;
2359 errno = res;
2360 }
2361 else if (timeout == -1) {
2362 res = errno; /* had error */
2363 }
2364 else
2365 res = EWOULDBLOCK; /* timed out */
2366 }
2367 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 if (res < 0)
2370 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002371
2372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002376}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002377
Fred Drake728819a2000-07-01 03:40:12 +00002378/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002379
Guido van Rossum73624e91994-10-10 17:59:00 +00002380static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 sock_addr_t addrbuf;
2384 int addrlen;
2385 int res;
2386 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2389 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 Py_BEGIN_ALLOW_THREADS
2392 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2393 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (timeout == 1) {
2396 PyErr_SetString(socket_timeout, "timed out");
2397 return NULL;
2398 }
2399 if (res != 0)
2400 return s->errorhandler();
2401 Py_INCREF(Py_None);
2402 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002403}
2404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002405PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002406"connect(address)\n\
2407\n\
2408Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002409is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002410
Guido van Rossum30a685f1991-06-27 15:51:29 +00002411
Fred Drake728819a2000-07-01 03:40:12 +00002412/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002413
2414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002415sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 sock_addr_t addrbuf;
2418 int addrlen;
2419 int res;
2420 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2423 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 Py_BEGIN_ALLOW_THREADS
2426 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2427 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 /* Signals are not errors (though they may raise exceptions). Adapted
2430 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002431#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (res == EINTR && PyErr_CheckSignals())
2433 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002434#endif
2435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002437}
2438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002439PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002440"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002441\n\
2442This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002445
Guido van Rossumed233a51992-06-23 09:07:03 +00002446/* s.fileno() method */
2447
Guido van Rossum73624e91994-10-10 17:59:00 +00002448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002449sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002452}
2453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002454PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002455"fileno() -> integer\n\
2456\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002457Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002458
Guido van Rossumed233a51992-06-23 09:07:03 +00002459
Guido van Rossumc89705d1992-11-26 08:54:07 +00002460/* s.getsockname() method */
2461
Guido van Rossum73624e91994-10-10 17:59:00 +00002462static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002463sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 sock_addr_t addrbuf;
2466 int res;
2467 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 if (!getsockaddrlen(s, &addrlen))
2470 return NULL;
2471 memset(&addrbuf, 0, addrlen);
2472 Py_BEGIN_ALLOW_THREADS
2473 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2474 Py_END_ALLOW_THREADS
2475 if (res < 0)
2476 return s->errorhandler();
2477 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2478 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002479}
2480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002481PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482"getsockname() -> address info\n\
2483\n\
2484Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002485info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002486
Guido van Rossumc89705d1992-11-26 08:54:07 +00002487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002489/* s.getpeername() method */
2490
Guido van Rossum73624e91994-10-10 17:59:00 +00002491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002492sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 sock_addr_t addrbuf;
2495 int res;
2496 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 if (!getsockaddrlen(s, &addrlen))
2499 return NULL;
2500 memset(&addrbuf, 0, addrlen);
2501 Py_BEGIN_ALLOW_THREADS
2502 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2503 Py_END_ALLOW_THREADS
2504 if (res < 0)
2505 return s->errorhandler();
2506 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2507 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002508}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002509
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002510PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002511"getpeername() -> address info\n\
2512\n\
2513Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515
Guido van Rossumb6775db1994-08-01 11:34:53 +00002516#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002517
2518
Guido van Rossum30a685f1991-06-27 15:51:29 +00002519/* s.listen(n) method */
2520
Guido van Rossum73624e91994-10-10 17:59:00 +00002521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002522sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 int backlog;
2525 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002526
Serhiy Storchaka78980432013-01-15 01:12:17 +02002527 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 if (backlog == -1 && PyErr_Occurred())
2529 return NULL;
2530 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002531 /* To avoid problems on systems that don't allow a negative backlog
2532 * (which doesn't make sense anyway) we force a minimum value of 0. */
2533 if (backlog < 0)
2534 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 res = listen(s->sock_fd, backlog);
2536 Py_END_ALLOW_THREADS
2537 if (res < 0)
2538 return s->errorhandler();
2539 Py_INCREF(Py_None);
2540 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002541}
2542
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002544"listen(backlog)\n\
2545\n\
2546Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002547least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2548unaccepted connections that the system will allow before refusing new\n\
2549connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002550
2551
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002553 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002554 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002555 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002556 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002557 * also possible that we return a number of bytes smaller than the request
2558 * bytes.
2559 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002560
Antoine Pitrou19467d22010-08-17 19:33:30 +00002561static Py_ssize_t
2562sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002563{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002564 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002566#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 int remaining;
2568 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002569#endif
2570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 if (!IS_SELECTABLE(s)) {
2572 select_error();
2573 return -1;
2574 }
2575 if (len == 0) {
2576 /* If 0 bytes were requested, do nothing. */
2577 return 0;
2578 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579
2580#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002581 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002583 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002584 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002585#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002586 if (len > INT_MAX)
2587 len = INT_MAX;
2588 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2589#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002591#endif
2592 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 if (timeout == 1) {
2596 PyErr_SetString(socket_timeout, "timed out");
2597 return -1;
2598 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002599 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 if (outlen < 0) {
2601 /* Note: the call to errorhandler() ALWAYS indirectly returned
2602 NULL, so ignore its return value */
2603 s->errorhandler();
2604 return -1;
2605 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 read_buf = cbuf;
2608 remaining = len;
2609 while (remaining != 0) {
2610 unsigned int segment;
2611 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 segment = remaining /SEGMENT_SIZE;
2614 if (segment != 0) {
2615 segment = SEGMENT_SIZE;
2616 }
2617 else {
2618 segment = remaining;
2619 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002620
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002621 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002623 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 if (!timeout)
2625 nread = recv(s->sock_fd, read_buf, segment, flags);
2626 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 if (timeout == 1) {
2628 PyErr_SetString(socket_timeout, "timed out");
2629 return -1;
2630 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002631 END_SELECT_LOOP(s)
2632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 if (nread < 0) {
2634 s->errorhandler();
2635 return -1;
2636 }
2637 if (nread != remaining) {
2638 read_buf += nread;
2639 break;
2640 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 remaining -= segment;
2643 read_buf += segment;
2644 }
2645 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002646#endif /* !__VMS */
2647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002649}
2650
Guido van Rossum48a680c2001-03-02 06:34:14 +00002651
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002652/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002653
Guido van Rossum73624e91994-10-10 17:59:00 +00002654static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002655sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002656{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002657 Py_ssize_t recvlen, outlen;
2658 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002660
Antoine Pitrou19467d22010-08-17 19:33:30 +00002661 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (recvlen < 0) {
2665 PyErr_SetString(PyExc_ValueError,
2666 "negative buffersize in recv");
2667 return NULL;
2668 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 /* Allocate a new string. */
2671 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2672 if (buf == NULL)
2673 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 /* Call the guts */
2676 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2677 if (outlen < 0) {
2678 /* An error occurred, release the string and return an
2679 error. */
2680 Py_DECREF(buf);
2681 return NULL;
2682 }
2683 if (outlen != recvlen) {
2684 /* We did not read as many bytes as we anticipated, resize the
2685 string if possible and be successful. */
2686 _PyBytes_Resize(&buf, outlen);
2687 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002690}
2691
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002692PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002693"recv(buffersize[, flags]) -> data\n\
2694\n\
2695Receive up to buffersize bytes from the socket. For the optional flags\n\
2696argument, see the Unix manual. When no data is available, block until\n\
2697at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002699
Guido van Rossum30a685f1991-06-27 15:51:29 +00002700
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002701/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002702
Thomas Wouters477c8d52006-05-27 19:21:47 +00002703static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002704sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002707
Antoine Pitrou19467d22010-08-17 19:33:30 +00002708 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 Py_buffer pbuf;
2710 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002711 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002714 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 &pbuf, &recvlen, &flags))
2716 return NULL;
2717 buf = pbuf.buf;
2718 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (recvlen < 0) {
2721 PyBuffer_Release(&pbuf);
2722 PyErr_SetString(PyExc_ValueError,
2723 "negative buffersize in recv_into");
2724 return NULL;
2725 }
2726 if (recvlen == 0) {
2727 /* If nbytes was not specified, use the buffer's length */
2728 recvlen = buflen;
2729 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 /* Check if the buffer is large enough */
2732 if (buflen < recvlen) {
2733 PyBuffer_Release(&pbuf);
2734 PyErr_SetString(PyExc_ValueError,
2735 "buffer too small for requested bytes");
2736 return NULL;
2737 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 /* Call the guts */
2740 readlen = sock_recv_guts(s, buf, recvlen, flags);
2741 if (readlen < 0) {
2742 /* Return an error. */
2743 PyBuffer_Release(&pbuf);
2744 return NULL;
2745 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 PyBuffer_Release(&pbuf);
2748 /* Return the number of bytes read. Note that we do not do anything
2749 special here in the case that readlen < recvlen. */
2750 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002751}
2752
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002753PyDoc_STRVAR(recv_into_doc,
2754"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002755\n\
2756A version of recv() that stores its data into a buffer rather than creating \n\
2757a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2758is not specified (or 0), receive up to the size available in the given buffer.\n\
2759\n\
2760See recv() for documentation about the flags.");
2761
2762
2763/*
Christian Heimes99170a52007-12-19 02:07:34 +00002764 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2765 * into a char buffer. If you have any inc/def ref to do to the objects that
2766 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002767 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002768 * that it is also possible that we return a number of bytes smaller than the
2769 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002770 *
2771 * 'addr' is a return value for the address object. Note that you must decref
2772 * it yourself.
2773 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002774static Py_ssize_t
2775sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 sock_addr_t addrbuf;
2779 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002780 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 if (!getsockaddrlen(s, &addrlen))
2786 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 if (!IS_SELECTABLE(s)) {
2789 select_error();
2790 return -1;
2791 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002792
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002793 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 Py_BEGIN_ALLOW_THREADS
2795 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002796 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002798#ifndef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002799 if (len > INT_MAX)
2800 len = INT_MAX;
2801 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002803#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 n = recvfrom(s->sock_fd, cbuf, len, flags,
2805 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 }
2808 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 if (timeout == 1) {
2811 PyErr_SetString(socket_timeout, "timed out");
2812 return -1;
2813 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002814 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 if (n < 0) {
2816 s->errorhandler();
2817 return -1;
2818 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2821 addrlen, s->sock_proto)))
2822 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002825}
2826
2827/* s.recvfrom(nbytes [,flags]) method */
2828
2829static PyObject *
2830sock_recvfrom(PySocketSockObject *s, PyObject *args)
2831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 PyObject *buf = NULL;
2833 PyObject *addr = NULL;
2834 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002835 int flags = 0;
2836 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002837
Antoine Pitrou19467d22010-08-17 19:33:30 +00002838 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 if (recvlen < 0) {
2842 PyErr_SetString(PyExc_ValueError,
2843 "negative buffersize in recvfrom");
2844 return NULL;
2845 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2848 if (buf == NULL)
2849 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2852 recvlen, flags, &addr);
2853 if (outlen < 0) {
2854 goto finally;
2855 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 if (outlen != recvlen) {
2858 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002859 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002861 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 goto finally;
2863 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002866
2867finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 Py_XDECREF(buf);
2869 Py_XDECREF(addr);
2870 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002871}
2872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002873PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002874"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2875\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002876Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002877
Thomas Wouters477c8d52006-05-27 19:21:47 +00002878
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002879/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002880
2881static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002882sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002885
Antoine Pitrou19467d22010-08-17 19:33:30 +00002886 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 Py_buffer pbuf;
2888 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002889 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002892
Antoine Pitrou19467d22010-08-17 19:33:30 +00002893 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 kwlist, &pbuf,
2895 &recvlen, &flags))
2896 return NULL;
2897 buf = pbuf.buf;
2898 buflen = pbuf.len;
2899 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 if (recvlen < 0) {
2902 PyBuffer_Release(&pbuf);
2903 PyErr_SetString(PyExc_ValueError,
2904 "negative buffersize in recvfrom_into");
2905 return NULL;
2906 }
2907 if (recvlen == 0) {
2908 /* If nbytes was not specified, use the buffer's length */
2909 recvlen = buflen;
2910 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2913 if (readlen < 0) {
2914 PyBuffer_Release(&pbuf);
2915 /* Return an error */
2916 Py_XDECREF(addr);
2917 return NULL;
2918 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 PyBuffer_Release(&pbuf);
2921 /* Return the number of bytes read and the address. Note that we do
2922 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002923 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002924}
2925
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002926PyDoc_STRVAR(recvfrom_into_doc,
2927"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002928\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002929Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002930
2931
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002932/* The sendmsg() and recvmsg[_into]() methods require a working
2933 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2934#ifdef CMSG_LEN
2935/*
2936 * Call recvmsg() with the supplied iovec structures, flags, and
2937 * ancillary data buffer size (controllen). Returns the tuple return
2938 * value for recvmsg() or recvmsg_into(), with the first item provided
2939 * by the supplied makeval() function. makeval() will be called with
2940 * the length read and makeval_data as arguments, and must return a
2941 * new reference (which will be decrefed if there is a subsequent
2942 * error). On error, closes any file descriptors received via
2943 * SCM_RIGHTS.
2944 */
2945static PyObject *
2946sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2947 int flags, Py_ssize_t controllen,
2948 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2949{
2950 ssize_t bytes_received = -1;
2951 int timeout;
2952 sock_addr_t addrbuf;
2953 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002954 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002955 PyObject *cmsg_list = NULL, *retval = NULL;
2956 void *controlbuf = NULL;
2957 struct cmsghdr *cmsgh;
2958 size_t cmsgdatalen = 0;
2959 int cmsg_status;
2960
2961 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2962 ignored" when the socket is connected (Linux fills them in
2963 anyway for AF_UNIX sockets at least). Normally msg_namelen
2964 seems to be set to 0 if there's no address, but try to
2965 initialize msg_name to something that won't be mistaken for a
2966 real address if that doesn't happen. */
2967 if (!getsockaddrlen(s, &addrbuflen))
2968 return NULL;
2969 memset(&addrbuf, 0, addrbuflen);
2970 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2971
2972 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2973 PyErr_SetString(PyExc_ValueError,
2974 "invalid ancillary data buffer length");
2975 return NULL;
2976 }
2977 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2978 return PyErr_NoMemory();
2979
2980 /* Make the system call. */
2981 if (!IS_SELECTABLE(s)) {
2982 select_error();
2983 goto finally;
2984 }
2985
2986 BEGIN_SELECT_LOOP(s)
2987 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002988 msg.msg_name = SAS2SA(&addrbuf);
2989 msg.msg_namelen = addrbuflen;
2990 msg.msg_iov = iov;
2991 msg.msg_iovlen = iovlen;
2992 msg.msg_control = controlbuf;
2993 msg.msg_controllen = controllen;
2994 timeout = internal_select_ex(s, 0, interval);
2995 if (!timeout)
2996 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2997 Py_END_ALLOW_THREADS;
2998 if (timeout == 1) {
2999 PyErr_SetString(socket_timeout, "timed out");
3000 goto finally;
3001 }
3002 END_SELECT_LOOP(s)
3003
3004 if (bytes_received < 0) {
3005 s->errorhandler();
3006 goto finally;
3007 }
3008
3009 /* Make list of (level, type, data) tuples from control messages. */
3010 if ((cmsg_list = PyList_New(0)) == NULL)
3011 goto err_closefds;
3012 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3013 implementations didn't do so. */
3014 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3015 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3016 PyObject *bytes, *tuple;
3017 int tmp;
3018
3019 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3020 if (cmsg_status != 0) {
3021 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3022 "received malformed or improperly-truncated "
3023 "ancillary data", 1) == -1)
3024 goto err_closefds;
3025 }
3026 if (cmsg_status < 0)
3027 break;
3028 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003029 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003030 goto err_closefds;
3031 }
3032
3033 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3034 cmsgdatalen);
3035 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3036 (int)cmsgh->cmsg_type, bytes);
3037 if (tuple == NULL)
3038 goto err_closefds;
3039 tmp = PyList_Append(cmsg_list, tuple);
3040 Py_DECREF(tuple);
3041 if (tmp != 0)
3042 goto err_closefds;
3043
3044 if (cmsg_status != 0)
3045 break;
3046 }
3047
3048 retval = Py_BuildValue("NOiN",
3049 (*makeval)(bytes_received, makeval_data),
3050 cmsg_list,
3051 (int)msg.msg_flags,
3052 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3053 ((msg.msg_namelen > addrbuflen) ?
3054 addrbuflen : msg.msg_namelen),
3055 s->sock_proto));
3056 if (retval == NULL)
3057 goto err_closefds;
3058
3059finally:
3060 Py_XDECREF(cmsg_list);
3061 PyMem_Free(controlbuf);
3062 return retval;
3063
3064err_closefds:
3065#ifdef SCM_RIGHTS
3066 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3067 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3068 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3069 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3070 if (cmsg_status < 0)
3071 break;
3072 if (cmsgh->cmsg_level == SOL_SOCKET &&
3073 cmsgh->cmsg_type == SCM_RIGHTS) {
3074 size_t numfds;
3075 int *fdp;
3076
3077 numfds = cmsgdatalen / sizeof(int);
3078 fdp = (int *)CMSG_DATA(cmsgh);
3079 while (numfds-- > 0)
3080 close(*fdp++);
3081 }
3082 if (cmsg_status != 0)
3083 break;
3084 }
3085#endif /* SCM_RIGHTS */
3086 goto finally;
3087}
3088
3089
3090static PyObject *
3091makeval_recvmsg(ssize_t received, void *data)
3092{
3093 PyObject **buf = data;
3094
3095 if (received < PyBytes_GET_SIZE(*buf))
3096 _PyBytes_Resize(buf, received);
3097 Py_XINCREF(*buf);
3098 return *buf;
3099}
3100
3101/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3102
3103static PyObject *
3104sock_recvmsg(PySocketSockObject *s, PyObject *args)
3105{
3106 Py_ssize_t bufsize, ancbufsize = 0;
3107 int flags = 0;
3108 struct iovec iov;
3109 PyObject *buf = NULL, *retval = NULL;
3110
3111 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3112 return NULL;
3113
3114 if (bufsize < 0) {
3115 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3116 return NULL;
3117 }
3118 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3119 return NULL;
3120 iov.iov_base = PyBytes_AS_STRING(buf);
3121 iov.iov_len = bufsize;
3122
3123 /* Note that we're passing a pointer to *our pointer* to the bytes
3124 object here (&buf); makeval_recvmsg() may incref the object, or
3125 deallocate it and set our pointer to NULL. */
3126 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3127 &makeval_recvmsg, &buf);
3128 Py_XDECREF(buf);
3129 return retval;
3130}
3131
3132PyDoc_STRVAR(recvmsg_doc,
3133"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3134\n\
3135Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3136socket. The ancbufsize argument sets the size in bytes of the\n\
3137internal buffer used to receive the ancillary data; it defaults to 0,\n\
3138meaning that no ancillary data will be received. Appropriate buffer\n\
3139sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3140CMSG_LEN(), and items which do not fit into the buffer might be\n\
3141truncated or discarded. The flags argument defaults to 0 and has the\n\
3142same meaning as for recv().\n\
3143\n\
3144The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3145The data item is a bytes object holding the non-ancillary data\n\
3146received. The ancdata item is a list of zero or more tuples\n\
3147(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3148(control messages) received: cmsg_level and cmsg_type are integers\n\
3149specifying the protocol level and protocol-specific type respectively,\n\
3150and cmsg_data is a bytes object holding the associated data. The\n\
3151msg_flags item is the bitwise OR of various flags indicating\n\
3152conditions on the received message; see your system documentation for\n\
3153details. If the receiving socket is unconnected, address is the\n\
3154address of the sending socket, if available; otherwise, its value is\n\
3155unspecified.\n\
3156\n\
3157If recvmsg() raises an exception after the system call returns, it\n\
3158will first attempt to close any file descriptors received via the\n\
3159SCM_RIGHTS mechanism.");
3160
3161
3162static PyObject *
3163makeval_recvmsg_into(ssize_t received, void *data)
3164{
3165 return PyLong_FromSsize_t(received);
3166}
3167
3168/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3169
3170static PyObject *
3171sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3172{
3173 Py_ssize_t ancbufsize = 0;
3174 int flags = 0;
3175 struct iovec *iovs = NULL;
3176 Py_ssize_t i, nitems, nbufs = 0;
3177 Py_buffer *bufs = NULL;
3178 PyObject *buffers_arg, *fast, *retval = NULL;
3179
3180 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3181 &buffers_arg, &ancbufsize, &flags))
3182 return NULL;
3183
3184 if ((fast = PySequence_Fast(buffers_arg,
3185 "recvmsg_into() argument 1 must be an "
3186 "iterable")) == NULL)
3187 return NULL;
3188 nitems = PySequence_Fast_GET_SIZE(fast);
3189 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003190 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003191 goto finally;
3192 }
3193
3194 /* Fill in an iovec for each item, and save the Py_buffer
3195 structs to release afterwards. */
3196 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3197 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3198 PyErr_NoMemory();
3199 goto finally;
3200 }
3201 for (; nbufs < nitems; nbufs++) {
3202 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3203 "w*;recvmsg_into() argument 1 must be an iterable "
3204 "of single-segment read-write buffers",
3205 &bufs[nbufs]))
3206 goto finally;
3207 iovs[nbufs].iov_base = bufs[nbufs].buf;
3208 iovs[nbufs].iov_len = bufs[nbufs].len;
3209 }
3210
3211 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3212 &makeval_recvmsg_into, NULL);
3213finally:
3214 for (i = 0; i < nbufs; i++)
3215 PyBuffer_Release(&bufs[i]);
3216 PyMem_Free(bufs);
3217 PyMem_Free(iovs);
3218 Py_DECREF(fast);
3219 return retval;
3220}
3221
3222PyDoc_STRVAR(recvmsg_into_doc,
3223"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3224\n\
3225Receive normal data and ancillary data from the socket, scattering the\n\
3226non-ancillary data into a series of buffers. The buffers argument\n\
3227must be an iterable of objects that export writable buffers\n\
3228(e.g. bytearray objects); these will be filled with successive chunks\n\
3229of the non-ancillary data until it has all been written or there are\n\
3230no more buffers. The ancbufsize argument sets the size in bytes of\n\
3231the internal buffer used to receive the ancillary data; it defaults to\n\
32320, meaning that no ancillary data will be received. Appropriate\n\
3233buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3234or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3235truncated or discarded. The flags argument defaults to 0 and has the\n\
3236same meaning as for recv().\n\
3237\n\
3238The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3239The nbytes item is the total number of bytes of non-ancillary data\n\
3240written into the buffers. The ancdata item is a list of zero or more\n\
3241tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3242data (control messages) received: cmsg_level and cmsg_type are\n\
3243integers specifying the protocol level and protocol-specific type\n\
3244respectively, and cmsg_data is a bytes object holding the associated\n\
3245data. The msg_flags item is the bitwise OR of various flags\n\
3246indicating conditions on the received message; see your system\n\
3247documentation for details. If the receiving socket is unconnected,\n\
3248address is the address of the sending socket, if available; otherwise,\n\
3249its value is unspecified.\n\
3250\n\
3251If recvmsg_into() raises an exception after the system call returns,\n\
3252it will first attempt to close any file descriptors received via the\n\
3253SCM_RIGHTS mechanism.");
3254#endif /* CMSG_LEN */
3255
3256
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003257/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003258
Guido van Rossum73624e91994-10-10 17:59:00 +00003259static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003260sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003263 Py_ssize_t len, n = -1;
3264 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3268 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 if (!IS_SELECTABLE(s)) {
3271 PyBuffer_Release(&pbuf);
3272 return select_error();
3273 }
3274 buf = pbuf.buf;
3275 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003276
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003277 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003279 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003280 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003281#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003283#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003284 if (len > INT_MAX)
3285 len = INT_MAX;
3286 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003287#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003289#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003290 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003293 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 PyErr_SetString(socket_timeout, "timed out");
3295 return NULL;
3296 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003297 END_SELECT_LOOP(s)
3298
3299 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 if (n < 0)
3301 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003302 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003303}
3304
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003305PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003306"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003307\n\
3308Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003309argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003310sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003311
3312
3313/* s.sendall(data [,flags]) method */
3314
3315static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003316sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003319 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003320 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3324 return NULL;
3325 buf = pbuf.buf;
3326 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 if (!IS_SELECTABLE(s)) {
3329 PyBuffer_Release(&pbuf);
3330 return select_error();
3331 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003334 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 timeout = internal_select(s, 1);
3336 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003337 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003338#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003339 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003340#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003341 if (len > INT_MAX)
3342 len = INT_MAX;
3343 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003344#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003345 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003346#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003347 }
3348 Py_END_ALLOW_THREADS
3349 if (timeout == 1) {
3350 PyBuffer_Release(&pbuf);
3351 PyErr_SetString(socket_timeout, "timed out");
3352 return NULL;
3353 }
3354 /* PyErr_CheckSignals() might change errno */
3355 saved_errno = errno;
3356 /* We must run our signal handlers before looping again.
3357 send() can return a successful partial write when it is
3358 interrupted, so we can't restrict ourselves to EINTR. */
3359 if (PyErr_CheckSignals()) {
3360 PyBuffer_Release(&pbuf);
3361 return NULL;
3362 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003364 /* If interrupted, try again */
3365 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003367 else
3368 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 }
3370 buf += n;
3371 len -= n;
3372 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 if (n < 0)
3376 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 Py_INCREF(Py_None);
3379 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003380}
3381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003382PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003383"sendall(data[, flags])\n\
3384\n\
3385Send a data string to the socket. For the optional flags\n\
3386argument, see the Unix manual. This calls send() repeatedly\n\
3387until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003388to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003389
Guido van Rossum30a685f1991-06-27 15:51:29 +00003390
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003391/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003392
Guido van Rossum73624e91994-10-10 17:59:00 +00003393static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003394sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 Py_buffer pbuf;
3397 PyObject *addro;
3398 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003399 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 sock_addr_t addrbuf;
3401 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003404 arglen = PyTuple_Size(args);
3405 switch (arglen) {
3406 case 2:
3407 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3408 break;
3409 case 3:
3410 PyArg_ParseTuple(args, "y*iO:sendto",
3411 &pbuf, &flags, &addro);
3412 break;
3413 default:
3414 PyErr_Format(PyExc_TypeError,
3415 "sendto() takes 2 or 3 arguments (%d given)",
3416 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003417 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003419 if (PyErr_Occurred())
3420 return NULL;
3421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 buf = pbuf.buf;
3423 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425 if (!IS_SELECTABLE(s)) {
3426 PyBuffer_Release(&pbuf);
3427 return select_error();
3428 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3431 PyBuffer_Release(&pbuf);
3432 return NULL;
3433 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003434
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003435 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003437 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003438 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003439#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003440 if (len > INT_MAX)
3441 len = INT_MAX;
3442 n = sendto(s->sock_fd, buf, (int)len, flags,
3443 SAS2SA(&addrbuf), addrlen);
3444#else
3445 n = sendto(s->sock_fd, buf, len, flags,
3446 SAS2SA(&addrbuf), addrlen);
3447#endif
3448 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003452 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 PyErr_SetString(socket_timeout, "timed out");
3454 return NULL;
3455 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003456 END_SELECT_LOOP(s)
3457 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 if (n < 0)
3459 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003460 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003461}
3462
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003463PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003464"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003465\n\
3466Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003467For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003468
Guido van Rossum30a685f1991-06-27 15:51:29 +00003469
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003470/* The sendmsg() and recvmsg[_into]() methods require a working
3471 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3472#ifdef CMSG_LEN
3473/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3474
3475static PyObject *
3476sock_sendmsg(PySocketSockObject *s, PyObject *args)
3477{
3478 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3479 Py_buffer *databufs = NULL;
3480 struct iovec *iovs = NULL;
3481 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003482 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003483 struct cmsginfo {
3484 int level;
3485 int type;
3486 Py_buffer data;
3487 } *cmsgs = NULL;
3488 void *controlbuf = NULL;
3489 size_t controllen, controllen_last;
3490 ssize_t bytes_sent = -1;
3491 int addrlen, timeout, flags = 0;
3492 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3493 *cmsg_fast = NULL, *retval = NULL;
3494
3495 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3496 &data_arg, &cmsg_arg, &flags, &addr_arg))
3497 return NULL;
3498
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003499 /* Parse destination address. */
3500 if (addr_arg != NULL && addr_arg != Py_None) {
3501 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3502 goto finally;
3503 msg.msg_name = &addrbuf;
3504 msg.msg_namelen = addrlen;
3505 }
3506
3507 /* Fill in an iovec for each message part, and save the Py_buffer
3508 structs to release afterwards. */
3509 if ((data_fast = PySequence_Fast(data_arg,
3510 "sendmsg() argument 1 must be an "
3511 "iterable")) == NULL)
3512 goto finally;
3513 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3514 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003515 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003516 goto finally;
3517 }
3518 msg.msg_iovlen = ndataparts;
3519 if (ndataparts > 0 &&
3520 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3521 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3522 PyErr_NoMemory();
3523 goto finally;
3524 }
3525 for (; ndatabufs < ndataparts; ndatabufs++) {
3526 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3527 "y*;sendmsg() argument 1 must be an iterable of "
3528 "buffer-compatible objects",
3529 &databufs[ndatabufs]))
3530 goto finally;
3531 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3532 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3533 }
3534
3535 if (cmsg_arg == NULL)
3536 ncmsgs = 0;
3537 else {
3538 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3539 "sendmsg() argument 2 must be an "
3540 "iterable")) == NULL)
3541 goto finally;
3542 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3543 }
3544
3545#ifndef CMSG_SPACE
3546 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003547 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003548 "sending multiple control messages is not supported "
3549 "on this system");
3550 goto finally;
3551 }
3552#endif
3553 /* Save level, type and Py_buffer for each control message,
3554 and calculate total size. */
3555 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3556 PyErr_NoMemory();
3557 goto finally;
3558 }
3559 controllen = controllen_last = 0;
3560 while (ncmsgbufs < ncmsgs) {
3561 size_t bufsize, space;
3562
3563 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3564 "(iiy*):[sendmsg() ancillary data items]",
3565 &cmsgs[ncmsgbufs].level,
3566 &cmsgs[ncmsgbufs].type,
3567 &cmsgs[ncmsgbufs].data))
3568 goto finally;
3569 bufsize = cmsgs[ncmsgbufs++].data.len;
3570
3571#ifdef CMSG_SPACE
3572 if (!get_CMSG_SPACE(bufsize, &space)) {
3573#else
3574 if (!get_CMSG_LEN(bufsize, &space)) {
3575#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003576 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003577 goto finally;
3578 }
3579 controllen += space;
3580 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003581 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003582 goto finally;
3583 }
3584 controllen_last = controllen;
3585 }
3586
3587 /* Construct ancillary data block from control message info. */
3588 if (ncmsgbufs > 0) {
3589 struct cmsghdr *cmsgh = NULL;
3590
3591 if ((msg.msg_control = controlbuf =
3592 PyMem_Malloc(controllen)) == NULL) {
3593 PyErr_NoMemory();
3594 goto finally;
3595 }
3596 msg.msg_controllen = controllen;
3597
3598 /* Need to zero out the buffer as a workaround for glibc's
3599 CMSG_NXTHDR() implementation. After getting the pointer to
3600 the next header, it checks its (uninitialized) cmsg_len
3601 member to see if the "message" fits in the buffer, and
3602 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003603 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003604 memset(controlbuf, 0, controllen);
3605
3606 for (i = 0; i < ncmsgbufs; i++) {
3607 size_t msg_len, data_len = cmsgs[i].data.len;
3608 int enough_space = 0;
3609
3610 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3611 if (cmsgh == NULL) {
3612 PyErr_Format(PyExc_RuntimeError,
3613 "unexpected NULL result from %s()",
3614 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3615 goto finally;
3616 }
3617 if (!get_CMSG_LEN(data_len, &msg_len)) {
3618 PyErr_SetString(PyExc_RuntimeError,
3619 "item size out of range for CMSG_LEN()");
3620 goto finally;
3621 }
3622 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3623 size_t space;
3624
3625 cmsgh->cmsg_len = msg_len;
3626 if (get_cmsg_data_space(&msg, cmsgh, &space))
3627 enough_space = (space >= data_len);
3628 }
3629 if (!enough_space) {
3630 PyErr_SetString(PyExc_RuntimeError,
3631 "ancillary data does not fit in calculated "
3632 "space");
3633 goto finally;
3634 }
3635 cmsgh->cmsg_level = cmsgs[i].level;
3636 cmsgh->cmsg_type = cmsgs[i].type;
3637 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3638 }
3639 }
3640
3641 /* Make the system call. */
3642 if (!IS_SELECTABLE(s)) {
3643 select_error();
3644 goto finally;
3645 }
3646
3647 BEGIN_SELECT_LOOP(s)
3648 Py_BEGIN_ALLOW_THREADS;
3649 timeout = internal_select_ex(s, 1, interval);
3650 if (!timeout)
3651 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3652 Py_END_ALLOW_THREADS;
3653 if (timeout == 1) {
3654 PyErr_SetString(socket_timeout, "timed out");
3655 goto finally;
3656 }
3657 END_SELECT_LOOP(s)
3658
3659 if (bytes_sent < 0) {
3660 s->errorhandler();
3661 goto finally;
3662 }
3663 retval = PyLong_FromSsize_t(bytes_sent);
3664
3665finally:
3666 PyMem_Free(controlbuf);
3667 for (i = 0; i < ncmsgbufs; i++)
3668 PyBuffer_Release(&cmsgs[i].data);
3669 PyMem_Free(cmsgs);
3670 Py_XDECREF(cmsg_fast);
3671 for (i = 0; i < ndatabufs; i++)
3672 PyBuffer_Release(&databufs[i]);
3673 PyMem_Free(databufs);
3674 PyMem_Free(iovs);
3675 Py_XDECREF(data_fast);
3676 return retval;
3677}
3678
3679PyDoc_STRVAR(sendmsg_doc,
3680"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3681\n\
3682Send normal and ancillary data to the socket, gathering the\n\
3683non-ancillary data from a series of buffers and concatenating it into\n\
3684a single message. The buffers argument specifies the non-ancillary\n\
3685data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3686The ancdata argument specifies the ancillary data (control messages)\n\
3687as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3688cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3689protocol level and protocol-specific type respectively, and cmsg_data\n\
3690is a buffer-compatible object holding the associated data. The flags\n\
3691argument defaults to 0 and has the same meaning as for send(). If\n\
3692address is supplied and not None, it sets a destination address for\n\
3693the message. The return value is the number of bytes of non-ancillary\n\
3694data sent.");
3695#endif /* CMSG_LEN */
3696
3697
Guido van Rossum30a685f1991-06-27 15:51:29 +00003698/* s.shutdown(how) method */
3699
Guido van Rossum73624e91994-10-10 17:59:00 +00003700static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003701sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 int how;
3704 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003705
Serhiy Storchaka78980432013-01-15 01:12:17 +02003706 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 if (how == -1 && PyErr_Occurred())
3708 return NULL;
3709 Py_BEGIN_ALLOW_THREADS
3710 res = shutdown(s->sock_fd, how);
3711 Py_END_ALLOW_THREADS
3712 if (res < 0)
3713 return s->errorhandler();
3714 Py_INCREF(Py_None);
3715 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003716}
3717
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003718PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003719"shutdown(flag)\n\
3720\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003721Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3722of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003723
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003724#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003725static PyObject*
3726sock_ioctl(PySocketSockObject *s, PyObject *arg)
3727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 unsigned long cmd = SIO_RCVALL;
3729 PyObject *argO;
3730 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3733 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 switch (cmd) {
3736 case SIO_RCVALL: {
3737 unsigned int option = RCVALL_ON;
3738 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3739 return NULL;
3740 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3741 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3742 return set_error();
3743 }
3744 return PyLong_FromUnsignedLong(recv); }
3745 case SIO_KEEPALIVE_VALS: {
3746 struct tcp_keepalive ka;
3747 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3748 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3749 return NULL;
3750 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3751 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3752 return set_error();
3753 }
3754 return PyLong_FromUnsignedLong(recv); }
3755 default:
3756 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3757 return NULL;
3758 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003759}
3760PyDoc_STRVAR(sock_ioctl_doc,
3761"ioctl(cmd, option) -> long\n\
3762\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003763Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3764SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3765SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003766#endif
3767
3768#if defined(MS_WINDOWS)
3769static PyObject*
3770sock_share(PySocketSockObject *s, PyObject *arg)
3771{
3772 WSAPROTOCOL_INFO info;
3773 DWORD processId;
3774 int result;
3775
3776 if (!PyArg_ParseTuple(arg, "I", &processId))
3777 return NULL;
3778
3779 Py_BEGIN_ALLOW_THREADS
3780 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3781 Py_END_ALLOW_THREADS
3782 if (result == SOCKET_ERROR)
3783 return set_error();
3784 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3785}
3786PyDoc_STRVAR(sock_share_doc,
3787"share(process_id) -> bytes\n\
3788\n\
3789Share the socket with another process. The target process id\n\
3790must be provided and the resulting bytes object passed to the target\n\
3791process. There the shared socket can be instantiated by calling\n\
3792socket.fromshare().");
3793
Christian Heimesfaf2f632008-01-06 16:59:19 +00003794
3795#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003796
3797/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003798
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003799static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3801 accept_doc},
3802 {"bind", (PyCFunction)sock_bind, METH_O,
3803 bind_doc},
3804 {"close", (PyCFunction)sock_close, METH_NOARGS,
3805 close_doc},
3806 {"connect", (PyCFunction)sock_connect, METH_O,
3807 connect_doc},
3808 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3809 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003810 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3811 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3813 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003814#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 {"getpeername", (PyCFunction)sock_getpeername,
3816 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 {"getsockname", (PyCFunction)sock_getsockname,
3819 METH_NOARGS, getsockname_doc},
3820 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3821 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003822#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3824 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003825#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003826#if defined(MS_WINDOWS)
3827 {"share", (PyCFunction)sock_share, METH_VARARGS,
3828 sock_share_doc},
3829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 {"listen", (PyCFunction)sock_listen, METH_O,
3831 listen_doc},
3832 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3833 recv_doc},
3834 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3835 recv_into_doc},
3836 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3837 recvfrom_doc},
3838 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3839 recvfrom_into_doc},
3840 {"send", (PyCFunction)sock_send, METH_VARARGS,
3841 send_doc},
3842 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3843 sendall_doc},
3844 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3845 sendto_doc},
3846 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3847 setblocking_doc},
3848 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3849 settimeout_doc},
3850 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3851 gettimeout_doc},
3852 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3853 setsockopt_doc},
3854 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3855 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003856#ifdef CMSG_LEN
3857 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3858 recvmsg_doc},
3859 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3860 recvmsg_into_doc,},
3861 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3862 sendmsg_doc},
3863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003865};
3866
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003867/* SockObject members */
3868static PyMemberDef sock_memberlist[] = {
3869 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3870 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3871 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3872 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3873 {0},
3874};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003875
Guido van Rossum73624e91994-10-10 17:59:00 +00003876/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003877 First close the file description. */
3878
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003879static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003880sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003881{
Antoine Pitroue033e062010-10-29 10:38:18 +00003882 if (s->sock_fd != -1) {
3883 PyObject *exc, *val, *tb;
3884 Py_ssize_t old_refcount = Py_REFCNT(s);
3885 ++Py_REFCNT(s);
3886 PyErr_Fetch(&exc, &val, &tb);
3887 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3888 "unclosed %R", s))
3889 /* Spurious errors can appear at shutdown */
3890 if (PyErr_ExceptionMatches(PyExc_Warning))
3891 PyErr_WriteUnraisable((PyObject *) s);
3892 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003893 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003894 Py_REFCNT(s) = old_refcount;
3895 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003897}
3898
Guido van Rossum30a685f1991-06-27 15:51:29 +00003899
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003901sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003902{
Fred Drakea04eaad2000-06-30 02:46:07 +00003903#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 if (s->sock_fd > LONG_MAX) {
3905 /* this can occur on Win64, and actually there is a special
3906 ugly printf formatter for decimal pointer length integer
3907 printing, only bother if necessary*/
3908 PyErr_SetString(PyExc_OverflowError,
3909 "no printf formatter to display "
3910 "the socket descriptor in decimal");
3911 return NULL;
3912 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 return PyUnicode_FromFormat(
3915 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3916 (long)s->sock_fd, s->sock_family,
3917 s->sock_type,
3918 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003919}
3920
3921
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003922/* Create a new, uninitialized socket object. */
3923
3924static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003925sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 new = type->tp_alloc(type, 0);
3930 if (new != NULL) {
3931 ((PySocketSockObject *)new)->sock_fd = -1;
3932 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3933 ((PySocketSockObject *)new)->errorhandler = &set_error;
3934 }
3935 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003936}
3937
3938
3939/* Initialize a new socket object. */
3940
Victor Stinnerdaf45552013-08-28 00:53:59 +02003941#ifdef SOCK_CLOEXEC
3942/* socket() and socketpair() fail with EINVAL on Linux kernel older
3943 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3944static int sock_cloexec_works = -1;
3945#endif
3946
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003947/*ARGSUSED*/
3948static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003949sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 PySocketSockObject *s = (PySocketSockObject *)self;
3952 PyObject *fdobj = NULL;
3953 SOCKET_T fd = INVALID_SOCKET;
3954 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3955 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003956#ifndef MS_WINDOWS
3957#ifdef SOCK_CLOEXEC
3958 int *atomic_flag_works = &sock_cloexec_works;
3959#else
3960 int *atomic_flag_works = NULL;
3961#endif
3962#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3965 "|iiiO:socket", keywords,
3966 &family, &type, &proto, &fdobj))
3967 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003970#ifdef MS_WINDOWS
3971 /* recreate a socket that was duplicated */
3972 if (PyBytes_Check(fdobj)) {
3973 WSAPROTOCOL_INFO info;
3974 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3975 PyErr_Format(PyExc_ValueError,
3976 "socket descriptor string has wrong size, "
3977 "should be %zu bytes.", sizeof(info));
3978 return -1;
3979 }
3980 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3981 Py_BEGIN_ALLOW_THREADS
3982 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3983 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3984 Py_END_ALLOW_THREADS
3985 if (fd == INVALID_SOCKET) {
3986 set_error();
3987 return -1;
3988 }
3989 family = info.iAddressFamily;
3990 type = info.iSocketType;
3991 proto = info.iProtocol;
3992 }
3993 else
3994#endif
3995 {
3996 fd = PyLong_AsSocket_t(fdobj);
3997 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3998 return -1;
3999 if (fd == INVALID_SOCKET) {
4000 PyErr_SetString(PyExc_ValueError,
4001 "can't use invalid socket value");
4002 return -1;
4003 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 }
4005 }
4006 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004007#ifdef MS_WINDOWS
4008 /* Windows implementation */
4009#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4010#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4011#endif
4012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004013 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004014 if (support_wsa_no_inherit) {
4015 fd = WSASocket(family, type, proto,
4016 NULL, 0,
4017 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4018 if (fd == INVALID_SOCKET) {
4019 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4020 support_wsa_no_inherit = 0;
4021 fd = socket(family, type, proto);
4022 }
4023 }
4024 else {
4025 fd = socket(family, type, proto);
4026 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004027 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 if (fd == INVALID_SOCKET) {
4030 set_error();
4031 return -1;
4032 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004033
4034 if (!support_wsa_no_inherit) {
4035 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4036 closesocket(fd);
4037 PyErr_SetFromWindowsErr(0);
4038 return -1;
4039 }
4040 }
4041#else
4042 /* UNIX */
4043 Py_BEGIN_ALLOW_THREADS
4044#ifdef SOCK_CLOEXEC
4045 if (sock_cloexec_works != 0) {
4046 fd = socket(family, type | SOCK_CLOEXEC, proto);
4047 if (sock_cloexec_works == -1) {
4048 if (fd >= 0) {
4049 sock_cloexec_works = 1;
4050 }
4051 else if (errno == EINVAL) {
4052 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4053 sock_cloexec_works = 0;
4054 fd = socket(family, type, proto);
4055 }
4056 }
4057 }
4058 else
4059#endif
4060 {
4061 fd = socket(family, type, proto);
4062 }
4063 Py_END_ALLOW_THREADS
4064
4065 if (fd == INVALID_SOCKET) {
4066 set_error();
4067 return -1;
4068 }
4069
4070 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4071 SOCKETCLOSE(fd);
4072 return -1;
4073 }
4074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 }
4076 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004079
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004080}
4081
4082
Guido van Rossumb6775db1994-08-01 11:34:53 +00004083/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004084
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004085static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4087 "_socket.socket", /* tp_name */
4088 sizeof(PySocketSockObject), /* tp_basicsize */
4089 0, /* tp_itemsize */
4090 (destructor)sock_dealloc, /* tp_dealloc */
4091 0, /* tp_print */
4092 0, /* tp_getattr */
4093 0, /* tp_setattr */
4094 0, /* tp_reserved */
4095 (reprfunc)sock_repr, /* tp_repr */
4096 0, /* tp_as_number */
4097 0, /* tp_as_sequence */
4098 0, /* tp_as_mapping */
4099 0, /* tp_hash */
4100 0, /* tp_call */
4101 0, /* tp_str */
4102 PyObject_GenericGetAttr, /* tp_getattro */
4103 0, /* tp_setattro */
4104 0, /* tp_as_buffer */
4105 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4106 sock_doc, /* tp_doc */
4107 0, /* tp_traverse */
4108 0, /* tp_clear */
4109 0, /* tp_richcompare */
4110 0, /* tp_weaklistoffset */
4111 0, /* tp_iter */
4112 0, /* tp_iternext */
4113 sock_methods, /* tp_methods */
4114 sock_memberlist, /* tp_members */
4115 0, /* tp_getset */
4116 0, /* tp_base */
4117 0, /* tp_dict */
4118 0, /* tp_descr_get */
4119 0, /* tp_descr_set */
4120 0, /* tp_dictoffset */
4121 sock_initobj, /* tp_init */
4122 PyType_GenericAlloc, /* tp_alloc */
4123 sock_new, /* tp_new */
4124 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004125};
4126
Guido van Rossum30a685f1991-06-27 15:51:29 +00004127
Guido van Rossum81194471991-07-27 21:42:02 +00004128/* Python interface to gethostname(). */
4129
4130/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004131static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004132socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004133{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004134#ifdef MS_WINDOWS
4135 /* Don't use winsock's gethostname, as this returns the ANSI
4136 version of the hostname, whereas we need a Unicode string.
4137 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004138 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004139 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004140 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004141 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004142
4143 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004144 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004145
4146 if (GetLastError() != ERROR_MORE_DATA)
4147 return PyErr_SetFromWindowsErr(0);
4148
4149 if (size == 0)
4150 return PyUnicode_New(0, 0);
4151
4152 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4153 names */
4154 name = PyMem_Malloc(size * sizeof(wchar_t));
4155 if (!name)
4156 return NULL;
4157 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4158 name,
4159 &size))
4160 {
4161 PyMem_Free(name);
4162 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004163 }
Victor Stinner74168972011-11-17 01:11:36 +01004164
4165 result = PyUnicode_FromWideChar(name, size);
4166 PyMem_Free(name);
4167 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004168#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 char buf[1024];
4170 int res;
4171 Py_BEGIN_ALLOW_THREADS
4172 res = gethostname(buf, (int) sizeof buf - 1);
4173 Py_END_ALLOW_THREADS
4174 if (res < 0)
4175 return set_error();
4176 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004177 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004178#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004179}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004181PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004182"gethostname() -> string\n\
4183\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004184Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004185
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004186#ifdef HAVE_SETHOSTNAME
4187PyDoc_STRVAR(sethostname_doc,
4188"sethostname(name)\n\n\
4189Sets the hostname to name.");
4190
4191static PyObject *
4192socket_sethostname(PyObject *self, PyObject *args)
4193{
4194 PyObject *hnobj;
4195 Py_buffer buf;
4196 int res, flag = 0;
4197
Christian Heimesd2774c72013-06-19 02:06:29 +02004198#ifdef _AIX
4199/* issue #18259, not declared in any useful header file */
4200extern int sethostname(const char *, size_t);
4201#endif
4202
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004203 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4204 PyErr_Clear();
4205 if (!PyArg_ParseTuple(args, "O&:sethostname",
4206 PyUnicode_FSConverter, &hnobj))
4207 return NULL;
4208 flag = 1;
4209 }
4210 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4211 if (!res) {
4212 res = sethostname(buf.buf, buf.len);
4213 PyBuffer_Release(&buf);
4214 }
4215 if (flag)
4216 Py_DECREF(hnobj);
4217 if (res)
4218 return set_error();
4219 Py_RETURN_NONE;
4220}
4221#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004222
Guido van Rossum30a685f1991-06-27 15:51:29 +00004223/* Python interface to gethostbyname(name). */
4224
4225/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004226static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004227socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 char *name;
4230 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004231 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004233 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 return NULL;
4235 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004236 goto finally;
4237 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4238finally:
4239 PyMem_Free(name);
4240 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004241}
4242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004243PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004244"gethostbyname(host) -> address\n\
4245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004246Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004247
4248
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004249/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4250
4251static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004252gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 char **pch;
4255 PyObject *rtn_tuple = (PyObject *)NULL;
4256 PyObject *name_list = (PyObject *)NULL;
4257 PyObject *addr_list = (PyObject *)NULL;
4258 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 if (h == NULL) {
4261 /* Let's get real error message to return */
4262 set_herror(h_errno);
4263 return NULL;
4264 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 if (h->h_addrtype != af) {
4267 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004268 errno = EAFNOSUPPORT;
4269 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 return NULL;
4271 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 case AF_INET:
4276 if (alen < sizeof(struct sockaddr_in))
4277 return NULL;
4278 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004279
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004280#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 case AF_INET6:
4282 if (alen < sizeof(struct sockaddr_in6))
4283 return NULL;
4284 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004285#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 if ((name_list = PyList_New(0)) == NULL)
4290 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 if ((addr_list = PyList_New(0)) == NULL)
4293 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 /* SF #1511317: h_aliases can be NULL */
4296 if (h->h_aliases) {
4297 for (pch = h->h_aliases; *pch != NULL; pch++) {
4298 int status;
4299 tmp = PyUnicode_FromString(*pch);
4300 if (tmp == NULL)
4301 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 status = PyList_Append(name_list, tmp);
4304 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 if (status)
4307 goto err;
4308 }
4309 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4312 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 case AF_INET:
4317 {
4318 struct sockaddr_in sin;
4319 memset(&sin, 0, sizeof(sin));
4320 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004321#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4325 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 if (pch == h->h_addr_list && alen >= sizeof(sin))
4328 memcpy((char *) addr, &sin, sizeof(sin));
4329 break;
4330 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004331
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004332#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 case AF_INET6:
4334 {
4335 struct sockaddr_in6 sin6;
4336 memset(&sin6, 0, sizeof(sin6));
4337 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004338#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4342 tmp = makeipaddr((struct sockaddr *)&sin6,
4343 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4346 memcpy((char *) addr, &sin6, sizeof(sin6));
4347 break;
4348 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004349#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004352 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 "unsupported address family");
4354 return NULL;
4355 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004357 if (tmp == NULL)
4358 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 status = PyList_Append(addr_list, tmp);
4361 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 if (status)
4364 goto err;
4365 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004368
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004369 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 Py_XDECREF(name_list);
4371 Py_XDECREF(addr_list);
4372 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004373}
4374
4375
4376/* Python interface to gethostbyname_ex(name). */
4377
4378/*ARGSUSED*/
4379static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004380socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 char *name;
4383 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004384 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004386 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004387#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004389#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004391#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 char buf[16384];
4393 int buf_len = (sizeof buf) - 1;
4394 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004395#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004396#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004398#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004399#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004400
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004401 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004403 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004404 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004406#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004407#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004408 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004410#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004412#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 memset((void *) &data, '\0', sizeof(data));
4414 result = gethostbyname_r(name, &hp_allocated, &data);
4415 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004416#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004417#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004418#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004422#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 Py_END_ALLOW_THREADS
4424 /* Some C libraries would require addr.__ss_family instead of
4425 addr.ss_family.
4426 Therefore, we cast the sockaddr_storage into sockaddr to
4427 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004428 sa = SAS2SA(&addr);
4429 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004431#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004433#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004434finally:
4435 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004437}
4438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004439PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004440"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4441\n\
4442Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004443for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004444
4445
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004446/* Python interface to gethostbyaddr(IP). */
4447
4448/*ARGSUSED*/
4449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004450socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004451{
Charles-François Natali8b759652011-12-23 16:44:51 +01004452 sock_addr_t addr;
4453 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 char *ip_num;
4455 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004456 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004457#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004459#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004461#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 /* glibcs up to 2.10 assume that the buf argument to
4463 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4464 does not ensure. The attribute below instructs the compiler
4465 to maintain this alignment. */
4466 char buf[16384] Py_ALIGNED(8);
4467 int buf_len = (sizeof buf) - 1;
4468 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004469#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004470#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004472#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004473#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 char *ap;
4475 int al;
4476 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004477
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004478 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 return NULL;
4480 af = AF_UNSPEC;
4481 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004482 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004483 af = sa->sa_family;
4484 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004485 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 switch (af) {
4487 case AF_INET:
4488 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4489 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4490 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004491#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 case AF_INET6:
4493 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4494 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4495 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004498 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004499 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 }
4501 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004502#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004503#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004504 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 &hp_allocated, buf, buf_len,
4506 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004507#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 h = gethostbyaddr_r(ap, al, af,
4509 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004510#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 memset((void *) &data, '\0', sizeof(data));
4512 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4513 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004514#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004515#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004516#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004520#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004522 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004523#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004525#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004526finally:
4527 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004529}
4530
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004531PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004532"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4533\n\
4534Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004535for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004536
Guido van Rossum30a685f1991-06-27 15:51:29 +00004537
4538/* Python interface to getservbyname(name).
4539 This only returns the port number, since the other info is already
4540 known or not useful (like the list of aliases). */
4541
4542/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004544socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 char *name, *proto=NULL;
4547 struct servent *sp;
4548 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4549 return NULL;
4550 Py_BEGIN_ALLOW_THREADS
4551 sp = getservbyname(name, proto);
4552 Py_END_ALLOW_THREADS
4553 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004554 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 return NULL;
4556 }
4557 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004558}
4559
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004560PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004561"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004562\n\
4563Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004564The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4565otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004566
Guido van Rossum30a685f1991-06-27 15:51:29 +00004567
Barry Warsaw11b91a02004-06-28 00:50:43 +00004568/* Python interface to getservbyport(port).
4569 This only returns the service name, since the other info is already
4570 known or not useful (like the list of aliases). */
4571
4572/*ARGSUSED*/
4573static PyObject *
4574socket_getservbyport(PyObject *self, PyObject *args)
4575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 int port;
4577 char *proto=NULL;
4578 struct servent *sp;
4579 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4580 return NULL;
4581 if (port < 0 || port > 0xffff) {
4582 PyErr_SetString(
4583 PyExc_OverflowError,
4584 "getservbyport: port must be 0-65535.");
4585 return NULL;
4586 }
4587 Py_BEGIN_ALLOW_THREADS
4588 sp = getservbyport(htons((short)port), proto);
4589 Py_END_ALLOW_THREADS
4590 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004591 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 return NULL;
4593 }
4594 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004595}
4596
4597PyDoc_STRVAR(getservbyport_doc,
4598"getservbyport(port[, protocolname]) -> string\n\
4599\n\
4600Return the service name from a port number and protocol name.\n\
4601The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4602otherwise any protocol will match.");
4603
Guido van Rossum3901d851996-12-19 16:35:04 +00004604/* Python interface to getprotobyname(name).
4605 This only returns the protocol number, since the other info is
4606 already known or not useful (like the list of aliases). */
4607
4608/*ARGSUSED*/
4609static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004610socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004612 char *name;
4613 struct protoent *sp;
4614 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4615 return NULL;
4616 Py_BEGIN_ALLOW_THREADS
4617 sp = getprotobyname(name);
4618 Py_END_ALLOW_THREADS
4619 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004620 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 return NULL;
4622 }
4623 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004624}
4625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004626PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004627"getprotobyname(name) -> integer\n\
4628\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004629Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004630
Guido van Rossum3901d851996-12-19 16:35:04 +00004631
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004632#ifndef NO_DUP
4633/* dup() function for socket fds */
4634
4635static PyObject *
4636socket_dup(PyObject *self, PyObject *fdobj)
4637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 SOCKET_T fd, newfd;
4639 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004640#ifdef MS_WINDOWS
4641 WSAPROTOCOL_INFO info;
4642#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 fd = PyLong_AsSocket_t(fdobj);
4645 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4646 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004647
Victor Stinnerdaf45552013-08-28 00:53:59 +02004648#ifdef MS_WINDOWS
4649 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4650 return set_error();
4651
4652 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4653 FROM_PROTOCOL_INFO,
4654 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 if (newfd == INVALID_SOCKET)
4656 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004657
Victor Stinnerdaf45552013-08-28 00:53:59 +02004658 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4659 closesocket(newfd);
4660 PyErr_SetFromWindowsErr(0);
4661 return NULL;
4662 }
4663#else
4664 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4665 newfd = _Py_dup(fd);
4666 if (newfd == INVALID_SOCKET)
4667 return NULL;
4668#endif
4669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 newfdobj = PyLong_FromSocket_t(newfd);
4671 if (newfdobj == NULL)
4672 SOCKETCLOSE(newfd);
4673 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004674}
4675
4676PyDoc_STRVAR(dup_doc,
4677"dup(integer) -> integer\n\
4678\n\
4679Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4680sockets; on some platforms os.dup() won't work for socket file descriptors.");
4681#endif
4682
4683
Dave Cole331708b2004-08-09 04:51:41 +00004684#ifdef HAVE_SOCKETPAIR
4685/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004686 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004687 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004688
4689/*ARGSUSED*/
4690static PyObject *
4691socket_socketpair(PyObject *self, PyObject *args)
4692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 PySocketSockObject *s0 = NULL, *s1 = NULL;
4694 SOCKET_T sv[2];
4695 int family, type = SOCK_STREAM, proto = 0;
4696 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004697#ifdef SOCK_CLOEXEC
4698 int *atomic_flag_works = &sock_cloexec_works;
4699#else
4700 int *atomic_flag_works = NULL;
4701#endif
4702 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004703
4704#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004707 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4710 &family, &type, &proto))
4711 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004714 Py_BEGIN_ALLOW_THREADS
4715#ifdef SOCK_CLOEXEC
4716 if (sock_cloexec_works != 0) {
4717 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4718 if (sock_cloexec_works == -1) {
4719 if (ret >= 0) {
4720 sock_cloexec_works = 1;
4721 }
4722 else if (errno == EINVAL) {
4723 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4724 sock_cloexec_works = 0;
4725 ret = socketpair(family, type, proto, sv);
4726 }
4727 }
4728 }
4729 else
4730#endif
4731 {
4732 ret = socketpair(family, type, proto, sv);
4733 }
4734 Py_END_ALLOW_THREADS
4735
4736 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004738
4739 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4740 goto finally;
4741 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4742 goto finally;
4743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 s0 = new_sockobject(sv[0], family, type, proto);
4745 if (s0 == NULL)
4746 goto finally;
4747 s1 = new_sockobject(sv[1], family, type, proto);
4748 if (s1 == NULL)
4749 goto finally;
4750 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004751
4752finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 if (res == NULL) {
4754 if (s0 == NULL)
4755 SOCKETCLOSE(sv[0]);
4756 if (s1 == NULL)
4757 SOCKETCLOSE(sv[1]);
4758 }
4759 Py_XDECREF(s0);
4760 Py_XDECREF(s1);
4761 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004762}
4763
4764PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004765"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004766\n\
4767Create a pair of socket objects from the sockets returned by the platform\n\
4768socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004769The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004770AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004771
4772#endif /* HAVE_SOCKETPAIR */
4773
4774
Guido van Rossum006bf911996-06-12 04:04:55 +00004775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004776socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4781 return NULL;
4782 }
4783 if (x1 < 0) {
4784 PyErr_SetString(PyExc_OverflowError,
4785 "can't convert negative number to unsigned long");
4786 return NULL;
4787 }
4788 x2 = (unsigned int)ntohs((unsigned short)x1);
4789 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004790}
4791
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004792PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004793"ntohs(integer) -> integer\n\
4794\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004795Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004796
4797
Guido van Rossum006bf911996-06-12 04:04:55 +00004798static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004799socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 if (PyLong_Check(arg)) {
4804 x = PyLong_AsUnsignedLong(arg);
4805 if (x == (unsigned long) -1 && PyErr_Occurred())
4806 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004807#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 {
4809 unsigned long y;
4810 /* only want the trailing 32 bits */
4811 y = x & 0xFFFFFFFFUL;
4812 if (y ^ x)
4813 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004814 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 x = y;
4816 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 }
4819 else
4820 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004821 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004824}
4825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004826PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004827"ntohl(integer) -> integer\n\
4828\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004829Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004830
4831
Guido van Rossum006bf911996-06-12 04:04:55 +00004832static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004833socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4838 return NULL;
4839 }
4840 if (x1 < 0) {
4841 PyErr_SetString(PyExc_OverflowError,
4842 "can't convert negative number to unsigned long");
4843 return NULL;
4844 }
4845 x2 = (unsigned int)htons((unsigned short)x1);
4846 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004847}
4848
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004849PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004850"htons(integer) -> integer\n\
4851\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004852Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004853
4854
Guido van Rossum006bf911996-06-12 04:04:55 +00004855static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004856socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 if (PyLong_Check(arg)) {
4861 x = PyLong_AsUnsignedLong(arg);
4862 if (x == (unsigned long) -1 && PyErr_Occurred())
4863 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004864#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 {
4866 unsigned long y;
4867 /* only want the trailing 32 bits */
4868 y = x & 0xFFFFFFFFUL;
4869 if (y ^ x)
4870 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004871 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 x = y;
4873 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 }
4876 else
4877 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004878 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 Py_TYPE(arg)->tp_name);
4880 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004881}
4882
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004883PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004884"htonl(integer) -> integer\n\
4885\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004886Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004887
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004888/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004890PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004891"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004892\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004893Convert 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 +00004894binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004895
4896static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004897socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004898{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004899#ifndef INADDR_NONE
4900#define INADDR_NONE (-1)
4901#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004902#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004904#endif
4905
4906#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004907#if (SIZEOF_INT != 4)
4908#error "Not sure if in_addr_t exists and int is not 32-bits."
4909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 /* Have to use inet_addr() instead */
4911 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4916 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004917
Tim Peters1df9fdd2003-02-13 03:13:40 +00004918
4919#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004920
4921#ifdef USE_INET_ATON_WEAKLINK
4922 if (inet_aton != NULL) {
4923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004924 if (inet_aton(ip_addr, &buf))
4925 return PyBytes_FromStringAndSize((char *)(&buf),
4926 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004927
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004928 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 "illegal IP address string passed to inet_aton");
4930 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004931
Thomas Wouters477c8d52006-05-27 19:21:47 +00004932#ifdef USE_INET_ATON_WEAKLINK
4933 } else {
4934#endif
4935
4936#endif
4937
4938#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 /* special-case this address as inet_addr might return INADDR_NONE
4941 * for this */
4942 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004943 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004949 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 "illegal IP address string passed to inet_aton");
4951 return NULL;
4952 }
4953 }
4954 return PyBytes_FromStringAndSize((char *) &packed_addr,
4955 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004956
4957#ifdef USE_INET_ATON_WEAKLINK
4958 }
4959#endif
4960
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004961#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004962}
4963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004964PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004965"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004966\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004967Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004968
4969static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004970socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 char *packed_str;
4973 int addr_len;
4974 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4977 return NULL;
4978 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004981 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 "packed IP wrong length for inet_ntoa");
4983 return NULL;
4984 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004989}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004990
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004991#ifdef HAVE_INET_PTON
4992
4993PyDoc_STRVAR(inet_pton_doc,
4994"inet_pton(af, ip) -> packed IP address string\n\
4995\n\
4996Convert an IP address from string format to a packed string suitable\n\
4997for use with low-level network functions.");
4998
4999static PyObject *
5000socket_inet_pton(PyObject *self, PyObject *args)
5001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 int af;
5003 char* ip;
5004 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005005#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005006 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005007#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5011 return NULL;
5012 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005013
Martin v. Löwis04697e82004-06-02 12:35:29 +00005014#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005016 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 "can't use AF_INET6, IPv6 is disabled");
5018 return NULL;
5019 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005020#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 retval = inet_pton(af, ip, packed);
5023 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005024 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 return NULL;
5026 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005027 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 "illegal IP address string passed to inet_pton");
5029 return NULL;
5030 } else if (af == AF_INET) {
5031 return PyBytes_FromStringAndSize(packed,
5032 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005033#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 } else if (af == AF_INET6) {
5035 return PyBytes_FromStringAndSize(packed,
5036 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005039 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 return NULL;
5041 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005042}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005043
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005044PyDoc_STRVAR(inet_ntop_doc,
5045"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5046\n\
5047Convert a packed IP address of the given family to string format.");
5048
5049static PyObject *
5050socket_inet_ntop(PyObject *self, PyObject *args)
5051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 int af;
5053 char* packed;
5054 int len;
5055 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005056#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005057 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005058#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005060#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005062 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5063 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5066 return NULL;
5067 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 if (af == AF_INET) {
5070 if (len != sizeof(struct in_addr)) {
5071 PyErr_SetString(PyExc_ValueError,
5072 "invalid length of packed IP address string");
5073 return NULL;
5074 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005075#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 } else if (af == AF_INET6) {
5077 if (len != sizeof(struct in6_addr)) {
5078 PyErr_SetString(PyExc_ValueError,
5079 "invalid length of packed IP address string");
5080 return NULL;
5081 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 } else {
5084 PyErr_Format(PyExc_ValueError,
5085 "unknown address family %d", af);
5086 return NULL;
5087 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 retval = inet_ntop(af, packed, ip, sizeof(ip));
5090 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005091 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 return NULL;
5093 } else {
5094 return PyUnicode_FromString(retval);
5095 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 /* NOTREACHED */
5098 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5099 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005100}
5101
5102#endif /* HAVE_INET_PTON */
5103
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005104/* Python interface to getaddrinfo(host, port). */
5105
5106/*ARGSUSED*/
5107static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005108socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005109{
Victor Stinner77af1722011-05-26 14:05:59 +02005110 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005111 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 struct addrinfo hints, *res;
5113 struct addrinfo *res0 = NULL;
5114 PyObject *hobj = NULL;
5115 PyObject *pobj = (PyObject *)NULL;
5116 char pbuf[30];
5117 char *hptr, *pptr;
5118 int family, socktype, protocol, flags;
5119 int error;
5120 PyObject *all = (PyObject *)NULL;
5121 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 family = socktype = protocol = flags = 0;
5124 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005125 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005126 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 &protocol, &flags)) {
5128 return NULL;
5129 }
5130 if (hobj == Py_None) {
5131 hptr = NULL;
5132 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005133 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005134
5135 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 if (!idna)
5137 return NULL;
5138 assert(PyBytes_Check(idna));
5139 hptr = PyBytes_AS_STRING(idna);
5140 } else if (PyBytes_Check(hobj)) {
5141 hptr = PyBytes_AsString(hobj);
5142 } else {
5143 PyErr_SetString(PyExc_TypeError,
5144 "getaddrinfo() argument 1 must be string or None");
5145 return NULL;
5146 }
5147 if (PyLong_CheckExact(pobj)) {
5148 long value = PyLong_AsLong(pobj);
5149 if (value == -1 && PyErr_Occurred())
5150 goto err;
5151 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5152 pptr = pbuf;
5153 } else if (PyUnicode_Check(pobj)) {
5154 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005155 if (pptr == NULL)
5156 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005158 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 } else if (pobj == Py_None) {
5160 pptr = (char *)NULL;
5161 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005162 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 goto err;
5164 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005165#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005166 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5167 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
5168 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5169 * This workaround avoids a segfault in libsystem.
5170 */
5171 pptr = "00";
5172 }
5173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 memset(&hints, 0, sizeof(hints));
5175 hints.ai_family = family;
5176 hints.ai_socktype = socktype;
5177 hints.ai_protocol = protocol;
5178 hints.ai_flags = flags;
5179 Py_BEGIN_ALLOW_THREADS
5180 ACQUIRE_GETADDRINFO_LOCK
5181 error = getaddrinfo(hptr, pptr, &hints, &res0);
5182 Py_END_ALLOW_THREADS
5183 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5184 if (error) {
5185 set_gaierror(error);
5186 goto err;
5187 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 if ((all = PyList_New(0)) == NULL)
5190 goto err;
5191 for (res = res0; res; res = res->ai_next) {
5192 PyObject *single;
5193 PyObject *addr =
5194 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5195 if (addr == NULL)
5196 goto err;
5197 single = Py_BuildValue("iiisO", res->ai_family,
5198 res->ai_socktype, res->ai_protocol,
5199 res->ai_canonname ? res->ai_canonname : "",
5200 addr);
5201 Py_DECREF(addr);
5202 if (single == NULL)
5203 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 if (PyList_Append(all, single))
5206 goto err;
5207 Py_XDECREF(single);
5208 }
5209 Py_XDECREF(idna);
5210 if (res0)
5211 freeaddrinfo(res0);
5212 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005213 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 Py_XDECREF(all);
5215 Py_XDECREF(idna);
5216 if (res0)
5217 freeaddrinfo(res0);
5218 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005219}
5220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005221PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005222"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5223 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005224\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005225Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005226
5227/* Python interface to getnameinfo(sa, flags). */
5228
5229/*ARGSUSED*/
5230static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005231socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 PyObject *sa = (PyObject *)NULL;
5234 int flags;
5235 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005236 int port;
5237 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5239 struct addrinfo hints, *res = NULL;
5240 int error;
5241 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 flags = flowinfo = scope_id = 0;
5244 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5245 return NULL;
5246 if (!PyTuple_Check(sa)) {
5247 PyErr_SetString(PyExc_TypeError,
5248 "getnameinfo() argument 1 must be a tuple");
5249 return NULL;
5250 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005251 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 &hostp, &port, &flowinfo, &scope_id))
5253 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005254 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005255 PyErr_SetString(PyExc_OverflowError,
5256 "getsockaddrarg: flowinfo must be 0-1048575.");
5257 return NULL;
5258 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5260 memset(&hints, 0, sizeof(hints));
5261 hints.ai_family = AF_UNSPEC;
5262 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005263 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 Py_BEGIN_ALLOW_THREADS
5265 ACQUIRE_GETADDRINFO_LOCK
5266 error = getaddrinfo(hostp, pbuf, &hints, &res);
5267 Py_END_ALLOW_THREADS
5268 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5269 if (error) {
5270 set_gaierror(error);
5271 goto fail;
5272 }
5273 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005274 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 "sockaddr resolved to multiple addresses");
5276 goto fail;
5277 }
5278 switch (res->ai_family) {
5279 case AF_INET:
5280 {
5281 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005282 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 "IPv4 sockaddr must be 2 tuple");
5284 goto fail;
5285 }
5286 break;
5287 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005288#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 case AF_INET6:
5290 {
5291 struct sockaddr_in6 *sin6;
5292 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005293 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 sin6->sin6_scope_id = scope_id;
5295 break;
5296 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005299 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5301 if (error) {
5302 set_gaierror(error);
5303 goto fail;
5304 }
5305 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005306
5307fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 if (res)
5309 freeaddrinfo(res);
5310 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005311}
5312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005313PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005314"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005315\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005316Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005317
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005318
5319/* Python API to getting and setting the default timeout value. */
5320
5321static PyObject *
5322socket_getdefaulttimeout(PyObject *self)
5323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 if (defaulttimeout < 0.0) {
5325 Py_INCREF(Py_None);
5326 return Py_None;
5327 }
5328 else
5329 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005330}
5331
5332PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005333"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005334\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005335Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005336A value of None indicates that new socket objects have no timeout.\n\
5337When the socket module is first imported, the default is None.");
5338
5339static PyObject *
5340socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 if (arg == Py_None)
5345 timeout = -1.0;
5346 else {
5347 timeout = PyFloat_AsDouble(arg);
5348 if (timeout < 0.0) {
5349 if (!PyErr_Occurred())
5350 PyErr_SetString(PyExc_ValueError,
5351 "Timeout value out of range");
5352 return NULL;
5353 }
5354 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 Py_INCREF(Py_None);
5359 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005360}
5361
5362PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005363"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005364\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005365Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005366A value of None indicates that new socket objects have no timeout.\n\
5367When the socket module is first imported, the default is None.");
5368
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005369#ifdef HAVE_IF_NAMEINDEX
5370/* Python API for getting interface indices and names */
5371
5372static PyObject *
5373socket_if_nameindex(PyObject *self, PyObject *arg)
5374{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005375 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005376 int i;
5377 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005378
Charles-François Natali60713592011-05-20 16:55:06 +02005379 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005380 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005381 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005382 return NULL;
5383 }
5384
5385 list = PyList_New(0);
5386 if (list == NULL) {
5387 if_freenameindex(ni);
5388 return NULL;
5389 }
5390
Charles-François Natali60713592011-05-20 16:55:06 +02005391 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5392 PyObject *ni_tuple = Py_BuildValue("IO&",
5393 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005394
5395 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5396 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005397 Py_DECREF(list);
5398 if_freenameindex(ni);
5399 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005400 }
5401 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005402 }
5403
5404 if_freenameindex(ni);
5405 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005406}
5407
5408PyDoc_STRVAR(if_nameindex_doc,
5409"if_nameindex()\n\
5410\n\
5411Returns a list of network interface information (index, name) tuples.");
5412
Charles-François Natali60713592011-05-20 16:55:06 +02005413static PyObject *
5414socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005415{
Charles-François Natali60713592011-05-20 16:55:06 +02005416 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005417 unsigned long index;
5418
Charles-François Natali60713592011-05-20 16:55:06 +02005419 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5420 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005421 return NULL;
5422
Charles-François Natali60713592011-05-20 16:55:06 +02005423 index = if_nametoindex(PyBytes_AS_STRING(oname));
5424 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005425 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005426 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005427 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005428 return NULL;
5429 }
5430
5431 return PyLong_FromUnsignedLong(index);
5432}
5433
5434PyDoc_STRVAR(if_nametoindex_doc,
5435"if_nametoindex(if_name)\n\
5436\n\
5437Returns the interface index corresponding to the interface name if_name.");
5438
Charles-François Natali60713592011-05-20 16:55:06 +02005439static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005440socket_if_indextoname(PyObject *self, PyObject *arg)
5441{
Charles-François Natali60713592011-05-20 16:55:06 +02005442 unsigned long index;
5443 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005444
Charles-François Natali60713592011-05-20 16:55:06 +02005445 index = PyLong_AsUnsignedLong(arg);
5446 if (index == (unsigned long) -1)
5447 return NULL;
5448
5449 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005450 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005451 return NULL;
5452 }
5453
Charles-François Natali60713592011-05-20 16:55:06 +02005454 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005455}
5456
5457PyDoc_STRVAR(if_indextoname_doc,
5458"if_indextoname(if_index)\n\
5459\n\
5460Returns the interface name corresponding to the interface index if_index.");
5461
5462#endif /* HAVE_IF_NAMEINDEX */
5463
5464
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005465#ifdef CMSG_LEN
5466/* Python interface to CMSG_LEN(length). */
5467
5468static PyObject *
5469socket_CMSG_LEN(PyObject *self, PyObject *args)
5470{
5471 Py_ssize_t length;
5472 size_t result;
5473
5474 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5475 return NULL;
5476 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5477 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5478 return NULL;
5479 }
5480 return PyLong_FromSize_t(result);
5481}
5482
5483PyDoc_STRVAR(CMSG_LEN_doc,
5484"CMSG_LEN(length) -> control message length\n\
5485\n\
5486Return the total length, without trailing padding, of an ancillary\n\
5487data item with associated data of the given length. This value can\n\
5488often be used as the buffer size for recvmsg() to receive a single\n\
5489item of ancillary data, but RFC 3542 requires portable applications to\n\
5490use CMSG_SPACE() and thus include space for padding, even when the\n\
5491item will be the last in the buffer. Raises OverflowError if length\n\
5492is outside the permissible range of values.");
5493
5494
5495#ifdef CMSG_SPACE
5496/* Python interface to CMSG_SPACE(length). */
5497
5498static PyObject *
5499socket_CMSG_SPACE(PyObject *self, PyObject *args)
5500{
5501 Py_ssize_t length;
5502 size_t result;
5503
5504 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5505 return NULL;
5506 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5507 PyErr_SetString(PyExc_OverflowError,
5508 "CMSG_SPACE() argument out of range");
5509 return NULL;
5510 }
5511 return PyLong_FromSize_t(result);
5512}
5513
5514PyDoc_STRVAR(CMSG_SPACE_doc,
5515"CMSG_SPACE(length) -> buffer size\n\
5516\n\
5517Return the buffer size needed for recvmsg() to receive an ancillary\n\
5518data item with associated data of the given length, along with any\n\
5519trailing padding. The buffer space needed to receive multiple items\n\
5520is the sum of the CMSG_SPACE() values for their associated data\n\
5521lengths. Raises OverflowError if length is outside the permissible\n\
5522range of values.");
5523#endif /* CMSG_SPACE */
5524#endif /* CMSG_LEN */
5525
5526
Guido van Rossum30a685f1991-06-27 15:51:29 +00005527/* List of functions exported by this module. */
5528
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005529static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 {"gethostbyname", socket_gethostbyname,
5531 METH_VARARGS, gethostbyname_doc},
5532 {"gethostbyname_ex", socket_gethostbyname_ex,
5533 METH_VARARGS, ghbn_ex_doc},
5534 {"gethostbyaddr", socket_gethostbyaddr,
5535 METH_VARARGS, gethostbyaddr_doc},
5536 {"gethostname", socket_gethostname,
5537 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005538#ifdef HAVE_SETHOSTNAME
5539 {"sethostname", socket_sethostname,
5540 METH_VARARGS, sethostname_doc},
5541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 {"getservbyname", socket_getservbyname,
5543 METH_VARARGS, getservbyname_doc},
5544 {"getservbyport", socket_getservbyport,
5545 METH_VARARGS, getservbyport_doc},
5546 {"getprotobyname", socket_getprotobyname,
5547 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005548#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 {"dup", socket_dup,
5550 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005551#endif
Dave Cole331708b2004-08-09 04:51:41 +00005552#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 {"socketpair", socket_socketpair,
5554 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 {"ntohs", socket_ntohs,
5557 METH_VARARGS, ntohs_doc},
5558 {"ntohl", socket_ntohl,
5559 METH_O, ntohl_doc},
5560 {"htons", socket_htons,
5561 METH_VARARGS, htons_doc},
5562 {"htonl", socket_htonl,
5563 METH_O, htonl_doc},
5564 {"inet_aton", socket_inet_aton,
5565 METH_VARARGS, inet_aton_doc},
5566 {"inet_ntoa", socket_inet_ntoa,
5567 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005568#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 {"inet_pton", socket_inet_pton,
5570 METH_VARARGS, inet_pton_doc},
5571 {"inet_ntop", socket_inet_ntop,
5572 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005573#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005574 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5575 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 {"getnameinfo", socket_getnameinfo,
5577 METH_VARARGS, getnameinfo_doc},
5578 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5579 METH_NOARGS, getdefaulttimeout_doc},
5580 {"setdefaulttimeout", socket_setdefaulttimeout,
5581 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005582#ifdef HAVE_IF_NAMEINDEX
5583 {"if_nameindex", socket_if_nameindex,
5584 METH_NOARGS, if_nameindex_doc},
5585 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005586 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005587 {"if_indextoname", socket_if_indextoname,
5588 METH_O, if_indextoname_doc},
5589#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005590#ifdef CMSG_LEN
5591 {"CMSG_LEN", socket_CMSG_LEN,
5592 METH_VARARGS, CMSG_LEN_doc},
5593#ifdef CMSG_SPACE
5594 {"CMSG_SPACE", socket_CMSG_SPACE,
5595 METH_VARARGS, CMSG_SPACE_doc},
5596#endif
5597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005599};
5600
Guido van Rossum30a685f1991-06-27 15:51:29 +00005601
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005602#ifdef MS_WINDOWS
5603#define OS_INIT_DEFINED
5604
5605/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005606
5607static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005608os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005611}
5612
5613static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005614os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 WSADATA WSAData;
5617 int ret;
5618 ret = WSAStartup(0x0101, &WSAData);
5619 switch (ret) {
5620 case 0: /* No error */
5621 Py_AtExit(os_cleanup);
5622 return 1; /* Success */
5623 case WSASYSNOTREADY:
5624 PyErr_SetString(PyExc_ImportError,
5625 "WSAStartup failed: network not ready");
5626 break;
5627 case WSAVERNOTSUPPORTED:
5628 case WSAEINVAL:
5629 PyErr_SetString(
5630 PyExc_ImportError,
5631 "WSAStartup failed: requested version not supported");
5632 break;
5633 default:
5634 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5635 break;
5636 }
5637 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005638}
5639
Guido van Rossum8d665e61996-06-26 18:22:49 +00005640#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005641
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005642
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005643
5644#ifndef OS_INIT_DEFINED
5645static int
5646os_init(void)
5647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005649}
5650#endif
5651
5652
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005653/* C API table - always add new things to the end for binary
5654 compatibility. */
5655static
5656PySocketModule_APIObject PySocketModuleAPI =
5657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005659 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005661};
5662
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005663
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005664/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005665
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005666 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005667 "socket.py" which implements some additional functionality.
5668 The import of "_socket" may fail with an ImportError exception if
5669 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005670 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005671 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005672*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005673
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005674PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005675"Implementation module for socket operations.\n\
5676\n\
5677See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005678
Martin v. Löwis1a214512008-06-11 05:26:20 +00005679static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 PyModuleDef_HEAD_INIT,
5681 PySocket_MODULE_NAME,
5682 socket_doc,
5683 -1,
5684 socket_methods,
5685 NULL,
5686 NULL,
5687 NULL,
5688 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005689};
5690
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005691PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005692PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 if (!os_init())
5697 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005698
Victor Stinnerdaf45552013-08-28 00:53:59 +02005699#ifdef MS_WINDOWS
5700 if (support_wsa_no_inherit == -1) {
5701 DWORD version = GetVersion();
5702 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5703 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5704 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5705 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5706 }
5707#endif
5708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 Py_TYPE(&sock_type) = &PyType_Type;
5710 m = PyModule_Create(&socketmodule);
5711 if (m == NULL)
5712 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005713
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005714 Py_INCREF(PyExc_OSError);
5715 PySocketModuleAPI.error = PyExc_OSError;
5716 Py_INCREF(PyExc_OSError);
5717 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005719 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 if (socket_herror == NULL)
5721 return NULL;
5722 Py_INCREF(socket_herror);
5723 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005724 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 NULL);
5726 if (socket_gaierror == NULL)
5727 return NULL;
5728 Py_INCREF(socket_gaierror);
5729 PyModule_AddObject(m, "gaierror", socket_gaierror);
5730 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005731 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 if (socket_timeout == NULL)
5733 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005734 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 Py_INCREF(socket_timeout);
5736 PyModule_AddObject(m, "timeout", socket_timeout);
5737 Py_INCREF((PyObject *)&sock_type);
5738 if (PyModule_AddObject(m, "SocketType",
5739 (PyObject *)&sock_type) != 0)
5740 return NULL;
5741 Py_INCREF((PyObject *)&sock_type);
5742 if (PyModule_AddObject(m, "socket",
5743 (PyObject *)&sock_type) != 0)
5744 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005745
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005746#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 Py_INCREF(has_ipv6);
5752 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 /* Export C API */
5755 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5756 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5757 ) != 0)
5758 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005761#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005762 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005763#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005764 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005765#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005766 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005767#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005768#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005769 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005770#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005771#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005773 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005774#endif
5775#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005776 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005777#endif
5778#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005780 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005781#endif
5782#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005784 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005785#endif
5786#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005788 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005789#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005790#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005792 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005793#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005794#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005796 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005797#endif
5798#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005800 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005801#endif
5802#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005803 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005804#endif
5805#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005807 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005808#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005809#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005811 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005812#endif
5813#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005815 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005816#endif
5817#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005819 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005820#endif
5821#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005823 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005824#endif
5825#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005827 PyModule_AddIntMacro(m, AF_NETLINK);
5828 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005829#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005830 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005831#endif
5832#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005833 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005834#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005835 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5836 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005837#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005838 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005839#endif
5840#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005841 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005842#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005843#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005844 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005845#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005846#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005847 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005848#endif
5849#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005850 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005851#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005852 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005853#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005854 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005855#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005856#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005857 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005858#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005859#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005860#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005862 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005863#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02005864#ifdef AF_LINK
5865 PyModule_AddIntMacro(m, AF_LINK);
5866#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005867#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005869 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005870#endif
5871#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005873 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005874#endif
5875#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005877 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005878#endif
5879#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005881 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005882#endif
5883#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005885 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005886#endif
5887#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005889 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005890#endif
5891#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005893 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005894#endif
5895#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005897 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005898#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005899
Hye-Shik Chang81268602004-02-02 06:05:24 +00005900#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005901 PyModule_AddIntMacro(m, AF_BLUETOOTH);
5902 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
5903 PyModule_AddIntMacro(m, BTPROTO_HCI);
5904 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005905#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005906 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005907#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005908#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005909#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005910 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005911#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005912 PyModule_AddIntMacro(m, HCI_DATA_DIR);
5913 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005914#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005915 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5917 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005918#endif
5919
Charles-François Natali47413c12011-10-06 19:47:44 +02005920#ifdef AF_CAN
5921 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005922 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005923#endif
5924#ifdef PF_CAN
5925 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005926 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005927#endif
5928
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005929/* Reliable Datagram Sockets */
5930#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005931 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005932#endif
5933#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005934 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005935#endif
5936
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005937/* Kernel event messages */
5938#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005939 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005940#endif
5941#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005942 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005943#endif
5944
Antoine Pitroub156a462010-10-27 20:13:57 +00005945#ifdef AF_PACKET
5946 PyModule_AddIntMacro(m, AF_PACKET);
5947#endif
5948#ifdef PF_PACKET
5949 PyModule_AddIntMacro(m, PF_PACKET);
5950#endif
5951#ifdef PACKET_HOST
5952 PyModule_AddIntMacro(m, PACKET_HOST);
5953#endif
5954#ifdef PACKET_BROADCAST
5955 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5956#endif
5957#ifdef PACKET_MULTICAST
5958 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5959#endif
5960#ifdef PACKET_OTHERHOST
5961 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5962#endif
5963#ifdef PACKET_OUTGOING
5964 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5965#endif
5966#ifdef PACKET_LOOPBACK
5967 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5968#endif
5969#ifdef PACKET_FASTROUTE
5970 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005971#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005972
Christian Heimes043d6f62008-01-07 17:19:16 +00005973#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005974 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005977 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
5978 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
5979 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005980
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
5982 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
5983 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005986 PyModule_AddIntMacro(m, SOL_TIPC);
5987 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
5988 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
5989 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
5990 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005991
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005992 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
5993 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
5994 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
5995 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005998 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
5999 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006000#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006002 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006003#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006004 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6005 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6006 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6007 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6008 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6009 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006010#endif
6011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006013 PyModule_AddIntMacro(m, SOCK_STREAM);
6014 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006015/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006016 PyModule_AddIntMacro(m, SOCK_RAW);
6017 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006018#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006019 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006020#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006021#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006022 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006023#endif
6024#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006025 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006026#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006029 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006032 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006035 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006036#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006037#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006038 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006039#endif
6040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006042 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006045 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006048 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006051 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006054 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006060 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006063 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006066 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006069 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006072 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006075 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006078 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006081 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006084 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006087 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006088#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006089#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006090 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006091#endif
6092#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006093 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006094#endif
6095#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006096 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006097#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006098#ifdef SO_BINDTODEVICE
6099 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6100#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 /* Maximum number of connections for "listen" */
6103#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006104 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006105#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006106 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006107#endif
6108
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006109 /* Ancilliary message types */
6110#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006111 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006112#endif
6113#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006114 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006115#endif
6116#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006117 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006118#endif
6119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 /* Flags for send, recv */
6121#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006122 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006125 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006128 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006129#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006131 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006134 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006137 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006140 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006146 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006150#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006151#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006152 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006153#endif
6154#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006155 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006156#endif
6157#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006159#endif
6160#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006161 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006162#endif
6163#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006164 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006165#endif
6166#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006168#endif
6169#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006171#endif
6172#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006173 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006174#endif
6175#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006176 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006177#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006178#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006180#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 /* Protocol level and numbers, usable for [gs]etsockopt */
6183#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006184 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006188#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006192 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006204 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006208#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006212 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006213#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006215#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006216#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006218#endif
6219#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006220 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6221 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006222#endif
6223#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006224 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6225 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6226 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006227
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6229 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6230 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006231#endif
6232#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6234 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6235 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6236 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006237#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006238#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006239 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006240 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6241 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6242 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6243 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6244 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6245 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6246 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6247 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6248 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6249 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6250 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6251 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6252#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006253#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006254 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006255#endif
6256#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006258#endif
6259#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006261#endif
6262#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006263 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006264#endif
6265#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006266 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006267#endif
6268#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006269 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006270#endif
6271#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006272 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006275 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006276#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006284#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006303 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006304#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006308 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006311 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006314 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006315#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006319 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006322 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006325 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006327#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006328 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006331 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006334 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006340 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006343 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006349 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006352 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006355 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006358 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006361 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006364 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006367 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006370 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006377#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006378#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006383#endif
6384/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006387#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006391 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006392#endif
6393
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006394#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006396#endif
6397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 /* Some port configuration */
6399#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006401#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006406#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006408#endif
6409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 /* Some reserved IP v.4 addresses */
6411#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006413#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006417 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006418#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006422 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006423#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006428#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef INADDR_ALLHOSTS_GROUP
6432 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6433 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006434#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006439#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006443 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006444#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006446#endif
6447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 /* IPv4 [gs]etsockopt options */
6449#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006450 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006465 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006468 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006477 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006483 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006492 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006496#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006497#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006499#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6502#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006503 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006509 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006515 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006521#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006525#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006527#endif
6528#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006530#endif
6531#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006533#endif
6534#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006536#endif
6537#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006539#endif
6540#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006542#endif
6543#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006545#endif
6546#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006548#endif
6549#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006551#endif
6552#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006554#endif
6555#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006557#endif
6558#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006560#endif
6561#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006563#endif
6564#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006566#endif
6567#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006569#endif
6570#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006572#endif
6573#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006575#endif
6576#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006578#endif
6579#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006581#endif
6582#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006584#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 /* TCP options */
6587#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006622#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006623#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006625#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627 /* IPX options */
6628#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006630#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006631
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006632/* Reliable Datagram Sockets */
6633#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006635#endif
6636#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006638#endif
6639#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006641#endif
6642#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006644#endif
6645#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006647#endif
6648#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006650#endif
6651#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006653#endif
6654#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006656#endif
6657#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006659#endif
6660#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006662#endif
6663#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006665#endif
6666#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006668#endif
6669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006671#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006673#endif
6674#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006676#endif
6677#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006679#endif
6680#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006682#endif
6683#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006685#endif
6686#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006688#endif
6689#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006691#endif
6692#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006694#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006695#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006697#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006698#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006700#endif
6701#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006703#endif
6704#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006706#endif
6707#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006709#endif
6710#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006712#endif
6713#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006715#endif
6716#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006718#endif
6719#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006721#endif
6722#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006723 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006724#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006725#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006727#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006728#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006730#endif
6731#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006733#endif
6734#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006735 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006736#endif
6737#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006738 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006739#endif
6740#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006741 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006742#endif
6743#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006744 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006745#endif
6746#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006748#endif
6749#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006751#endif
6752#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006754#endif
6755#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006757#endif
6758#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006760#endif
6761#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006763#endif
6764#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006766#endif
6767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006768 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006769#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006771#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006773#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006775#endif
6776#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006778#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006779 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006780#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006782#endif
6783#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006785#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006787#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006789#endif
6790
Christian Heimesfaf2f632008-01-06 16:59:19 +00006791#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792 {
6793 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6794 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6795 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006796 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006797 PyObject *tmp;
6798 tmp = PyLong_FromUnsignedLong(codes[i]);
6799 if (tmp == NULL)
6800 return NULL;
6801 PyModule_AddObject(m, names[i], tmp);
6802 }
6803 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, RCVALL_OFF);
6805 PyModule_AddIntMacro(m, RCVALL_ON);
6806 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006807#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006809#endif
6810#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006812#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006813#endif /* _MSTCPIP_ */
6814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006815 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006816#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006817 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006820}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006821
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006822
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006823#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006824#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006825
6826/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006827/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006828
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006829int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006830inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006833#if (SIZEOF_INT != 4)
6834#error "Not sure if in_addr_t exists and int is not 32-bits."
6835#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006836 unsigned int packed_addr;
6837 packed_addr = inet_addr(src);
6838 if (packed_addr == INADDR_NONE)
6839 return 0;
6840 memcpy(dst, &packed_addr, 4);
6841 return 1;
6842 }
6843 /* Should set errno to EAFNOSUPPORT */
6844 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006845}
6846
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006847const char *
6848inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850 if (af == AF_INET) {
6851 struct in_addr packed_addr;
6852 if (size < 16)
6853 /* Should set errno to ENOSPC. */
6854 return NULL;
6855 memcpy(&packed_addr, src, sizeof(packed_addr));
6856 return strncpy(dst, inet_ntoa(packed_addr), size);
6857 }
6858 /* Should set errno to EAFNOSUPPORT */
6859 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006860}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006861
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006862#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006863#endif