blob: cb29821a507f206710db96afdbe0d585e5bc914f [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Jeremy Hylton22308652001-02-02 03:23:09 +0000287#endif
288
Skip Montanaro7befb992004-02-10 16:50:21 +0000289#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000290
Neal Norwitz39d22e52002-11-02 19:55:21 +0000291#ifndef O_NONBLOCK
292# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000293#endif
294
Trent Micka708d6e2004-09-07 17:48:26 +0000295/* include Python's addrinfo.h unless it causes trouble */
296#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
297 /* Do not include addinfo.h on some newer IRIX versions.
298 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
299 * for example, but not by 6.5.10.
300 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000302 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
303 * EAI_* constants are defined in (the already included) ws2tcpip.h.
304 */
305#else
306# include "addrinfo.h"
307#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000308
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000309#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000310#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000311int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000312const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000313#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000314#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000315
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000316#ifdef __APPLE__
317/* On OS X, getaddrinfo returns no error indication of lookup
318 failure, so we must use the emulation instead of the libinfo
319 implementation. Unfortunately, performing an autoconf test
320 for this bug would require DNS access for the machine performing
321 the configuration, which is not acceptable. Therefore, we
322 determine the bug just by checking for __APPLE__. If this bug
323 gets ever fixed, perhaps checking for sys/version.h would be
324 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000325#ifndef HAVE_GETNAMEINFO
326/* This bug seems to be fixed in Jaguar. Ths easiest way I could
327 Find to check for Jaguar is that it has getnameinfo(), which
328 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000329#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000330#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000331
332#ifdef HAVE_INET_ATON
333#define USE_INET_ATON_WEAKLINK
334#endif
335
Jack Jansen84262fb2002-07-02 14:40:42 +0000336#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000338/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000340/* avoid clashes with the C library definition of the symbol. */
341#define getaddrinfo fake_getaddrinfo
342#define gai_strerror fake_gai_strerror
343#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000344#include "getaddrinfo.c"
345#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000347#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348#include "getnameinfo.c"
349#endif
350
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000351#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000352#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000353#endif
354
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000355#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000356#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000357#define EAFNOSUPPORT WSAEAFNOSUPPORT
358#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000359#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000360
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000361#ifndef SOCKETCLOSE
362#define SOCKETCLOSE close
363#endif
364
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000365#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000366#define USE_BLUETOOTH 1
367#if defined(__FreeBSD__)
368#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
369#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000370#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371#define SOL_HCI SOL_HCI_RAW
372#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000373#define sockaddr_l2 sockaddr_l2cap
374#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000375#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000376#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
377#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000378#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000379#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000380#define sockaddr_l2 sockaddr_bt
381#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000382#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000383#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#define SOL_HCI BTPROTO_HCI
385#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000386#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
387#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000388#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000389#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
395#endif
396#endif
397
Charles-François Natali8b759652011-12-23 16:44:51 +0100398/* Convert "sock_addr_t *" to "struct sockaddr *". */
399#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000400
Martin v. Löwise9416172003-05-03 10:12:45 +0000401/*
402 * Constants for getnameinfo()
403 */
404#if !defined(NI_MAXHOST)
405#define NI_MAXHOST 1025
406#endif
407#if !defined(NI_MAXSERV)
408#define NI_MAXSERV 32
409#endif
410
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000411#ifndef INVALID_SOCKET /* MS defines this */
412#define INVALID_SOCKET (-1)
413#endif
414
Charles-François Natali0cc86852013-09-13 19:53:08 +0200415#ifndef INADDR_NONE
416#define INADDR_NONE (-1)
417#endif
418
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000419/* XXX There's a problem here: *static* functions are not supposed to have
420 a Py prefix (or use CapitalizedWords). Later... */
421
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422/* Global variable holding the exception type for errors detected
423 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000424static PyObject *socket_herror;
425static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000426static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427
Tim Peters643a7fc2002-02-17 04:13:21 +0000428/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429 The sock_type variable contains pointers to various functions,
430 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000431 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000432static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000433
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434#if defined(HAVE_POLL_H)
435#include <poll.h>
436#elif defined(HAVE_SYS_POLL_H)
437#include <sys/poll.h>
438#endif
439
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000440/* Largest value to try to store in a socklen_t (used when handling
441 ancillary data). POSIX requires socklen_t to hold at least
442 (2**31)-1 and recommends against storing larger values, but
443 socklen_t was originally int in the BSD interface, so to be on the
444 safe side we use the smaller of (2**31)-1 and INT_MAX. */
445#if INT_MAX > 0x7fffffff
446#define SOCKLEN_T_LIMIT 0x7fffffff
447#else
448#define SOCKLEN_T_LIMIT INT_MAX
449#endif
450
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200451#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000452/* Instead of select(), we'll use poll() since poll() works on any fd. */
453#define IS_SELECTABLE(s) 1
454/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000455#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456/* If there's no timeout left, we don't have to call select, so it's a safe,
457 * little white lie. */
458#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000459#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000460
461static PyObject*
462select_error(void)
463{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200464 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000466}
467
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000468#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000469#ifndef WSAEAGAIN
470#define WSAEAGAIN WSAEWOULDBLOCK
471#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000472#define CHECK_ERRNO(expected) \
473 (WSAGetLastError() == WSA ## expected)
474#else
475#define CHECK_ERRNO(expected) \
476 (errno == expected)
477#endif
478
Victor Stinnerdaf45552013-08-28 00:53:59 +0200479#ifdef MS_WINDOWS
480/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
481static int support_wsa_no_inherit = -1;
482#endif
483
Guido van Rossum30a685f1991-06-27 15:51:29 +0000484/* Convenience function to raise an error according to errno
485 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000486
Guido van Rossum73624e91994-10-10 17:59:00 +0000487static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000488set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000490#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 int err_no = WSAGetLastError();
492 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
493 recognizes the error codes used by both GetLastError() and
494 WSAGetLastError */
495 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200496 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000497#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000498
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200499 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500}
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000504set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000507
508#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 if (v != NULL) {
514 PyErr_SetObject(socket_herror, v);
515 Py_DECREF(v);
516 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000519}
520
521
522static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000523set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526
Martin v. Löwis272cb402002-03-01 08:31:07 +0000527#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 /* EAI_SYSTEM is not available on Windows XP. */
529 if (error == EAI_SYSTEM)
530 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000531#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000532
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000533#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000535#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (v != NULL) {
539 PyErr_SetObject(socket_gaierror, v);
540 Py_DECREF(v);
541 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544}
545
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000546/* Function to perform the setting of socket blocking mode
547 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000548static int
549internal_setblocking(PySocketSockObject *s, int block)
550{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200551#ifdef MS_WINDOWS
552 u_long arg;
553#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100554#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100555 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100556 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000557#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000558#ifdef SOCK_NONBLOCK
559 if (block)
560 s->sock_type &= (~SOCK_NONBLOCK);
561 else
562 s->sock_type |= SOCK_NONBLOCK;
563#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000566#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100567#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 block = !block;
569 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100570#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
572 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100573 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 else
Victor Stinner9a954832013-12-04 00:41:24 +0100575 new_delay_flag = delay_flag | O_NONBLOCK;
576 if (new_delay_flag != delay_flag)
577 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
578#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000579#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200580 arg = !block;
581 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 /* Since these don't return anything */
586 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587}
588
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000589/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000590 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000591 This does not raise an exception; we'll let our caller do that
592 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000593 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000594static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000595internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 /* Nothing to do unless we're in timeout mode (not non-blocking) */
600 if (s->sock_timeout <= 0.0)
601 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Guard against closed socket */
604 if (s->sock_fd < 0)
605 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000606
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000607 /* Handling this condition here simplifies the select loops */
608 if (interval < 0.0)
609 return 1;
610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 /* Prefer poll, if available, since you can poll() any fd
612 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 {
615 struct pollfd pollfd;
616 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 pollfd.fd = s->sock_fd;
619 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000622 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 n = poll(&pollfd, 1, timeout);
624 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000625#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 {
627 /* Construct the arguments to select */
628 fd_set fds;
629 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000630 tv.tv_sec = (int)interval;
631 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 FD_ZERO(&fds);
633 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 /* See if the socket is ready */
636 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000637 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
638 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000640 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
641 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000643#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 if (n < 0)
646 return -1;
647 if (n == 0)
648 return 1;
649 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650}
651
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000652static int
653internal_select(PySocketSockObject *s, int writing)
654{
655 return internal_select_ex(s, writing, s->sock_timeout);
656}
657
658/*
659 Two macros for automatic retry of select() in case of false positives
660 (for example, select() could indicate a socket is ready for reading
661 but the data then discarded by the OS because of a wrong checksum).
662 Here is an example of use:
663
664 BEGIN_SELECT_LOOP(s)
665 Py_BEGIN_ALLOW_THREADS
666 timeout = internal_select_ex(s, 0, interval);
667 if (!timeout)
668 outlen = recv(s->sock_fd, cbuf, len, flags);
669 Py_END_ALLOW_THREADS
670 if (timeout == 1) {
671 PyErr_SetString(socket_timeout, "timed out");
672 return -1;
673 }
674 END_SELECT_LOOP(s)
675*/
676
677#define BEGIN_SELECT_LOOP(s) \
678 { \
679 _PyTime_timeval now, deadline = {0, 0}; \
680 double interval = s->sock_timeout; \
681 int has_timeout = s->sock_timeout > 0.0; \
682 if (has_timeout) { \
Victor Stinnerae586492014-09-02 23:18:25 +0200683 _PyTime_monotonic(&now); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000684 deadline = now; \
685 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
686 } \
687 while (1) { \
688 errno = 0; \
689
690#define END_SELECT_LOOP(s) \
691 if (!has_timeout || \
692 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
693 break; \
Victor Stinnerae586492014-09-02 23:18:25 +0200694 _PyTime_monotonic(&now); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000695 interval = _PyTime_INTERVAL(now, deadline); \
696 } \
697 } \
698
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000699/* Initialize a new socket object. */
700
Tim Petersa12b4cf2002-07-18 22:38:44 +0000701static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000702
Martin v. Löwis1a214512008-06-11 05:26:20 +0000703static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000704init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 s->sock_fd = fd;
708 s->sock_family = family;
709 s->sock_type = type;
710 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000713#ifdef SOCK_NONBLOCK
714 if (type & SOCK_NONBLOCK)
715 s->sock_timeout = 0.0;
716 else
717#endif
718 {
719 s->sock_timeout = defaulttimeout;
720 if (defaulttimeout >= 0.0)
721 internal_setblocking(s, 0);
722 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000723
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000724}
725
726
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727/* Create a new socket object.
728 This just creates the object and initializes it.
729 If the creation fails, return NULL and set an exception (implicit
730 in NEWOBJ()). */
731
Guido van Rossum73624e91994-10-10 17:59:00 +0000732static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000733new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 PySocketSockObject *s;
736 s = (PySocketSockObject *)
737 PyType_GenericNew(&sock_type, NULL, NULL);
738 if (s != NULL)
739 init_sockobject(s, fd, family, type, proto);
740 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000741}
742
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743
Guido van Rossum48a680c2001-03-02 06:34:14 +0000744/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000745 thread to be in gethostbyname or getaddrinfo */
746#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200747static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000748#endif
749
750
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751/* Convert a string specifying a host name or one of a few symbolic
752 names to a numeric IP address. This usually calls gethostbyname()
753 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000754 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755 an error occurred; then an exception is raised. */
756
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000757static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000758setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 struct addrinfo hints, *res;
761 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
764 if (name[0] == '\0') {
765 int siz;
766 memset(&hints, 0, sizeof(hints));
767 hints.ai_family = af;
768 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
769 hints.ai_flags = AI_PASSIVE;
770 Py_BEGIN_ALLOW_THREADS
771 ACQUIRE_GETADDRINFO_LOCK
772 error = getaddrinfo(NULL, "0", &hints, &res);
773 Py_END_ALLOW_THREADS
774 /* We assume that those thread-unsafe getaddrinfo() versions
775 *are* safe regarding their return value, ie. that a
776 subsequent call to getaddrinfo() does not destroy the
777 outcome of the first call. */
778 RELEASE_GETADDRINFO_LOCK
779 if (error) {
780 set_gaierror(error);
781 return -1;
782 }
783 switch (res->ai_family) {
784 case AF_INET:
785 siz = 4;
786 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000787#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 case AF_INET6:
789 siz = 16;
790 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 default:
793 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200794 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 "unsupported address family");
796 return -1;
797 }
798 if (res->ai_next) {
799 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200800 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 "wildcard resolved to multiple address");
802 return -1;
803 }
804 if (res->ai_addrlen < addr_ret_size)
805 addr_ret_size = res->ai_addrlen;
806 memcpy(addr_ret, res->ai_addr, addr_ret_size);
807 freeaddrinfo(res);
808 return siz;
809 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200810 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100811 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200812 if (strcmp(name, "255.255.255.255") == 0 ||
813 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 struct sockaddr_in *sin;
815 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200816 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 "address family mismatched");
818 return -1;
819 }
820 sin = (struct sockaddr_in *)addr_ret;
821 memset((void *) sin, '\0', sizeof(*sin));
822 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000823#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 sin->sin_addr.s_addr = INADDR_BROADCAST;
827 return sizeof(sin->sin_addr);
828 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200829
830 /* avoid a name resolution in case of numeric address */
831#ifdef HAVE_INET_PTON
832 /* check for an IPv4 address */
833 if (af == AF_UNSPEC || af == AF_INET) {
834 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
835 memset(sin, 0, sizeof(*sin));
836 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
837 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000838#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200839 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000840#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200841 return 4;
842 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200844#ifdef ENABLE_IPV6
845 /* check for an IPv6 address - if the address contains a scope ID, we
846 * fallback to getaddrinfo(), which can handle translation from interface
847 * name to interface index */
848 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
849 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
850 memset(sin, 0, sizeof(*sin));
851 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
852 sin->sin6_family = AF_INET6;
853#ifdef HAVE_SOCKADDR_SA_LEN
854 sin->sin6_len = sizeof(*sin);
855#endif
856 return 16;
857 }
858 }
859#endif /* ENABLE_IPV6 */
860#else /* HAVE_INET_PTON */
861 /* check for an IPv4 address */
862 if (af == AF_INET || af == AF_UNSPEC) {
863 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
864 memset(sin, 0, sizeof(*sin));
865 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
866 sin->sin_family = AF_INET;
867#ifdef HAVE_SOCKADDR_SA_LEN
868 sin->sin_len = sizeof(*sin);
869#endif
870 return 4;
871 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100872 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200873#endif /* HAVE_INET_PTON */
874
875 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 memset(&hints, 0, sizeof(hints));
877 hints.ai_family = af;
878 Py_BEGIN_ALLOW_THREADS
879 ACQUIRE_GETADDRINFO_LOCK
880 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000881#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 if (error == EAI_NONAME && af == AF_UNSPEC) {
883 /* On Tru64 V5.1, numeric-to-addr conversion fails
884 if no address family is given. Assume IPv4 for now.*/
885 hints.ai_family = AF_INET;
886 error = getaddrinfo(name, NULL, &hints, &res);
887 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 Py_END_ALLOW_THREADS
890 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
891 if (error) {
892 set_gaierror(error);
893 return -1;
894 }
895 if (res->ai_addrlen < addr_ret_size)
896 addr_ret_size = res->ai_addrlen;
897 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
898 freeaddrinfo(res);
899 switch (addr_ret->sa_family) {
900 case AF_INET:
901 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000902#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 case AF_INET6:
904 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200907 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 return -1;
909 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000910}
911
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913/* Create a string object representing an IP address.
914 This is always a string of the form 'dd.dd.dd.dd' (with variable
915 size numbers). */
916
Guido van Rossum73624e91994-10-10 17:59:00 +0000917static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000918makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 char buf[NI_MAXHOST];
921 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
924 NI_NUMERICHOST);
925 if (error) {
926 set_gaierror(error);
927 return NULL;
928 }
929 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930}
931
932
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000933#ifdef USE_BLUETOOTH
934/* Convert a string representation of a Bluetooth address into a numeric
935 address. Returns the length (6), or raises an exception and returns -1 if
936 an error occurred. */
937
938static int
939setbdaddr(char *name, bdaddr_t *bdaddr)
940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 unsigned int b0, b1, b2, b3, b4, b5;
942 char ch;
943 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
946 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
947 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
948 bdaddr->b[0] = b0;
949 bdaddr->b[1] = b1;
950 bdaddr->b[2] = b2;
951 bdaddr->b[3] = b3;
952 bdaddr->b[4] = b4;
953 bdaddr->b[5] = b5;
954 return 6;
955 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200956 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 return -1;
958 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000959}
960
961/* Create a string representation of the Bluetooth address. This is always a
962 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
963 value (zero padded if necessary). */
964
965static PyObject *
966makebdaddr(bdaddr_t *bdaddr)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
971 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
972 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
973 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000974}
975#endif
976
977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978/* Create an object representing the given socket address,
979 suitable for passing it back to bind(), connect() etc.
980 The family field of the sockaddr structure is inspected
981 to determine what kind of address it really is. */
982
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000985makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 if (addrlen == 0) {
988 /* No address -- may be recvfrom() from known socket */
989 Py_INCREF(Py_None);
990 return Py_None;
991 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 case AF_INET:
996 {
997 struct sockaddr_in *a;
998 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
999 PyObject *ret = NULL;
1000 if (addrobj) {
1001 a = (struct sockaddr_in *)addr;
1002 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1003 Py_DECREF(addrobj);
1004 }
1005 return ret;
1006 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001008#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 case AF_UNIX:
1010 {
1011 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1014 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001015 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 }
1017 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001018#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 {
1020 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001021 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 }
1023 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001024#endif /* AF_UNIX */
1025
Martin v. Löwis11017b12006-01-14 18:12:57 +00001026#if defined(AF_NETLINK)
1027 case AF_NETLINK:
1028 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1030 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001031 }
1032#endif /* AF_NETLINK */
1033
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001034#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case AF_INET6:
1036 {
1037 struct sockaddr_in6 *a;
1038 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1039 PyObject *ret = NULL;
1040 if (addrobj) {
1041 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001042 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 addrobj,
1044 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001045 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 a->sin6_scope_id);
1047 Py_DECREF(addrobj);
1048 }
1049 return ret;
1050 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001051#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001052
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001053#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 case AF_BLUETOOTH:
1055 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case BTPROTO_L2CAP:
1058 {
1059 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1060 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1061 PyObject *ret = NULL;
1062 if (addrobj) {
1063 ret = Py_BuildValue("Oi",
1064 addrobj,
1065 _BT_L2_MEMB(a, psm));
1066 Py_DECREF(addrobj);
1067 }
1068 return ret;
1069 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case BTPROTO_RFCOMM:
1072 {
1073 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1074 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1075 PyObject *ret = NULL;
1076 if (addrobj) {
1077 ret = Py_BuildValue("Oi",
1078 addrobj,
1079 _BT_RC_MEMB(a, channel));
1080 Py_DECREF(addrobj);
1081 }
1082 return ret;
1083 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 case BTPROTO_HCI:
1086 {
1087 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001088#if defined(__NetBSD__) || defined(__DragonFly__)
1089 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1090#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 PyObject *ret = NULL;
1092 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1093 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001096
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case BTPROTO_SCO:
1099 {
1100 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1101 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1102 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103#endif
1104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 default:
1106 PyErr_SetString(PyExc_ValueError,
1107 "Unknown Bluetooth protocol");
1108 return NULL;
1109 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001110#endif
1111
Antoine Pitroub156a462010-10-27 20:13:57 +00001112#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 case AF_PACKET:
1114 {
1115 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1116 char *ifname = "";
1117 struct ifreq ifr;
1118 /* need to look up interface name give index */
1119 if (a->sll_ifindex) {
1120 ifr.ifr_ifindex = a->sll_ifindex;
1121 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1122 ifname = ifr.ifr_name;
1123 }
1124 return Py_BuildValue("shbhy#",
1125 ifname,
1126 ntohs(a->sll_protocol),
1127 a->sll_pkttype,
1128 a->sll_hatype,
1129 a->sll_addr,
1130 a->sll_halen);
1131 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001132#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001133
Christian Heimes043d6f62008-01-07 17:19:16 +00001134#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 case AF_TIPC:
1136 {
1137 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1138 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1139 return Py_BuildValue("IIIII",
1140 a->addrtype,
1141 a->addr.nameseq.type,
1142 a->addr.nameseq.lower,
1143 a->addr.nameseq.upper,
1144 a->scope);
1145 } else if (a->addrtype == TIPC_ADDR_NAME) {
1146 return Py_BuildValue("IIIII",
1147 a->addrtype,
1148 a->addr.name.name.type,
1149 a->addr.name.name.instance,
1150 a->addr.name.name.instance,
1151 a->scope);
1152 } else if (a->addrtype == TIPC_ADDR_ID) {
1153 return Py_BuildValue("IIIII",
1154 a->addrtype,
1155 a->addr.id.node,
1156 a->addr.id.ref,
1157 0,
1158 a->scope);
1159 } else {
1160 PyErr_SetString(PyExc_ValueError,
1161 "Invalid address type");
1162 return NULL;
1163 }
1164 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001165#endif
1166
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001167#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001168 case AF_CAN:
1169 {
1170 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1171 char *ifname = "";
1172 struct ifreq ifr;
1173 /* need to look up interface name given index */
1174 if (a->can_ifindex) {
1175 ifr.ifr_ifindex = a->can_ifindex;
1176 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1177 ifname = ifr.ifr_name;
1178 }
1179
1180 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1181 ifname,
1182 a->can_family);
1183 }
1184#endif
1185
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001186#ifdef PF_SYSTEM
1187 case PF_SYSTEM:
1188 switch(proto) {
1189#ifdef SYSPROTO_CONTROL
1190 case SYSPROTO_CONTROL:
1191 {
1192 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1193 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1194 }
1195#endif
1196 default:
1197 PyErr_SetString(PyExc_ValueError,
1198 "Invalid address type");
1199 return 0;
1200 }
1201#endif
1202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 default:
1206 /* If we don't know the address family, don't raise an
1207 exception -- return it as an (int, bytes) tuple. */
1208 return Py_BuildValue("iy#",
1209 addr->sa_family,
1210 addr->sa_data,
1211 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214}
1215
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001216/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1217 (in particular, numeric IP addresses). */
1218struct maybe_idna {
1219 PyObject *obj;
1220 char *buf;
1221};
1222
1223static void
1224idna_cleanup(struct maybe_idna *data)
1225{
1226 Py_CLEAR(data->obj);
1227}
1228
1229static int
1230idna_converter(PyObject *obj, struct maybe_idna *data)
1231{
1232 size_t len;
1233 PyObject *obj2, *obj3;
1234 if (obj == NULL) {
1235 idna_cleanup(data);
1236 return 1;
1237 }
1238 data->obj = NULL;
1239 len = -1;
1240 if (PyBytes_Check(obj)) {
1241 data->buf = PyBytes_AsString(obj);
1242 len = PyBytes_Size(obj);
1243 }
1244 else if (PyByteArray_Check(obj)) {
1245 data->buf = PyByteArray_AsString(obj);
1246 len = PyByteArray_Size(obj);
1247 }
1248 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1249 data->buf = PyUnicode_DATA(obj);
1250 len = PyUnicode_GET_LENGTH(obj);
1251 }
1252 else {
1253 obj2 = PyUnicode_FromObject(obj);
1254 if (!obj2) {
1255 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1256 obj->ob_type->tp_name);
1257 return 0;
1258 }
1259 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1260 Py_DECREF(obj2);
1261 if (!obj3) {
1262 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1263 return 0;
1264 }
1265 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001266 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001267 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1268 return 0;
1269 }
1270 data->obj = obj3;
1271 data->buf = PyBytes_AS_STRING(obj3);
1272 len = PyBytes_GET_SIZE(obj3);
1273 }
1274 if (strlen(data->buf) != len) {
1275 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001276 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001277 return 0;
1278 }
1279 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001280}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001281
1282/* Parse a socket address argument according to the socket object's
1283 address family. Return 1 if the address was in the proper format,
1284 0 of not. The address is returned through addr_ret, its length
1285 through len_ret. */
1286
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001288getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001292
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001293#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case AF_UNIX:
1295 {
1296 struct sockaddr_un* addr;
1297 char *path;
1298 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001299 int retval = 0;
1300
1301 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1302 allow embedded nulls on Linux. */
1303 if (PyUnicode_Check(args)) {
1304 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1305 return 0;
1306 }
1307 else
1308 Py_INCREF(args);
1309 if (!PyArg_Parse(args, "y#", &path, &len))
1310 goto unix_out;
Victor Stinner1a62a682014-08-17 19:33:28 +02001311 assert(len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001314#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 if (len > 0 && path[0] == 0) {
1316 /* Linux abstract namespace extension */
Victor Stinner1a62a682014-08-17 19:33:28 +02001317 if ((size_t)len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001318 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001320 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 }
1322 }
1323 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 {
1326 /* regular NULL-terminated string */
Victor Stinner1a62a682014-08-17 19:33:28 +02001327 if ((size_t)len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001328 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001330 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 }
1332 addr->sun_path[len] = 0;
1333 }
1334 addr->sun_family = s->sock_family;
1335 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001337 retval = 1;
1338 unix_out:
1339 Py_DECREF(args);
1340 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001342#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343
Martin v. Löwis11017b12006-01-14 18:12:57 +00001344#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 case AF_NETLINK:
1346 {
1347 struct sockaddr_nl* addr;
1348 int pid, groups;
1349 addr = (struct sockaddr_nl *)addr_ret;
1350 if (!PyTuple_Check(args)) {
1351 PyErr_Format(
1352 PyExc_TypeError,
1353 "getsockaddrarg: "
1354 "AF_NETLINK address must be tuple, not %.500s",
1355 Py_TYPE(args)->tp_name);
1356 return 0;
1357 }
1358 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1359 return 0;
1360 addr->nl_family = AF_NETLINK;
1361 addr->nl_pid = pid;
1362 addr->nl_groups = groups;
1363 *len_ret = sizeof(*addr);
1364 return 1;
1365 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001366#endif
1367
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001368#ifdef AF_RDS
1369 case AF_RDS:
1370 /* RDS sockets use sockaddr_in: fall-through */
1371#endif
1372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 case AF_INET:
1374 {
1375 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001376 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 int port, result;
1378 if (!PyTuple_Check(args)) {
1379 PyErr_Format(
1380 PyExc_TypeError,
1381 "getsockaddrarg: "
1382 "AF_INET address must be tuple, not %.500s",
1383 Py_TYPE(args)->tp_name);
1384 return 0;
1385 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001386 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1387 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 return 0;
1389 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001390 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001392 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 if (result < 0)
1394 return 0;
1395 if (port < 0 || port > 0xffff) {
1396 PyErr_SetString(
1397 PyExc_OverflowError,
1398 "getsockaddrarg: port must be 0-65535.");
1399 return 0;
1400 }
1401 addr->sin_family = AF_INET;
1402 addr->sin_port = htons((short)port);
1403 *len_ret = sizeof *addr;
1404 return 1;
1405 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001407#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 case AF_INET6:
1409 {
1410 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001411 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001412 int port, result;
1413 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 flowinfo = scope_id = 0;
1415 if (!PyTuple_Check(args)) {
1416 PyErr_Format(
1417 PyExc_TypeError,
1418 "getsockaddrarg: "
1419 "AF_INET6 address must be tuple, not %.500s",
1420 Py_TYPE(args)->tp_name);
1421 return 0;
1422 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001423 if (!PyArg_ParseTuple(args, "O&i|II",
1424 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 &scope_id)) {
1426 return 0;
1427 }
1428 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001429 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001431 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 if (result < 0)
1433 return 0;
1434 if (port < 0 || port > 0xffff) {
1435 PyErr_SetString(
1436 PyExc_OverflowError,
1437 "getsockaddrarg: port must be 0-65535.");
1438 return 0;
1439 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001440 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001441 PyErr_SetString(
1442 PyExc_OverflowError,
1443 "getsockaddrarg: flowinfo must be 0-1048575.");
1444 return 0;
1445 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 addr->sin6_family = s->sock_family;
1447 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001448 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 addr->sin6_scope_id = scope_id;
1450 *len_ret = sizeof *addr;
1451 return 1;
1452 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001453#endif
1454
Hye-Shik Chang81268602004-02-02 06:05:24 +00001455#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 case AF_BLUETOOTH:
1457 {
1458 switch (s->sock_proto) {
1459 case BTPROTO_L2CAP:
1460 {
1461 struct sockaddr_l2 *addr;
1462 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 addr = (struct sockaddr_l2 *)addr_ret;
1465 memset(addr, 0, sizeof(struct sockaddr_l2));
1466 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1467 if (!PyArg_ParseTuple(args, "si", &straddr,
1468 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001469 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 "wrong format");
1471 return 0;
1472 }
1473 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1474 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 *len_ret = sizeof *addr;
1477 return 1;
1478 }
1479 case BTPROTO_RFCOMM:
1480 {
1481 struct sockaddr_rc *addr;
1482 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 addr = (struct sockaddr_rc *)addr_ret;
1485 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1486 if (!PyArg_ParseTuple(args, "si", &straddr,
1487 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001488 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 "wrong format");
1490 return 0;
1491 }
1492 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1493 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 *len_ret = sizeof *addr;
1496 return 1;
1497 }
1498 case BTPROTO_HCI:
1499 {
1500 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001501#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001502 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001503
Alexander Belopolskye239d232010-12-08 23:31:48 +00001504 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001505 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001506 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001507 "wrong format");
1508 return 0;
1509 }
1510 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1511 return 0;
1512#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1514 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001515 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 "wrong format");
1517 return 0;
1518 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 *len_ret = sizeof *addr;
1521 return 1;
1522 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001523#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 case BTPROTO_SCO:
1525 {
1526 struct sockaddr_sco *addr;
1527 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 addr = (struct sockaddr_sco *)addr_ret;
1530 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1531 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001532 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 "wrong format");
1534 return 0;
1535 }
1536 straddr = PyBytes_AS_STRING(args);
1537 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1538 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 *len_ret = sizeof *addr;
1541 return 1;
1542 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001545 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 return 0;
1547 }
1548 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001549#endif
1550
Antoine Pitroub156a462010-10-27 20:13:57 +00001551#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 case AF_PACKET:
1553 {
1554 struct sockaddr_ll* addr;
1555 struct ifreq ifr;
1556 char *interfaceName;
1557 int protoNumber;
1558 int hatype = 0;
1559 int pkttype = 0;
1560 char *haddr = NULL;
1561 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (!PyTuple_Check(args)) {
1564 PyErr_Format(
1565 PyExc_TypeError,
1566 "getsockaddrarg: "
1567 "AF_PACKET address must be tuple, not %.500s",
1568 Py_TYPE(args)->tp_name);
1569 return 0;
1570 }
1571 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1572 &protoNumber, &pkttype, &hatype,
1573 &haddr, &halen))
1574 return 0;
1575 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1576 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1577 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1578 s->errorhandler();
1579 return 0;
1580 }
1581 if (halen > 8) {
1582 PyErr_SetString(PyExc_ValueError,
1583 "Hardware address must be 8 bytes or less");
1584 return 0;
1585 }
1586 if (protoNumber < 0 || protoNumber > 0xffff) {
1587 PyErr_SetString(
1588 PyExc_OverflowError,
1589 "getsockaddrarg: protoNumber must be 0-65535.");
1590 return 0;
1591 }
1592 addr = (struct sockaddr_ll*)addr_ret;
1593 addr->sll_family = AF_PACKET;
1594 addr->sll_protocol = htons((short)protoNumber);
1595 addr->sll_ifindex = ifr.ifr_ifindex;
1596 addr->sll_pkttype = pkttype;
1597 addr->sll_hatype = hatype;
1598 if (halen != 0) {
1599 memcpy(&addr->sll_addr, haddr, halen);
1600 }
1601 addr->sll_halen = halen;
1602 *len_ret = sizeof *addr;
1603 return 1;
1604 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001605#endif
1606
Christian Heimes043d6f62008-01-07 17:19:16 +00001607#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 case AF_TIPC:
1609 {
1610 unsigned int atype, v1, v2, v3;
1611 unsigned int scope = TIPC_CLUSTER_SCOPE;
1612 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 if (!PyTuple_Check(args)) {
1615 PyErr_Format(
1616 PyExc_TypeError,
1617 "getsockaddrarg: "
1618 "AF_TIPC address must be tuple, not %.500s",
1619 Py_TYPE(args)->tp_name);
1620 return 0;
1621 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 if (!PyArg_ParseTuple(args,
1624 "IIII|I;Invalid TIPC address format",
1625 &atype, &v1, &v2, &v3, &scope))
1626 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 addr = (struct sockaddr_tipc *) addr_ret;
1629 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 addr->family = AF_TIPC;
1632 addr->scope = scope;
1633 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 if (atype == TIPC_ADDR_NAMESEQ) {
1636 addr->addr.nameseq.type = v1;
1637 addr->addr.nameseq.lower = v2;
1638 addr->addr.nameseq.upper = v3;
1639 } else if (atype == TIPC_ADDR_NAME) {
1640 addr->addr.name.name.type = v1;
1641 addr->addr.name.name.instance = v2;
1642 } else if (atype == TIPC_ADDR_ID) {
1643 addr->addr.id.node = v1;
1644 addr->addr.id.ref = v2;
1645 } else {
1646 /* Shouldn't happen */
1647 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1648 return 0;
1649 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 return 1;
1654 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001655#endif
1656
Vinay Sajiped6783f2014-03-21 11:44:32 +00001657#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001658 case AF_CAN:
1659 switch (s->sock_proto) {
1660 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001661 /* fall-through */
1662 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001663 {
1664 struct sockaddr_can *addr;
1665 PyObject *interfaceName;
1666 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001667 Py_ssize_t len;
1668
Benjamin Peterson18b71912013-05-16 15:29:44 -05001669 addr = (struct sockaddr_can *)addr_ret;
1670
Charles-François Natali47413c12011-10-06 19:47:44 +02001671 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1672 &interfaceName))
1673 return 0;
1674
1675 len = PyBytes_GET_SIZE(interfaceName);
1676
1677 if (len == 0) {
1678 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001679 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001680 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1681 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001682 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1683 s->errorhandler();
1684 Py_DECREF(interfaceName);
1685 return 0;
1686 }
1687 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001688 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001689 "AF_CAN interface name too long");
1690 Py_DECREF(interfaceName);
1691 return 0;
1692 }
1693
1694 addr->can_family = AF_CAN;
1695 addr->can_ifindex = ifr.ifr_ifindex;
1696
1697 *len_ret = sizeof(*addr);
1698 Py_DECREF(interfaceName);
1699 return 1;
1700 }
1701 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001702 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001703 "getsockaddrarg: unsupported CAN protocol");
1704 return 0;
1705 }
1706#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001707
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001708#ifdef PF_SYSTEM
1709 case PF_SYSTEM:
1710 switch (s->sock_proto) {
1711#ifdef SYSPROTO_CONTROL
1712 case SYSPROTO_CONTROL:
1713 {
1714 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001715
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001716 addr = (struct sockaddr_ctl *)addr_ret;
1717 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001718 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001719
1720 if (PyUnicode_Check(args)) {
1721 struct ctl_info info;
1722 PyObject *ctl_name;
1723
1724 if (!PyArg_Parse(args, "O&",
1725 PyUnicode_FSConverter, &ctl_name)) {
1726 return 0;
1727 }
1728
1729 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1730 PyErr_SetString(PyExc_ValueError,
1731 "provided string is too long");
1732 Py_DECREF(ctl_name);
1733 return 0;
1734 }
1735 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1736 sizeof(info.ctl_name));
1737 Py_DECREF(ctl_name);
1738
1739 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1740 PyErr_SetString(PyExc_OSError,
1741 "cannot find kernel control with provided name");
1742 return 0;
1743 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001744
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001745 addr->sc_id = info.ctl_id;
1746 addr->sc_unit = 0;
1747 } else if (!PyArg_ParseTuple(args, "II",
1748 &(addr->sc_id), &(addr->sc_unit))) {
1749 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1750 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001751
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001752 return 0;
1753 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001754
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001755 *len_ret = sizeof(*addr);
1756 return 1;
1757 }
1758#endif
1759 default:
1760 PyErr_SetString(PyExc_OSError,
1761 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1762 return 0;
1763 }
1764#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001769 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001773}
1774
Guido van Rossum30a685f1991-06-27 15:51:29 +00001775
Guido van Rossum48a680c2001-03-02 06:34:14 +00001776/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001777 Return 1 if the family is known, 0 otherwise. The length is returned
1778 through len_ret. */
1779
1780static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001781getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001782{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001784
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001785#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 case AF_UNIX:
1787 {
1788 *len_ret = sizeof (struct sockaddr_un);
1789 return 1;
1790 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001791#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001792#if defined(AF_NETLINK)
1793 case AF_NETLINK:
1794 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 *len_ret = sizeof (struct sockaddr_nl);
1796 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001797 }
1798#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001799
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001800#ifdef AF_RDS
1801 case AF_RDS:
1802 /* RDS sockets use sockaddr_in: fall-through */
1803#endif
1804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 case AF_INET:
1806 {
1807 *len_ret = sizeof (struct sockaddr_in);
1808 return 1;
1809 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001810
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001811#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 case AF_INET6:
1813 {
1814 *len_ret = sizeof (struct sockaddr_in6);
1815 return 1;
1816 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001817#endif
1818
Hye-Shik Chang81268602004-02-02 06:05:24 +00001819#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 case AF_BLUETOOTH:
1821 {
1822 switch(s->sock_proto)
1823 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 case BTPROTO_L2CAP:
1826 *len_ret = sizeof (struct sockaddr_l2);
1827 return 1;
1828 case BTPROTO_RFCOMM:
1829 *len_ret = sizeof (struct sockaddr_rc);
1830 return 1;
1831 case BTPROTO_HCI:
1832 *len_ret = sizeof (struct sockaddr_hci);
1833 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001834#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 case BTPROTO_SCO:
1836 *len_ret = sizeof (struct sockaddr_sco);
1837 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001840 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 "unknown BT protocol");
1842 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 }
1845 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001846#endif
1847
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001848#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 case AF_PACKET:
1850 {
1851 *len_ret = sizeof (struct sockaddr_ll);
1852 return 1;
1853 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001854#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001855
Christian Heimes043d6f62008-01-07 17:19:16 +00001856#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 case AF_TIPC:
1858 {
1859 *len_ret = sizeof (struct sockaddr_tipc);
1860 return 1;
1861 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001862#endif
1863
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001864#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001865 case AF_CAN:
1866 {
1867 *len_ret = sizeof (struct sockaddr_can);
1868 return 1;
1869 }
1870#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001871
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001872#ifdef PF_SYSTEM
1873 case PF_SYSTEM:
1874 switch(s->sock_proto) {
1875#ifdef SYSPROTO_CONTROL
1876 case SYSPROTO_CONTROL:
1877 *len_ret = sizeof (struct sockaddr_ctl);
1878 return 1;
1879#endif
1880 default:
1881 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1882 "unknown PF_SYSTEM protocol");
1883 return 0;
1884 }
1885#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001890 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001894}
1895
1896
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001897/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1898 Currently, these methods are only compiled if the RFC 2292/3542
1899 CMSG_LEN() macro is available. Older systems seem to have used
1900 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1901 it may be possible to define CMSG_LEN() that way if it's not
1902 provided. Some architectures might need extra padding after the
1903 cmsghdr, however, and CMSG_LEN() would have to take account of
1904 this. */
1905#ifdef CMSG_LEN
1906/* If length is in range, set *result to CMSG_LEN(length) and return
1907 true; otherwise, return false. */
1908static int
1909get_CMSG_LEN(size_t length, size_t *result)
1910{
1911 size_t tmp;
1912
1913 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1914 return 0;
1915 tmp = CMSG_LEN(length);
1916 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1917 return 0;
1918 *result = tmp;
1919 return 1;
1920}
1921
1922#ifdef CMSG_SPACE
1923/* If length is in range, set *result to CMSG_SPACE(length) and return
1924 true; otherwise, return false. */
1925static int
1926get_CMSG_SPACE(size_t length, size_t *result)
1927{
1928 size_t tmp;
1929
1930 /* Use CMSG_SPACE(1) here in order to take account of the padding
1931 necessary before *and* after the data. */
1932 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1933 return 0;
1934 tmp = CMSG_SPACE(length);
1935 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1936 return 0;
1937 *result = tmp;
1938 return 1;
1939}
1940#endif
1941
1942/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1943 pointer in msg->msg_control with at least "space" bytes after it,
1944 and its cmsg_len member inside the buffer. */
1945static int
1946cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1947{
1948 size_t cmsg_offset;
1949 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1950 sizeof(cmsgh->cmsg_len));
1951
Charles-François Natali466517d2011-08-28 18:23:43 +02001952 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001953 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001954 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001955 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1956 annoying under OS X as it's unsigned there and so it triggers a
1957 tautological comparison warning under Clang when compared against 0.
1958 Since the check is valid on other platforms, silence the warning under
1959 Clang. */
1960 #ifdef __clang__
1961 #pragma clang diagnostic push
1962 #pragma clang diagnostic ignored "-Wtautological-compare"
1963 #endif
1964 if (msg->msg_controllen < 0)
1965 return 0;
1966 #ifdef __clang__
1967 #pragma clang diagnostic pop
1968 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001969 if (space < cmsg_len_end)
1970 space = cmsg_len_end;
1971 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1972 return (cmsg_offset <= (size_t)-1 - space &&
1973 cmsg_offset + space <= msg->msg_controllen);
1974}
1975
1976/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1977 *space to number of bytes following it in the buffer and return
1978 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1979 msg->msg_controllen are valid. */
1980static int
1981get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1982{
1983 size_t data_offset;
1984 char *data_ptr;
1985
1986 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1987 return 0;
1988 data_offset = data_ptr - (char *)msg->msg_control;
1989 if (data_offset > msg->msg_controllen)
1990 return 0;
1991 *space = msg->msg_controllen - data_offset;
1992 return 1;
1993}
1994
1995/* If cmsgh is invalid or not contained in the buffer pointed to by
1996 msg->msg_control, return -1. If cmsgh is valid and its associated
1997 data is entirely contained in the buffer, set *data_len to the
1998 length of the associated data and return 0. If only part of the
1999 associated data is contained in the buffer but cmsgh is otherwise
2000 valid, set *data_len to the length contained in the buffer and
2001 return 1. */
2002static int
2003get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2004{
2005 size_t space, cmsg_data_len;
2006
2007 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2008 cmsgh->cmsg_len < CMSG_LEN(0))
2009 return -1;
2010 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2011 if (!get_cmsg_data_space(msg, cmsgh, &space))
2012 return -1;
2013 if (space >= cmsg_data_len) {
2014 *data_len = cmsg_data_len;
2015 return 0;
2016 }
2017 *data_len = space;
2018 return 1;
2019}
2020#endif /* CMSG_LEN */
2021
2022
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002023/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002024
Guido van Rossum73624e91994-10-10 17:59:00 +00002025static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002026sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 sock_addr_t addrbuf;
2029 SOCKET_T newfd = INVALID_SOCKET;
2030 socklen_t addrlen;
2031 PyObject *sock = NULL;
2032 PyObject *addr = NULL;
2033 PyObject *res = NULL;
2034 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002035#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2036 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2037 static int accept4_works = -1;
2038#endif
2039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 if (!getsockaddrlen(s, &addrlen))
2041 return NULL;
2042 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 if (!IS_SELECTABLE(s))
2045 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002046
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002047 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002050 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002051 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002052#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2053 if (accept4_works != 0) {
2054 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2055 SOCK_CLOEXEC);
2056 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2057 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2058 accept4_works = (errno != ENOSYS);
2059 }
2060 }
2061 if (accept4_works == 0)
2062 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2063#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002065#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002066 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 if (timeout == 1) {
2070 PyErr_SetString(socket_timeout, "timed out");
2071 return NULL;
2072 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002073 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (newfd == INVALID_SOCKET)
2076 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002077
Victor Stinnerdaf45552013-08-28 00:53:59 +02002078#ifdef MS_WINDOWS
2079 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2080 PyErr_SetFromWindowsErr(0);
2081 SOCKETCLOSE(newfd);
2082 goto finally;
2083 }
2084#else
2085
2086#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2087 if (!accept4_works)
2088#endif
2089 {
2090 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2091 SOCKETCLOSE(newfd);
2092 goto finally;
2093 }
2094 }
2095#endif
2096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 sock = PyLong_FromSocket_t(newfd);
2098 if (sock == NULL) {
2099 SOCKETCLOSE(newfd);
2100 goto finally;
2101 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2104 addrlen, s->sock_proto);
2105 if (addr == NULL)
2106 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002109
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 Py_XDECREF(sock);
2112 Py_XDECREF(addr);
2113 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002114}
2115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002116PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002117"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002118\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002119Wait for an incoming connection. Return a new socket file descriptor\n\
2120representing the connection, and the address of the client.\n\
2121For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002122
Guido van Rossum11ba0942002-06-13 15:07:44 +00002123/* s.setblocking(flag) method. Argument:
2124 False -- non-blocking mode; same as settimeout(0)
2125 True -- blocking mode; same as settimeout(None)
2126*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002127
Guido van Rossum73624e91994-10-10 17:59:00 +00002128static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002129sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002130{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002131 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 block = PyLong_AsLong(arg);
2134 if (block == -1 && PyErr_Occurred())
2135 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 s->sock_timeout = block ? -1.0 : 0.0;
2138 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 Py_INCREF(Py_None);
2141 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002142}
Guido van Rossume4485b01994-09-07 14:32:49 +00002143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002144PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145"setblocking(flag)\n\
2146\n\
2147Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002148setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002149setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002150
Guido van Rossum11ba0942002-06-13 15:07:44 +00002151/* s.settimeout(timeout) method. Argument:
2152 None -- no timeout, blocking mode; same as setblocking(True)
2153 0.0 -- non-blocking mode; same as setblocking(False)
2154 > 0 -- timeout mode; operations time out after timeout seconds
2155 < 0 -- illegal; raises an exception
2156*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002158sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 if (arg == Py_None)
2163 timeout = -1.0;
2164 else {
2165 timeout = PyFloat_AsDouble(arg);
2166 if (timeout < 0.0) {
2167 if (!PyErr_Occurred())
2168 PyErr_SetString(PyExc_ValueError,
2169 "Timeout value out of range");
2170 return NULL;
2171 }
2172 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 s->sock_timeout = timeout;
2175 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 Py_INCREF(Py_None);
2178 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002179}
2180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002182"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002183\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002184Set a timeout on socket operations. 'timeout' can be a float,\n\
2185giving in seconds, or None. Setting a timeout of None disables\n\
2186the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002188
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002189/* s.gettimeout() method.
2190 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002191static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002192sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (s->sock_timeout < 0.0) {
2195 Py_INCREF(Py_None);
2196 return Py_None;
2197 }
2198 else
2199 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002200}
2201
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002202PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002203"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002204\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002205Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002206operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002207operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002208
Guido van Rossumaee08791992-09-08 09:05:33 +00002209/* s.setsockopt() method.
2210 With an integer third argument, sets an integer option.
2211 With a string third argument, sets an option from a buffer;
2212 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002213
Guido van Rossum73624e91994-10-10 17:59:00 +00002214static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002215sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 int level;
2218 int optname;
2219 int res;
2220 char *buf;
2221 int buflen;
2222 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 if (PyArg_ParseTuple(args, "iii:setsockopt",
2225 &level, &optname, &flag)) {
2226 buf = (char *) &flag;
2227 buflen = sizeof flag;
2228 }
2229 else {
2230 PyErr_Clear();
2231 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2232 &level, &optname, &buf, &buflen))
2233 return NULL;
2234 }
2235 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2236 if (res < 0)
2237 return s->errorhandler();
2238 Py_INCREF(Py_None);
2239 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002240}
2241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002242PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002243"setsockopt(level, option, value)\n\
2244\n\
2245Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002248
Guido van Rossumaee08791992-09-08 09:05:33 +00002249/* s.getsockopt() method.
2250 With two arguments, retrieves an integer option.
2251 With a third integer argument, retrieves a string buffer of that size;
2252 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002253
Guido van Rossum73624e91994-10-10 17:59:00 +00002254static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002255sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 int level;
2258 int optname;
2259 int res;
2260 PyObject *buf;
2261 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2264 &level, &optname, &buflen))
2265 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 if (buflen == 0) {
2268 int flag = 0;
2269 socklen_t flagsize = sizeof flag;
2270 res = getsockopt(s->sock_fd, level, optname,
2271 (void *)&flag, &flagsize);
2272 if (res < 0)
2273 return s->errorhandler();
2274 return PyLong_FromLong(flag);
2275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002277 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 "getsockopt buflen out of range");
2279 return NULL;
2280 }
2281 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2282 if (buf == NULL)
2283 return NULL;
2284 res = getsockopt(s->sock_fd, level, optname,
2285 (void *)PyBytes_AS_STRING(buf), &buflen);
2286 if (res < 0) {
2287 Py_DECREF(buf);
2288 return s->errorhandler();
2289 }
2290 _PyBytes_Resize(&buf, buflen);
2291 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002292}
2293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002294PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002295"getsockopt(level, option[, buffersize]) -> value\n\
2296\n\
2297Get a socket option. See the Unix manual for level and option.\n\
2298If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002299string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002300
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002301
Fred Drake728819a2000-07-01 03:40:12 +00002302/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002303
Guido van Rossum73624e91994-10-10 17:59:00 +00002304static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002305sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 sock_addr_t addrbuf;
2308 int addrlen;
2309 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2312 return NULL;
2313 Py_BEGIN_ALLOW_THREADS
2314 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2315 Py_END_ALLOW_THREADS
2316 if (res < 0)
2317 return s->errorhandler();
2318 Py_INCREF(Py_None);
2319 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002320}
2321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002322PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002323"bind(address)\n\
2324\n\
2325Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002326pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002327sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328
Guido van Rossum30a685f1991-06-27 15:51:29 +00002329
2330/* s.close() method.
2331 Set the file descriptor to -1 so operations tried subsequently
2332 will surely fail. */
2333
Guido van Rossum73624e91994-10-10 17:59:00 +00002334static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002335sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 if ((fd = s->sock_fd) != -1) {
2340 s->sock_fd = -1;
2341 Py_BEGIN_ALLOW_THREADS
2342 (void) SOCKETCLOSE(fd);
2343 Py_END_ALLOW_THREADS
2344 }
2345 Py_INCREF(Py_None);
2346 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002347}
2348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002349PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002350"close()\n\
2351\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002352Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002353
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002354static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002355sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002356{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002357 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002358 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002359 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002360}
2361
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002362PyDoc_STRVAR(detach_doc,
2363"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002364\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002365Close the socket object without closing the underlying file descriptor.\n\
2366The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002367can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002368
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002369static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002370internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 timeout = 0;
2376 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002377
2378#ifdef MS_WINDOWS
2379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 if (s->sock_timeout > 0.0) {
2381 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2382 IS_SELECTABLE(s)) {
2383 /* This is a mess. Best solution: trust select */
2384 fd_set fds;
2385 fd_set fds_exc;
2386 struct timeval tv;
2387 tv.tv_sec = (int)s->sock_timeout;
2388 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2389 FD_ZERO(&fds);
2390 FD_SET(s->sock_fd, &fds);
2391 FD_ZERO(&fds_exc);
2392 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002393 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2394 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (res == 0) {
2396 res = WSAEWOULDBLOCK;
2397 timeout = 1;
2398 } else if (res > 0) {
2399 if (FD_ISSET(s->sock_fd, &fds))
2400 /* The socket is in the writable set - this
2401 means connected */
2402 res = 0;
2403 else {
2404 /* As per MS docs, we need to call getsockopt()
2405 to get the underlying error */
2406 int res_size = sizeof res;
2407 /* It must be in the exception set */
2408 assert(FD_ISSET(s->sock_fd, &fds_exc));
2409 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2410 (char *)&res, &res_size))
2411 /* getsockopt also clears WSAGetLastError,
2412 so reset it back. */
2413 WSASetLastError(res);
2414 else
2415 res = WSAGetLastError();
2416 }
2417 }
2418 /* else if (res < 0) an error occurred */
2419 }
2420 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 if (res < 0)
2423 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002424
2425#else
2426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 if (s->sock_timeout > 0.0) {
2428 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2429 timeout = internal_select(s, 1);
2430 if (timeout == 0) {
2431 /* Bug #1019808: in case of an EINPROGRESS,
2432 use getsockopt(SO_ERROR) to get the real
2433 error. */
2434 socklen_t res_size = sizeof res;
2435 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2436 SO_ERROR, &res, &res_size);
2437 if (res == EISCONN)
2438 res = 0;
2439 errno = res;
2440 }
2441 else if (timeout == -1) {
2442 res = errno; /* had error */
2443 }
2444 else
2445 res = EWOULDBLOCK; /* timed out */
2446 }
2447 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 if (res < 0)
2450 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002451
2452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002456}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002457
Fred Drake728819a2000-07-01 03:40:12 +00002458/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002459
Guido van Rossum73624e91994-10-10 17:59:00 +00002460static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002461sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 sock_addr_t addrbuf;
2464 int addrlen;
2465 int res;
2466 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2469 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 Py_BEGIN_ALLOW_THREADS
2472 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2473 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 if (timeout == 1) {
2476 PyErr_SetString(socket_timeout, "timed out");
2477 return NULL;
2478 }
2479 if (res != 0)
2480 return s->errorhandler();
2481 Py_INCREF(Py_None);
2482 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002483}
2484
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002485PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002486"connect(address)\n\
2487\n\
2488Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490
Guido van Rossum30a685f1991-06-27 15:51:29 +00002491
Fred Drake728819a2000-07-01 03:40:12 +00002492/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002493
2494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 sock_addr_t addrbuf;
2498 int addrlen;
2499 int res;
2500 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2503 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 Py_BEGIN_ALLOW_THREADS
2506 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2507 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 /* Signals are not errors (though they may raise exceptions). Adapted
2510 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002511#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 if (res == EINTR && PyErr_CheckSignals())
2513 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002514#endif
2515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002517}
2518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002520"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002521\n\
2522This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002525
Guido van Rossumed233a51992-06-23 09:07:03 +00002526/* s.fileno() method */
2527
Guido van Rossum73624e91994-10-10 17:59:00 +00002528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002529sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002532}
2533
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002534PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002535"fileno() -> integer\n\
2536\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002537Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002538
Guido van Rossumed233a51992-06-23 09:07:03 +00002539
Guido van Rossumc89705d1992-11-26 08:54:07 +00002540/* s.getsockname() method */
2541
Guido van Rossum73624e91994-10-10 17:59:00 +00002542static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002543sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 sock_addr_t addrbuf;
2546 int res;
2547 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if (!getsockaddrlen(s, &addrlen))
2550 return NULL;
2551 memset(&addrbuf, 0, addrlen);
2552 Py_BEGIN_ALLOW_THREADS
2553 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2554 Py_END_ALLOW_THREADS
2555 if (res < 0)
2556 return s->errorhandler();
2557 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2558 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002559}
2560
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002561PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002562"getsockname() -> address info\n\
2563\n\
2564Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002565info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002566
Guido van Rossumc89705d1992-11-26 08:54:07 +00002567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002569/* s.getpeername() method */
2570
Guido van Rossum73624e91994-10-10 17:59:00 +00002571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002572sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 sock_addr_t addrbuf;
2575 int res;
2576 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 if (!getsockaddrlen(s, &addrlen))
2579 return NULL;
2580 memset(&addrbuf, 0, addrlen);
2581 Py_BEGIN_ALLOW_THREADS
2582 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2583 Py_END_ALLOW_THREADS
2584 if (res < 0)
2585 return s->errorhandler();
2586 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2587 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002588}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002590PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002591"getpeername() -> address info\n\
2592\n\
2593Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002594info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002595
Guido van Rossumb6775db1994-08-01 11:34:53 +00002596#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002597
2598
Guido van Rossum30a685f1991-06-27 15:51:29 +00002599/* s.listen(n) method */
2600
Guido van Rossum73624e91994-10-10 17:59:00 +00002601static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002602sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002603{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002604 /* We try to choose a default backlog high enough to avoid connection drops
2605 * for common workloads, yet not too high to limit resource usage. */
2606 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002608
Charles-François Natali644b8f52014-05-22 19:45:39 +01002609 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002613 /* To avoid problems on systems that don't allow a negative backlog
2614 * (which doesn't make sense anyway) we force a minimum value of 0. */
2615 if (backlog < 0)
2616 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 res = listen(s->sock_fd, backlog);
2618 Py_END_ALLOW_THREADS
2619 if (res < 0)
2620 return s->errorhandler();
2621 Py_INCREF(Py_None);
2622 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002623}
2624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002625PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002626"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002627\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002628Enable a server to accept connections. If backlog is specified, it must be\n\
2629at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002630unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002631connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002632
2633
Thomas Wouters477c8d52006-05-27 19:21:47 +00002634/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002635 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002636 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002637 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002638 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002639 * also possible that we return a number of bytes smaller than the request
2640 * bytes.
2641 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002642
Antoine Pitrou19467d22010-08-17 19:33:30 +00002643static Py_ssize_t
2644sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002645{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002646 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (!IS_SELECTABLE(s)) {
2650 select_error();
2651 return -1;
2652 }
2653 if (len == 0) {
2654 /* If 0 bytes were requested, do nothing. */
2655 return 0;
2656 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002658 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002660 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002661 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002662#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002663 if (len > INT_MAX)
2664 len = INT_MAX;
2665 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2666#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002668#endif
2669 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 if (timeout == 1) {
2673 PyErr_SetString(socket_timeout, "timed out");
2674 return -1;
2675 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002676 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (outlen < 0) {
2678 /* Note: the call to errorhandler() ALWAYS indirectly returned
2679 NULL, so ignore its return value */
2680 s->errorhandler();
2681 return -1;
2682 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002684}
2685
Guido van Rossum48a680c2001-03-02 06:34:14 +00002686
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002687/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002688
Guido van Rossum73624e91994-10-10 17:59:00 +00002689static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002690sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002691{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002692 Py_ssize_t recvlen, outlen;
2693 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002695
Antoine Pitrou19467d22010-08-17 19:33:30 +00002696 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 if (recvlen < 0) {
2700 PyErr_SetString(PyExc_ValueError,
2701 "negative buffersize in recv");
2702 return NULL;
2703 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 /* Allocate a new string. */
2706 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2707 if (buf == NULL)
2708 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 /* Call the guts */
2711 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2712 if (outlen < 0) {
2713 /* An error occurred, release the string and return an
2714 error. */
2715 Py_DECREF(buf);
2716 return NULL;
2717 }
2718 if (outlen != recvlen) {
2719 /* We did not read as many bytes as we anticipated, resize the
2720 string if possible and be successful. */
2721 _PyBytes_Resize(&buf, outlen);
2722 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002725}
2726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002727PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002728"recv(buffersize[, flags]) -> data\n\
2729\n\
2730Receive up to buffersize bytes from the socket. For the optional flags\n\
2731argument, see the Unix manual. When no data is available, block until\n\
2732at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002733the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002734
Guido van Rossum30a685f1991-06-27 15:51:29 +00002735
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002736/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002737
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002739sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002742
Antoine Pitrou19467d22010-08-17 19:33:30 +00002743 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 Py_buffer pbuf;
2745 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002746 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002749 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 &pbuf, &recvlen, &flags))
2751 return NULL;
2752 buf = pbuf.buf;
2753 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 if (recvlen < 0) {
2756 PyBuffer_Release(&pbuf);
2757 PyErr_SetString(PyExc_ValueError,
2758 "negative buffersize in recv_into");
2759 return NULL;
2760 }
2761 if (recvlen == 0) {
2762 /* If nbytes was not specified, use the buffer's length */
2763 recvlen = buflen;
2764 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 /* Check if the buffer is large enough */
2767 if (buflen < recvlen) {
2768 PyBuffer_Release(&pbuf);
2769 PyErr_SetString(PyExc_ValueError,
2770 "buffer too small for requested bytes");
2771 return NULL;
2772 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 /* Call the guts */
2775 readlen = sock_recv_guts(s, buf, recvlen, flags);
2776 if (readlen < 0) {
2777 /* Return an error. */
2778 PyBuffer_Release(&pbuf);
2779 return NULL;
2780 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 PyBuffer_Release(&pbuf);
2783 /* Return the number of bytes read. Note that we do not do anything
2784 special here in the case that readlen < recvlen. */
2785 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002786}
2787
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002788PyDoc_STRVAR(recv_into_doc,
2789"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002790\n\
2791A version of recv() that stores its data into a buffer rather than creating \n\
2792a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2793is not specified (or 0), receive up to the size available in the given buffer.\n\
2794\n\
2795See recv() for documentation about the flags.");
2796
2797
2798/*
Christian Heimes99170a52007-12-19 02:07:34 +00002799 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2800 * into a char buffer. If you have any inc/def ref to do to the objects that
2801 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002802 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002803 * that it is also possible that we return a number of bytes smaller than the
2804 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002805 *
2806 * 'addr' is a return value for the address object. Note that you must decref
2807 * it yourself.
2808 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002809static Py_ssize_t
2810sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 sock_addr_t addrbuf;
2814 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002815 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 if (!getsockaddrlen(s, &addrlen))
2821 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 if (!IS_SELECTABLE(s)) {
2824 select_error();
2825 return -1;
2826 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002827
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002828 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 Py_BEGIN_ALLOW_THREADS
2830 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002831 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002833#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002834 if (len > INT_MAX)
2835 len = INT_MAX;
2836 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002838#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 n = recvfrom(s->sock_fd, cbuf, len, flags,
2840 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 }
2843 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 if (timeout == 1) {
2846 PyErr_SetString(socket_timeout, "timed out");
2847 return -1;
2848 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002849 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 if (n < 0) {
2851 s->errorhandler();
2852 return -1;
2853 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2856 addrlen, s->sock_proto)))
2857 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002860}
2861
2862/* s.recvfrom(nbytes [,flags]) method */
2863
2864static PyObject *
2865sock_recvfrom(PySocketSockObject *s, PyObject *args)
2866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 PyObject *buf = NULL;
2868 PyObject *addr = NULL;
2869 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002870 int flags = 0;
2871 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002872
Antoine Pitrou19467d22010-08-17 19:33:30 +00002873 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 if (recvlen < 0) {
2877 PyErr_SetString(PyExc_ValueError,
2878 "negative buffersize in recvfrom");
2879 return NULL;
2880 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2883 if (buf == NULL)
2884 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2887 recvlen, flags, &addr);
2888 if (outlen < 0) {
2889 goto finally;
2890 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 if (outlen != recvlen) {
2893 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002894 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002896 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 goto finally;
2898 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002901
2902finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 Py_XDECREF(buf);
2904 Py_XDECREF(addr);
2905 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002906}
2907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002908PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002909"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2910\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912
Thomas Wouters477c8d52006-05-27 19:21:47 +00002913
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002914/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002915
2916static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002917sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002920
Antoine Pitrou19467d22010-08-17 19:33:30 +00002921 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 Py_buffer pbuf;
2923 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002924 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002927
Antoine Pitrou19467d22010-08-17 19:33:30 +00002928 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 kwlist, &pbuf,
2930 &recvlen, &flags))
2931 return NULL;
2932 buf = pbuf.buf;
2933 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 if (recvlen < 0) {
2936 PyBuffer_Release(&pbuf);
2937 PyErr_SetString(PyExc_ValueError,
2938 "negative buffersize in recvfrom_into");
2939 return NULL;
2940 }
2941 if (recvlen == 0) {
2942 /* If nbytes was not specified, use the buffer's length */
2943 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05002944 } else if (recvlen > buflen) {
2945 PyBuffer_Release(&pbuf);
2946 PyErr_SetString(PyExc_ValueError,
2947 "nbytes is greater than the length of the buffer");
2948 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2952 if (readlen < 0) {
2953 PyBuffer_Release(&pbuf);
2954 /* Return an error */
2955 Py_XDECREF(addr);
2956 return NULL;
2957 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 PyBuffer_Release(&pbuf);
2960 /* Return the number of bytes read and the address. Note that we do
2961 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002962 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002963}
2964
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002965PyDoc_STRVAR(recvfrom_into_doc,
2966"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002967\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002968Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002969
2970
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002971/* The sendmsg() and recvmsg[_into]() methods require a working
2972 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2973#ifdef CMSG_LEN
2974/*
2975 * Call recvmsg() with the supplied iovec structures, flags, and
2976 * ancillary data buffer size (controllen). Returns the tuple return
2977 * value for recvmsg() or recvmsg_into(), with the first item provided
2978 * by the supplied makeval() function. makeval() will be called with
2979 * the length read and makeval_data as arguments, and must return a
2980 * new reference (which will be decrefed if there is a subsequent
2981 * error). On error, closes any file descriptors received via
2982 * SCM_RIGHTS.
2983 */
2984static PyObject *
2985sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2986 int flags, Py_ssize_t controllen,
2987 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2988{
2989 ssize_t bytes_received = -1;
2990 int timeout;
2991 sock_addr_t addrbuf;
2992 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002993 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002994 PyObject *cmsg_list = NULL, *retval = NULL;
2995 void *controlbuf = NULL;
2996 struct cmsghdr *cmsgh;
2997 size_t cmsgdatalen = 0;
2998 int cmsg_status;
2999
3000 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3001 ignored" when the socket is connected (Linux fills them in
3002 anyway for AF_UNIX sockets at least). Normally msg_namelen
3003 seems to be set to 0 if there's no address, but try to
3004 initialize msg_name to something that won't be mistaken for a
3005 real address if that doesn't happen. */
3006 if (!getsockaddrlen(s, &addrbuflen))
3007 return NULL;
3008 memset(&addrbuf, 0, addrbuflen);
3009 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3010
3011 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3012 PyErr_SetString(PyExc_ValueError,
3013 "invalid ancillary data buffer length");
3014 return NULL;
3015 }
3016 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3017 return PyErr_NoMemory();
3018
3019 /* Make the system call. */
3020 if (!IS_SELECTABLE(s)) {
3021 select_error();
3022 goto finally;
3023 }
3024
3025 BEGIN_SELECT_LOOP(s)
3026 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003027 msg.msg_name = SAS2SA(&addrbuf);
3028 msg.msg_namelen = addrbuflen;
3029 msg.msg_iov = iov;
3030 msg.msg_iovlen = iovlen;
3031 msg.msg_control = controlbuf;
3032 msg.msg_controllen = controllen;
3033 timeout = internal_select_ex(s, 0, interval);
3034 if (!timeout)
3035 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3036 Py_END_ALLOW_THREADS;
3037 if (timeout == 1) {
3038 PyErr_SetString(socket_timeout, "timed out");
3039 goto finally;
3040 }
3041 END_SELECT_LOOP(s)
3042
3043 if (bytes_received < 0) {
3044 s->errorhandler();
3045 goto finally;
3046 }
3047
3048 /* Make list of (level, type, data) tuples from control messages. */
3049 if ((cmsg_list = PyList_New(0)) == NULL)
3050 goto err_closefds;
3051 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3052 implementations didn't do so. */
3053 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3054 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3055 PyObject *bytes, *tuple;
3056 int tmp;
3057
3058 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3059 if (cmsg_status != 0) {
3060 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3061 "received malformed or improperly-truncated "
3062 "ancillary data", 1) == -1)
3063 goto err_closefds;
3064 }
3065 if (cmsg_status < 0)
3066 break;
3067 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003068 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003069 goto err_closefds;
3070 }
3071
3072 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3073 cmsgdatalen);
3074 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3075 (int)cmsgh->cmsg_type, bytes);
3076 if (tuple == NULL)
3077 goto err_closefds;
3078 tmp = PyList_Append(cmsg_list, tuple);
3079 Py_DECREF(tuple);
3080 if (tmp != 0)
3081 goto err_closefds;
3082
3083 if (cmsg_status != 0)
3084 break;
3085 }
3086
3087 retval = Py_BuildValue("NOiN",
3088 (*makeval)(bytes_received, makeval_data),
3089 cmsg_list,
3090 (int)msg.msg_flags,
3091 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3092 ((msg.msg_namelen > addrbuflen) ?
3093 addrbuflen : msg.msg_namelen),
3094 s->sock_proto));
3095 if (retval == NULL)
3096 goto err_closefds;
3097
3098finally:
3099 Py_XDECREF(cmsg_list);
3100 PyMem_Free(controlbuf);
3101 return retval;
3102
3103err_closefds:
3104#ifdef SCM_RIGHTS
3105 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3106 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3107 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3108 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3109 if (cmsg_status < 0)
3110 break;
3111 if (cmsgh->cmsg_level == SOL_SOCKET &&
3112 cmsgh->cmsg_type == SCM_RIGHTS) {
3113 size_t numfds;
3114 int *fdp;
3115
3116 numfds = cmsgdatalen / sizeof(int);
3117 fdp = (int *)CMSG_DATA(cmsgh);
3118 while (numfds-- > 0)
3119 close(*fdp++);
3120 }
3121 if (cmsg_status != 0)
3122 break;
3123 }
3124#endif /* SCM_RIGHTS */
3125 goto finally;
3126}
3127
3128
3129static PyObject *
3130makeval_recvmsg(ssize_t received, void *data)
3131{
3132 PyObject **buf = data;
3133
3134 if (received < PyBytes_GET_SIZE(*buf))
3135 _PyBytes_Resize(buf, received);
3136 Py_XINCREF(*buf);
3137 return *buf;
3138}
3139
3140/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3141
3142static PyObject *
3143sock_recvmsg(PySocketSockObject *s, PyObject *args)
3144{
3145 Py_ssize_t bufsize, ancbufsize = 0;
3146 int flags = 0;
3147 struct iovec iov;
3148 PyObject *buf = NULL, *retval = NULL;
3149
3150 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3151 return NULL;
3152
3153 if (bufsize < 0) {
3154 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3155 return NULL;
3156 }
3157 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3158 return NULL;
3159 iov.iov_base = PyBytes_AS_STRING(buf);
3160 iov.iov_len = bufsize;
3161
3162 /* Note that we're passing a pointer to *our pointer* to the bytes
3163 object here (&buf); makeval_recvmsg() may incref the object, or
3164 deallocate it and set our pointer to NULL. */
3165 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3166 &makeval_recvmsg, &buf);
3167 Py_XDECREF(buf);
3168 return retval;
3169}
3170
3171PyDoc_STRVAR(recvmsg_doc,
3172"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3173\n\
3174Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3175socket. The ancbufsize argument sets the size in bytes of the\n\
3176internal buffer used to receive the ancillary data; it defaults to 0,\n\
3177meaning that no ancillary data will be received. Appropriate buffer\n\
3178sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3179CMSG_LEN(), and items which do not fit into the buffer might be\n\
3180truncated or discarded. The flags argument defaults to 0 and has the\n\
3181same meaning as for recv().\n\
3182\n\
3183The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3184The data item is a bytes object holding the non-ancillary data\n\
3185received. The ancdata item is a list of zero or more tuples\n\
3186(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3187(control messages) received: cmsg_level and cmsg_type are integers\n\
3188specifying the protocol level and protocol-specific type respectively,\n\
3189and cmsg_data is a bytes object holding the associated data. The\n\
3190msg_flags item is the bitwise OR of various flags indicating\n\
3191conditions on the received message; see your system documentation for\n\
3192details. If the receiving socket is unconnected, address is the\n\
3193address of the sending socket, if available; otherwise, its value is\n\
3194unspecified.\n\
3195\n\
3196If recvmsg() raises an exception after the system call returns, it\n\
3197will first attempt to close any file descriptors received via the\n\
3198SCM_RIGHTS mechanism.");
3199
3200
3201static PyObject *
3202makeval_recvmsg_into(ssize_t received, void *data)
3203{
3204 return PyLong_FromSsize_t(received);
3205}
3206
3207/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3208
3209static PyObject *
3210sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3211{
3212 Py_ssize_t ancbufsize = 0;
3213 int flags = 0;
3214 struct iovec *iovs = NULL;
3215 Py_ssize_t i, nitems, nbufs = 0;
3216 Py_buffer *bufs = NULL;
3217 PyObject *buffers_arg, *fast, *retval = NULL;
3218
3219 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3220 &buffers_arg, &ancbufsize, &flags))
3221 return NULL;
3222
3223 if ((fast = PySequence_Fast(buffers_arg,
3224 "recvmsg_into() argument 1 must be an "
3225 "iterable")) == NULL)
3226 return NULL;
3227 nitems = PySequence_Fast_GET_SIZE(fast);
3228 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003229 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003230 goto finally;
3231 }
3232
3233 /* Fill in an iovec for each item, and save the Py_buffer
3234 structs to release afterwards. */
3235 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3236 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3237 PyErr_NoMemory();
3238 goto finally;
3239 }
3240 for (; nbufs < nitems; nbufs++) {
3241 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3242 "w*;recvmsg_into() argument 1 must be an iterable "
3243 "of single-segment read-write buffers",
3244 &bufs[nbufs]))
3245 goto finally;
3246 iovs[nbufs].iov_base = bufs[nbufs].buf;
3247 iovs[nbufs].iov_len = bufs[nbufs].len;
3248 }
3249
3250 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3251 &makeval_recvmsg_into, NULL);
3252finally:
3253 for (i = 0; i < nbufs; i++)
3254 PyBuffer_Release(&bufs[i]);
3255 PyMem_Free(bufs);
3256 PyMem_Free(iovs);
3257 Py_DECREF(fast);
3258 return retval;
3259}
3260
3261PyDoc_STRVAR(recvmsg_into_doc,
3262"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3263\n\
3264Receive normal data and ancillary data from the socket, scattering the\n\
3265non-ancillary data into a series of buffers. The buffers argument\n\
3266must be an iterable of objects that export writable buffers\n\
3267(e.g. bytearray objects); these will be filled with successive chunks\n\
3268of the non-ancillary data until it has all been written or there are\n\
3269no more buffers. The ancbufsize argument sets the size in bytes of\n\
3270the internal buffer used to receive the ancillary data; it defaults to\n\
32710, meaning that no ancillary data will be received. Appropriate\n\
3272buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3273or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3274truncated or discarded. The flags argument defaults to 0 and has the\n\
3275same meaning as for recv().\n\
3276\n\
3277The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3278The nbytes item is the total number of bytes of non-ancillary data\n\
3279written into the buffers. The ancdata item is a list of zero or more\n\
3280tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3281data (control messages) received: cmsg_level and cmsg_type are\n\
3282integers specifying the protocol level and protocol-specific type\n\
3283respectively, and cmsg_data is a bytes object holding the associated\n\
3284data. The msg_flags item is the bitwise OR of various flags\n\
3285indicating conditions on the received message; see your system\n\
3286documentation for details. If the receiving socket is unconnected,\n\
3287address is the address of the sending socket, if available; otherwise,\n\
3288its value is unspecified.\n\
3289\n\
3290If recvmsg_into() raises an exception after the system call returns,\n\
3291it will first attempt to close any file descriptors received via the\n\
3292SCM_RIGHTS mechanism.");
3293#endif /* CMSG_LEN */
3294
3295
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003296/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003297
Guido van Rossum73624e91994-10-10 17:59:00 +00003298static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003299sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003302 Py_ssize_t len, n = -1;
3303 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3307 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 if (!IS_SELECTABLE(s)) {
3310 PyBuffer_Release(&pbuf);
3311 return select_error();
3312 }
3313 buf = pbuf.buf;
3314 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003315
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003316 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003318 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003319 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003320#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003321 if (len > INT_MAX)
3322 len = INT_MAX;
3323 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003324#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003326#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003327 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003330 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 PyErr_SetString(socket_timeout, "timed out");
3332 return NULL;
3333 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003334 END_SELECT_LOOP(s)
3335
3336 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 if (n < 0)
3338 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003339 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003340}
3341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003342PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003343"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003344\n\
3345Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003346argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003347sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003348
3349
3350/* s.sendall(data [,flags]) method */
3351
3352static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003353sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003356 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003357 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3361 return NULL;
3362 buf = pbuf.buf;
3363 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 if (!IS_SELECTABLE(s)) {
3366 PyBuffer_Release(&pbuf);
3367 return select_error();
3368 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003371 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 timeout = internal_select(s, 1);
3373 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003374 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003375#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003376 if (len > INT_MAX)
3377 len = INT_MAX;
3378 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003379#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003380 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003381#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003382 }
3383 Py_END_ALLOW_THREADS
3384 if (timeout == 1) {
3385 PyBuffer_Release(&pbuf);
3386 PyErr_SetString(socket_timeout, "timed out");
3387 return NULL;
3388 }
3389 /* PyErr_CheckSignals() might change errno */
3390 saved_errno = errno;
3391 /* We must run our signal handlers before looping again.
3392 send() can return a successful partial write when it is
3393 interrupted, so we can't restrict ourselves to EINTR. */
3394 if (PyErr_CheckSignals()) {
3395 PyBuffer_Release(&pbuf);
3396 return NULL;
3397 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003399 /* If interrupted, try again */
3400 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003402 else
3403 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 }
3405 buf += n;
3406 len -= n;
3407 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 if (n < 0)
3411 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 Py_INCREF(Py_None);
3414 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003415}
3416
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003417PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003418"sendall(data[, flags])\n\
3419\n\
3420Send a data string to the socket. For the optional flags\n\
3421argument, see the Unix manual. This calls send() repeatedly\n\
3422until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003423to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003424
Guido van Rossum30a685f1991-06-27 15:51:29 +00003425
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003426/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003427
Guido van Rossum73624e91994-10-10 17:59:00 +00003428static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003429sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 Py_buffer pbuf;
3432 PyObject *addro;
3433 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003434 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 sock_addr_t addrbuf;
3436 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003439 arglen = PyTuple_Size(args);
3440 switch (arglen) {
3441 case 2:
3442 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3443 break;
3444 case 3:
3445 PyArg_ParseTuple(args, "y*iO:sendto",
3446 &pbuf, &flags, &addro);
3447 break;
3448 default:
3449 PyErr_Format(PyExc_TypeError,
3450 "sendto() takes 2 or 3 arguments (%d given)",
3451 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003452 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003454 if (PyErr_Occurred())
3455 return NULL;
3456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 buf = pbuf.buf;
3458 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 if (!IS_SELECTABLE(s)) {
3461 PyBuffer_Release(&pbuf);
3462 return select_error();
3463 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3466 PyBuffer_Release(&pbuf);
3467 return NULL;
3468 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003469
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003470 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003472 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003473 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003474#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003475 if (len > INT_MAX)
3476 len = INT_MAX;
3477 n = sendto(s->sock_fd, buf, (int)len, flags,
3478 SAS2SA(&addrbuf), addrlen);
3479#else
3480 n = sendto(s->sock_fd, buf, len, flags,
3481 SAS2SA(&addrbuf), addrlen);
3482#endif
3483 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003487 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 PyErr_SetString(socket_timeout, "timed out");
3489 return NULL;
3490 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003491 END_SELECT_LOOP(s)
3492 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 if (n < 0)
3494 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003495 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003496}
3497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003498PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003499"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003500\n\
3501Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003502For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003503
Guido van Rossum30a685f1991-06-27 15:51:29 +00003504
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003505/* The sendmsg() and recvmsg[_into]() methods require a working
3506 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3507#ifdef CMSG_LEN
3508/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3509
3510static PyObject *
3511sock_sendmsg(PySocketSockObject *s, PyObject *args)
3512{
3513 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3514 Py_buffer *databufs = NULL;
3515 struct iovec *iovs = NULL;
3516 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003517 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003518 struct cmsginfo {
3519 int level;
3520 int type;
3521 Py_buffer data;
3522 } *cmsgs = NULL;
3523 void *controlbuf = NULL;
3524 size_t controllen, controllen_last;
3525 ssize_t bytes_sent = -1;
3526 int addrlen, timeout, flags = 0;
3527 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3528 *cmsg_fast = NULL, *retval = NULL;
3529
3530 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3531 &data_arg, &cmsg_arg, &flags, &addr_arg))
3532 return NULL;
3533
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003534 /* Parse destination address. */
3535 if (addr_arg != NULL && addr_arg != Py_None) {
3536 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3537 goto finally;
3538 msg.msg_name = &addrbuf;
3539 msg.msg_namelen = addrlen;
3540 }
3541
3542 /* Fill in an iovec for each message part, and save the Py_buffer
3543 structs to release afterwards. */
3544 if ((data_fast = PySequence_Fast(data_arg,
3545 "sendmsg() argument 1 must be an "
3546 "iterable")) == NULL)
3547 goto finally;
3548 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3549 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003550 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003551 goto finally;
3552 }
3553 msg.msg_iovlen = ndataparts;
3554 if (ndataparts > 0 &&
3555 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3556 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3557 PyErr_NoMemory();
3558 goto finally;
3559 }
3560 for (; ndatabufs < ndataparts; ndatabufs++) {
3561 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3562 "y*;sendmsg() argument 1 must be an iterable of "
3563 "buffer-compatible objects",
3564 &databufs[ndatabufs]))
3565 goto finally;
3566 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3567 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3568 }
3569
3570 if (cmsg_arg == NULL)
3571 ncmsgs = 0;
3572 else {
3573 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3574 "sendmsg() argument 2 must be an "
3575 "iterable")) == NULL)
3576 goto finally;
3577 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3578 }
3579
3580#ifndef CMSG_SPACE
3581 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003582 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003583 "sending multiple control messages is not supported "
3584 "on this system");
3585 goto finally;
3586 }
3587#endif
3588 /* Save level, type and Py_buffer for each control message,
3589 and calculate total size. */
3590 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3591 PyErr_NoMemory();
3592 goto finally;
3593 }
3594 controllen = controllen_last = 0;
3595 while (ncmsgbufs < ncmsgs) {
3596 size_t bufsize, space;
3597
3598 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3599 "(iiy*):[sendmsg() ancillary data items]",
3600 &cmsgs[ncmsgbufs].level,
3601 &cmsgs[ncmsgbufs].type,
3602 &cmsgs[ncmsgbufs].data))
3603 goto finally;
3604 bufsize = cmsgs[ncmsgbufs++].data.len;
3605
3606#ifdef CMSG_SPACE
3607 if (!get_CMSG_SPACE(bufsize, &space)) {
3608#else
3609 if (!get_CMSG_LEN(bufsize, &space)) {
3610#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003611 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003612 goto finally;
3613 }
3614 controllen += space;
3615 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003616 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003617 goto finally;
3618 }
3619 controllen_last = controllen;
3620 }
3621
3622 /* Construct ancillary data block from control message info. */
3623 if (ncmsgbufs > 0) {
3624 struct cmsghdr *cmsgh = NULL;
3625
3626 if ((msg.msg_control = controlbuf =
3627 PyMem_Malloc(controllen)) == NULL) {
3628 PyErr_NoMemory();
3629 goto finally;
3630 }
3631 msg.msg_controllen = controllen;
3632
3633 /* Need to zero out the buffer as a workaround for glibc's
3634 CMSG_NXTHDR() implementation. After getting the pointer to
3635 the next header, it checks its (uninitialized) cmsg_len
3636 member to see if the "message" fits in the buffer, and
3637 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003638 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003639 memset(controlbuf, 0, controllen);
3640
3641 for (i = 0; i < ncmsgbufs; i++) {
3642 size_t msg_len, data_len = cmsgs[i].data.len;
3643 int enough_space = 0;
3644
3645 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3646 if (cmsgh == NULL) {
3647 PyErr_Format(PyExc_RuntimeError,
3648 "unexpected NULL result from %s()",
3649 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3650 goto finally;
3651 }
3652 if (!get_CMSG_LEN(data_len, &msg_len)) {
3653 PyErr_SetString(PyExc_RuntimeError,
3654 "item size out of range for CMSG_LEN()");
3655 goto finally;
3656 }
3657 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3658 size_t space;
3659
3660 cmsgh->cmsg_len = msg_len;
3661 if (get_cmsg_data_space(&msg, cmsgh, &space))
3662 enough_space = (space >= data_len);
3663 }
3664 if (!enough_space) {
3665 PyErr_SetString(PyExc_RuntimeError,
3666 "ancillary data does not fit in calculated "
3667 "space");
3668 goto finally;
3669 }
3670 cmsgh->cmsg_level = cmsgs[i].level;
3671 cmsgh->cmsg_type = cmsgs[i].type;
3672 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3673 }
3674 }
3675
3676 /* Make the system call. */
3677 if (!IS_SELECTABLE(s)) {
3678 select_error();
3679 goto finally;
3680 }
3681
3682 BEGIN_SELECT_LOOP(s)
3683 Py_BEGIN_ALLOW_THREADS;
3684 timeout = internal_select_ex(s, 1, interval);
3685 if (!timeout)
3686 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3687 Py_END_ALLOW_THREADS;
3688 if (timeout == 1) {
3689 PyErr_SetString(socket_timeout, "timed out");
3690 goto finally;
3691 }
3692 END_SELECT_LOOP(s)
3693
3694 if (bytes_sent < 0) {
3695 s->errorhandler();
3696 goto finally;
3697 }
3698 retval = PyLong_FromSsize_t(bytes_sent);
3699
3700finally:
3701 PyMem_Free(controlbuf);
3702 for (i = 0; i < ncmsgbufs; i++)
3703 PyBuffer_Release(&cmsgs[i].data);
3704 PyMem_Free(cmsgs);
3705 Py_XDECREF(cmsg_fast);
3706 for (i = 0; i < ndatabufs; i++)
3707 PyBuffer_Release(&databufs[i]);
3708 PyMem_Free(databufs);
3709 PyMem_Free(iovs);
3710 Py_XDECREF(data_fast);
3711 return retval;
3712}
3713
3714PyDoc_STRVAR(sendmsg_doc,
3715"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3716\n\
3717Send normal and ancillary data to the socket, gathering the\n\
3718non-ancillary data from a series of buffers and concatenating it into\n\
3719a single message. The buffers argument specifies the non-ancillary\n\
3720data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3721The ancdata argument specifies the ancillary data (control messages)\n\
3722as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3723cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3724protocol level and protocol-specific type respectively, and cmsg_data\n\
3725is a buffer-compatible object holding the associated data. The flags\n\
3726argument defaults to 0 and has the same meaning as for send(). If\n\
3727address is supplied and not None, it sets a destination address for\n\
3728the message. The return value is the number of bytes of non-ancillary\n\
3729data sent.");
3730#endif /* CMSG_LEN */
3731
3732
Guido van Rossum30a685f1991-06-27 15:51:29 +00003733/* s.shutdown(how) method */
3734
Guido van Rossum73624e91994-10-10 17:59:00 +00003735static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003736sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 int how;
3739 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003740
Serhiy Storchaka78980432013-01-15 01:12:17 +02003741 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 if (how == -1 && PyErr_Occurred())
3743 return NULL;
3744 Py_BEGIN_ALLOW_THREADS
3745 res = shutdown(s->sock_fd, how);
3746 Py_END_ALLOW_THREADS
3747 if (res < 0)
3748 return s->errorhandler();
3749 Py_INCREF(Py_None);
3750 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003751}
3752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003753PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003754"shutdown(flag)\n\
3755\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003756Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3757of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003758
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003759#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003760static PyObject*
3761sock_ioctl(PySocketSockObject *s, PyObject *arg)
3762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 unsigned long cmd = SIO_RCVALL;
3764 PyObject *argO;
3765 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3768 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 switch (cmd) {
3771 case SIO_RCVALL: {
3772 unsigned int option = RCVALL_ON;
3773 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3774 return NULL;
3775 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3776 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3777 return set_error();
3778 }
3779 return PyLong_FromUnsignedLong(recv); }
3780 case SIO_KEEPALIVE_VALS: {
3781 struct tcp_keepalive ka;
3782 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3783 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3784 return NULL;
3785 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3786 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3787 return set_error();
3788 }
3789 return PyLong_FromUnsignedLong(recv); }
3790 default:
3791 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3792 return NULL;
3793 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003794}
3795PyDoc_STRVAR(sock_ioctl_doc,
3796"ioctl(cmd, option) -> long\n\
3797\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003798Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3799SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3800SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003801#endif
3802
3803#if defined(MS_WINDOWS)
3804static PyObject*
3805sock_share(PySocketSockObject *s, PyObject *arg)
3806{
3807 WSAPROTOCOL_INFO info;
3808 DWORD processId;
3809 int result;
3810
3811 if (!PyArg_ParseTuple(arg, "I", &processId))
3812 return NULL;
3813
3814 Py_BEGIN_ALLOW_THREADS
3815 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3816 Py_END_ALLOW_THREADS
3817 if (result == SOCKET_ERROR)
3818 return set_error();
3819 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3820}
3821PyDoc_STRVAR(sock_share_doc,
3822"share(process_id) -> bytes\n\
3823\n\
3824Share the socket with another process. The target process id\n\
3825must be provided and the resulting bytes object passed to the target\n\
3826process. There the shared socket can be instantiated by calling\n\
3827socket.fromshare().");
3828
Christian Heimesfaf2f632008-01-06 16:59:19 +00003829
3830#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003831
3832/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003833
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003834static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3836 accept_doc},
3837 {"bind", (PyCFunction)sock_bind, METH_O,
3838 bind_doc},
3839 {"close", (PyCFunction)sock_close, METH_NOARGS,
3840 close_doc},
3841 {"connect", (PyCFunction)sock_connect, METH_O,
3842 connect_doc},
3843 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3844 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003845 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3846 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3848 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003849#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 {"getpeername", (PyCFunction)sock_getpeername,
3851 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 {"getsockname", (PyCFunction)sock_getsockname,
3854 METH_NOARGS, getsockname_doc},
3855 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3856 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003857#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3859 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003860#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003861#if defined(MS_WINDOWS)
3862 {"share", (PyCFunction)sock_share, METH_VARARGS,
3863 sock_share_doc},
3864#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003865 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 listen_doc},
3867 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3868 recv_doc},
3869 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3870 recv_into_doc},
3871 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3872 recvfrom_doc},
3873 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3874 recvfrom_into_doc},
3875 {"send", (PyCFunction)sock_send, METH_VARARGS,
3876 send_doc},
3877 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3878 sendall_doc},
3879 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3880 sendto_doc},
3881 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3882 setblocking_doc},
3883 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3884 settimeout_doc},
3885 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3886 gettimeout_doc},
3887 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3888 setsockopt_doc},
3889 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3890 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003891#ifdef CMSG_LEN
3892 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3893 recvmsg_doc},
3894 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3895 recvmsg_into_doc,},
3896 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3897 sendmsg_doc},
3898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003900};
3901
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003902/* SockObject members */
3903static PyMemberDef sock_memberlist[] = {
3904 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3905 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3906 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3907 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3908 {0},
3909};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003910
Guido van Rossum73624e91994-10-10 17:59:00 +00003911/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003912 First close the file description. */
3913
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003914static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003915sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003916{
Antoine Pitroue033e062010-10-29 10:38:18 +00003917 if (s->sock_fd != -1) {
3918 PyObject *exc, *val, *tb;
3919 Py_ssize_t old_refcount = Py_REFCNT(s);
3920 ++Py_REFCNT(s);
3921 PyErr_Fetch(&exc, &val, &tb);
3922 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3923 "unclosed %R", s))
3924 /* Spurious errors can appear at shutdown */
3925 if (PyErr_ExceptionMatches(PyExc_Warning))
3926 PyErr_WriteUnraisable((PyObject *) s);
3927 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003929 Py_REFCNT(s) = old_refcount;
3930 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003932}
3933
Guido van Rossum30a685f1991-06-27 15:51:29 +00003934
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003936sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003937{
Victor Stinnere254e532014-07-26 14:36:55 +02003938 long sock_fd;
3939 /* On Windows, this test is needed because SOCKET_T is unsigned */
3940 if (s->sock_fd == INVALID_SOCKET) {
3941 sock_fd = -1;
3942 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003943#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02003944 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 /* this can occur on Win64, and actually there is a special
3946 ugly printf formatter for decimal pointer length integer
3947 printing, only bother if necessary*/
3948 PyErr_SetString(PyExc_OverflowError,
3949 "no printf formatter to display "
3950 "the socket descriptor in decimal");
3951 return NULL;
3952 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003953#endif
Victor Stinnere254e532014-07-26 14:36:55 +02003954 else
3955 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 return PyUnicode_FromFormat(
3957 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02003958 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 s->sock_type,
3960 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003961}
3962
3963
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003964/* Create a new, uninitialized socket object. */
3965
3966static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003967sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 new = type->tp_alloc(type, 0);
3972 if (new != NULL) {
3973 ((PySocketSockObject *)new)->sock_fd = -1;
3974 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3975 ((PySocketSockObject *)new)->errorhandler = &set_error;
3976 }
3977 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003978}
3979
3980
3981/* Initialize a new socket object. */
3982
Victor Stinnerdaf45552013-08-28 00:53:59 +02003983#ifdef SOCK_CLOEXEC
3984/* socket() and socketpair() fail with EINVAL on Linux kernel older
3985 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3986static int sock_cloexec_works = -1;
3987#endif
3988
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003989/*ARGSUSED*/
3990static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003991sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 PySocketSockObject *s = (PySocketSockObject *)self;
3994 PyObject *fdobj = NULL;
3995 SOCKET_T fd = INVALID_SOCKET;
3996 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3997 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003998#ifndef MS_WINDOWS
3999#ifdef SOCK_CLOEXEC
4000 int *atomic_flag_works = &sock_cloexec_works;
4001#else
4002 int *atomic_flag_works = NULL;
4003#endif
4004#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4007 "|iiiO:socket", keywords,
4008 &family, &type, &proto, &fdobj))
4009 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004012#ifdef MS_WINDOWS
4013 /* recreate a socket that was duplicated */
4014 if (PyBytes_Check(fdobj)) {
4015 WSAPROTOCOL_INFO info;
4016 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4017 PyErr_Format(PyExc_ValueError,
4018 "socket descriptor string has wrong size, "
4019 "should be %zu bytes.", sizeof(info));
4020 return -1;
4021 }
4022 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4023 Py_BEGIN_ALLOW_THREADS
4024 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4025 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4026 Py_END_ALLOW_THREADS
4027 if (fd == INVALID_SOCKET) {
4028 set_error();
4029 return -1;
4030 }
4031 family = info.iAddressFamily;
4032 type = info.iSocketType;
4033 proto = info.iProtocol;
4034 }
4035 else
4036#endif
4037 {
4038 fd = PyLong_AsSocket_t(fdobj);
4039 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4040 return -1;
4041 if (fd == INVALID_SOCKET) {
4042 PyErr_SetString(PyExc_ValueError,
4043 "can't use invalid socket value");
4044 return -1;
4045 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 }
4047 }
4048 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004049#ifdef MS_WINDOWS
4050 /* Windows implementation */
4051#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4052#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4053#endif
4054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004056 if (support_wsa_no_inherit) {
4057 fd = WSASocket(family, type, proto,
4058 NULL, 0,
4059 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4060 if (fd == INVALID_SOCKET) {
4061 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4062 support_wsa_no_inherit = 0;
4063 fd = socket(family, type, proto);
4064 }
4065 }
4066 else {
4067 fd = socket(family, type, proto);
4068 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 if (fd == INVALID_SOCKET) {
4072 set_error();
4073 return -1;
4074 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004075
4076 if (!support_wsa_no_inherit) {
4077 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4078 closesocket(fd);
4079 PyErr_SetFromWindowsErr(0);
4080 return -1;
4081 }
4082 }
4083#else
4084 /* UNIX */
4085 Py_BEGIN_ALLOW_THREADS
4086#ifdef SOCK_CLOEXEC
4087 if (sock_cloexec_works != 0) {
4088 fd = socket(family, type | SOCK_CLOEXEC, proto);
4089 if (sock_cloexec_works == -1) {
4090 if (fd >= 0) {
4091 sock_cloexec_works = 1;
4092 }
4093 else if (errno == EINVAL) {
4094 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4095 sock_cloexec_works = 0;
4096 fd = socket(family, type, proto);
4097 }
4098 }
4099 }
4100 else
4101#endif
4102 {
4103 fd = socket(family, type, proto);
4104 }
4105 Py_END_ALLOW_THREADS
4106
4107 if (fd == INVALID_SOCKET) {
4108 set_error();
4109 return -1;
4110 }
4111
4112 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4113 SOCKETCLOSE(fd);
4114 return -1;
4115 }
4116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004117 }
4118 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004121
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004122}
4123
4124
Guido van Rossumb6775db1994-08-01 11:34:53 +00004125/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004126
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004127static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4129 "_socket.socket", /* tp_name */
4130 sizeof(PySocketSockObject), /* tp_basicsize */
4131 0, /* tp_itemsize */
4132 (destructor)sock_dealloc, /* tp_dealloc */
4133 0, /* tp_print */
4134 0, /* tp_getattr */
4135 0, /* tp_setattr */
4136 0, /* tp_reserved */
4137 (reprfunc)sock_repr, /* tp_repr */
4138 0, /* tp_as_number */
4139 0, /* tp_as_sequence */
4140 0, /* tp_as_mapping */
4141 0, /* tp_hash */
4142 0, /* tp_call */
4143 0, /* tp_str */
4144 PyObject_GenericGetAttr, /* tp_getattro */
4145 0, /* tp_setattro */
4146 0, /* tp_as_buffer */
4147 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4148 sock_doc, /* tp_doc */
4149 0, /* tp_traverse */
4150 0, /* tp_clear */
4151 0, /* tp_richcompare */
4152 0, /* tp_weaklistoffset */
4153 0, /* tp_iter */
4154 0, /* tp_iternext */
4155 sock_methods, /* tp_methods */
4156 sock_memberlist, /* tp_members */
4157 0, /* tp_getset */
4158 0, /* tp_base */
4159 0, /* tp_dict */
4160 0, /* tp_descr_get */
4161 0, /* tp_descr_set */
4162 0, /* tp_dictoffset */
4163 sock_initobj, /* tp_init */
4164 PyType_GenericAlloc, /* tp_alloc */
4165 sock_new, /* tp_new */
4166 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004167};
4168
Guido van Rossum30a685f1991-06-27 15:51:29 +00004169
Guido van Rossum81194471991-07-27 21:42:02 +00004170/* Python interface to gethostname(). */
4171
4172/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004173static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004174socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004175{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004176#ifdef MS_WINDOWS
4177 /* Don't use winsock's gethostname, as this returns the ANSI
4178 version of the hostname, whereas we need a Unicode string.
4179 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004180 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004181 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004182 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004183 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004184
4185 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004186 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004187
4188 if (GetLastError() != ERROR_MORE_DATA)
4189 return PyErr_SetFromWindowsErr(0);
4190
4191 if (size == 0)
4192 return PyUnicode_New(0, 0);
4193
4194 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4195 names */
4196 name = PyMem_Malloc(size * sizeof(wchar_t));
4197 if (!name)
4198 return NULL;
4199 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4200 name,
4201 &size))
4202 {
4203 PyMem_Free(name);
4204 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004205 }
Victor Stinner74168972011-11-17 01:11:36 +01004206
4207 result = PyUnicode_FromWideChar(name, size);
4208 PyMem_Free(name);
4209 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004210#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 char buf[1024];
4212 int res;
4213 Py_BEGIN_ALLOW_THREADS
4214 res = gethostname(buf, (int) sizeof buf - 1);
4215 Py_END_ALLOW_THREADS
4216 if (res < 0)
4217 return set_error();
4218 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004219 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004220#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004221}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004223PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004224"gethostname() -> string\n\
4225\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004226Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004227
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004228#ifdef HAVE_SETHOSTNAME
4229PyDoc_STRVAR(sethostname_doc,
4230"sethostname(name)\n\n\
4231Sets the hostname to name.");
4232
4233static PyObject *
4234socket_sethostname(PyObject *self, PyObject *args)
4235{
4236 PyObject *hnobj;
4237 Py_buffer buf;
4238 int res, flag = 0;
4239
Christian Heimesd2774c72013-06-19 02:06:29 +02004240#ifdef _AIX
4241/* issue #18259, not declared in any useful header file */
4242extern int sethostname(const char *, size_t);
4243#endif
4244
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004245 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4246 PyErr_Clear();
4247 if (!PyArg_ParseTuple(args, "O&:sethostname",
4248 PyUnicode_FSConverter, &hnobj))
4249 return NULL;
4250 flag = 1;
4251 }
4252 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4253 if (!res) {
4254 res = sethostname(buf.buf, buf.len);
4255 PyBuffer_Release(&buf);
4256 }
4257 if (flag)
4258 Py_DECREF(hnobj);
4259 if (res)
4260 return set_error();
4261 Py_RETURN_NONE;
4262}
4263#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004264
Guido van Rossum30a685f1991-06-27 15:51:29 +00004265/* Python interface to gethostbyname(name). */
4266
4267/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004268static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004269socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 char *name;
4272 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004273 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004274
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004275 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 return NULL;
4277 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004278 goto finally;
4279 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4280finally:
4281 PyMem_Free(name);
4282 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004283}
4284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004285PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004286"gethostbyname(host) -> address\n\
4287\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004288Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004289
4290
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004291/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4292
4293static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004294gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 char **pch;
4297 PyObject *rtn_tuple = (PyObject *)NULL;
4298 PyObject *name_list = (PyObject *)NULL;
4299 PyObject *addr_list = (PyObject *)NULL;
4300 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004302 if (h == NULL) {
4303 /* Let's get real error message to return */
4304 set_herror(h_errno);
4305 return NULL;
4306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 if (h->h_addrtype != af) {
4309 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004310 errno = EAFNOSUPPORT;
4311 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 return NULL;
4313 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 case AF_INET:
4318 if (alen < sizeof(struct sockaddr_in))
4319 return NULL;
4320 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004321
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004322#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 case AF_INET6:
4324 if (alen < sizeof(struct sockaddr_in6))
4325 return NULL;
4326 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004327#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 if ((name_list = PyList_New(0)) == NULL)
4332 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 if ((addr_list = PyList_New(0)) == NULL)
4335 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004337 /* SF #1511317: h_aliases can be NULL */
4338 if (h->h_aliases) {
4339 for (pch = h->h_aliases; *pch != NULL; pch++) {
4340 int status;
4341 tmp = PyUnicode_FromString(*pch);
4342 if (tmp == NULL)
4343 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 status = PyList_Append(name_list, tmp);
4346 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 if (status)
4349 goto err;
4350 }
4351 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4354 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 case AF_INET:
4359 {
4360 struct sockaddr_in sin;
4361 memset(&sin, 0, sizeof(sin));
4362 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004363#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4367 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 if (pch == h->h_addr_list && alen >= sizeof(sin))
4370 memcpy((char *) addr, &sin, sizeof(sin));
4371 break;
4372 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004373
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004374#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004375 case AF_INET6:
4376 {
4377 struct sockaddr_in6 sin6;
4378 memset(&sin6, 0, sizeof(sin6));
4379 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004380#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4384 tmp = makeipaddr((struct sockaddr *)&sin6,
4385 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4388 memcpy((char *) addr, &sin6, sizeof(sin6));
4389 break;
4390 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004391#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004394 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 "unsupported address family");
4396 return NULL;
4397 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 if (tmp == NULL)
4400 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 status = PyList_Append(addr_list, tmp);
4403 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 if (status)
4406 goto err;
4407 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004410
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004411 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 Py_XDECREF(name_list);
4413 Py_XDECREF(addr_list);
4414 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004415}
4416
4417
4418/* Python interface to gethostbyname_ex(name). */
4419
4420/*ARGSUSED*/
4421static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004422socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 char *name;
4425 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004426 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004428 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004429#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004431#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004433#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 char buf[16384];
4435 int buf_len = (sizeof buf) - 1;
4436 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004437#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004438#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004440#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004441#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004442
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004443 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004445 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004446 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004448#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004449#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004450 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004452#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004454#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 memset((void *) &data, '\0', sizeof(data));
4456 result = gethostbyname_r(name, &hp_allocated, &data);
4457 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004458#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004459#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004460#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004464#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 Py_END_ALLOW_THREADS
4466 /* Some C libraries would require addr.__ss_family instead of
4467 addr.ss_family.
4468 Therefore, we cast the sockaddr_storage into sockaddr to
4469 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004470 sa = SAS2SA(&addr);
4471 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004473#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004475#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004476finally:
4477 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004479}
4480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004481PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004482"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4483\n\
4484Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004485for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004486
4487
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004488/* Python interface to gethostbyaddr(IP). */
4489
4490/*ARGSUSED*/
4491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004492socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004493{
Charles-François Natali8b759652011-12-23 16:44:51 +01004494 sock_addr_t addr;
4495 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 char *ip_num;
4497 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004498 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004499#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004501#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004503#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 /* glibcs up to 2.10 assume that the buf argument to
4505 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4506 does not ensure. The attribute below instructs the compiler
4507 to maintain this alignment. */
4508 char buf[16384] Py_ALIGNED(8);
4509 int buf_len = (sizeof buf) - 1;
4510 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004511#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004512#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004514#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004515#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 char *ap;
4517 int al;
4518 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004519
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004520 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 return NULL;
4522 af = AF_UNSPEC;
4523 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004524 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 af = sa->sa_family;
4526 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004527 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 switch (af) {
4529 case AF_INET:
4530 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4531 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4532 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004533#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004534 case AF_INET6:
4535 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4536 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4537 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004540 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004541 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 }
4543 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004544#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004545#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004546 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 &hp_allocated, buf, buf_len,
4548 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004549#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 h = gethostbyaddr_r(ap, al, af,
4551 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004552#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 memset((void *) &data, '\0', sizeof(data));
4554 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4555 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004556#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004557#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004558#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004562#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004564 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004565#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004567#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004568finally:
4569 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004571}
4572
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004573PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004574"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4575\n\
4576Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004577for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004578
Guido van Rossum30a685f1991-06-27 15:51:29 +00004579
4580/* Python interface to getservbyname(name).
4581 This only returns the port number, since the other info is already
4582 known or not useful (like the list of aliases). */
4583
4584/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004586socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 char *name, *proto=NULL;
4589 struct servent *sp;
4590 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4591 return NULL;
4592 Py_BEGIN_ALLOW_THREADS
4593 sp = getservbyname(name, proto);
4594 Py_END_ALLOW_THREADS
4595 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004596 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 return NULL;
4598 }
4599 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004600}
4601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004602PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004603"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004604\n\
4605Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004606The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4607otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004608
Guido van Rossum30a685f1991-06-27 15:51:29 +00004609
Barry Warsaw11b91a02004-06-28 00:50:43 +00004610/* Python interface to getservbyport(port).
4611 This only returns the service name, since the other info is already
4612 known or not useful (like the list of aliases). */
4613
4614/*ARGSUSED*/
4615static PyObject *
4616socket_getservbyport(PyObject *self, PyObject *args)
4617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 int port;
4619 char *proto=NULL;
4620 struct servent *sp;
4621 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4622 return NULL;
4623 if (port < 0 || port > 0xffff) {
4624 PyErr_SetString(
4625 PyExc_OverflowError,
4626 "getservbyport: port must be 0-65535.");
4627 return NULL;
4628 }
4629 Py_BEGIN_ALLOW_THREADS
4630 sp = getservbyport(htons((short)port), proto);
4631 Py_END_ALLOW_THREADS
4632 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004633 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 return NULL;
4635 }
4636 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004637}
4638
4639PyDoc_STRVAR(getservbyport_doc,
4640"getservbyport(port[, protocolname]) -> string\n\
4641\n\
4642Return the service name from a port number and protocol name.\n\
4643The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4644otherwise any protocol will match.");
4645
Guido van Rossum3901d851996-12-19 16:35:04 +00004646/* Python interface to getprotobyname(name).
4647 This only returns the protocol number, since the other info is
4648 already known or not useful (like the list of aliases). */
4649
4650/*ARGSUSED*/
4651static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004652socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 char *name;
4655 struct protoent *sp;
4656 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4657 return NULL;
4658 Py_BEGIN_ALLOW_THREADS
4659 sp = getprotobyname(name);
4660 Py_END_ALLOW_THREADS
4661 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004662 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 return NULL;
4664 }
4665 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004666}
4667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004668PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004669"getprotobyname(name) -> integer\n\
4670\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004671Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004672
Guido van Rossum3901d851996-12-19 16:35:04 +00004673
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004674#ifndef NO_DUP
4675/* dup() function for socket fds */
4676
4677static PyObject *
4678socket_dup(PyObject *self, PyObject *fdobj)
4679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 SOCKET_T fd, newfd;
4681 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004682#ifdef MS_WINDOWS
4683 WSAPROTOCOL_INFO info;
4684#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 fd = PyLong_AsSocket_t(fdobj);
4687 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4688 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004689
Victor Stinnerdaf45552013-08-28 00:53:59 +02004690#ifdef MS_WINDOWS
4691 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4692 return set_error();
4693
4694 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4695 FROM_PROTOCOL_INFO,
4696 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 if (newfd == INVALID_SOCKET)
4698 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004699
Victor Stinnerdaf45552013-08-28 00:53:59 +02004700 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4701 closesocket(newfd);
4702 PyErr_SetFromWindowsErr(0);
4703 return NULL;
4704 }
4705#else
4706 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4707 newfd = _Py_dup(fd);
4708 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004709 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004710#endif
4711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 newfdobj = PyLong_FromSocket_t(newfd);
4713 if (newfdobj == NULL)
4714 SOCKETCLOSE(newfd);
4715 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004716}
4717
4718PyDoc_STRVAR(dup_doc,
4719"dup(integer) -> integer\n\
4720\n\
4721Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4722sockets; on some platforms os.dup() won't work for socket file descriptors.");
4723#endif
4724
4725
Dave Cole331708b2004-08-09 04:51:41 +00004726#ifdef HAVE_SOCKETPAIR
4727/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004728 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004729 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004730
4731/*ARGSUSED*/
4732static PyObject *
4733socket_socketpair(PyObject *self, PyObject *args)
4734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 PySocketSockObject *s0 = NULL, *s1 = NULL;
4736 SOCKET_T sv[2];
4737 int family, type = SOCK_STREAM, proto = 0;
4738 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004739#ifdef SOCK_CLOEXEC
4740 int *atomic_flag_works = &sock_cloexec_works;
4741#else
4742 int *atomic_flag_works = NULL;
4743#endif
4744 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004745
4746#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4752 &family, &type, &proto))
4753 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004756 Py_BEGIN_ALLOW_THREADS
4757#ifdef SOCK_CLOEXEC
4758 if (sock_cloexec_works != 0) {
4759 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4760 if (sock_cloexec_works == -1) {
4761 if (ret >= 0) {
4762 sock_cloexec_works = 1;
4763 }
4764 else if (errno == EINVAL) {
4765 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4766 sock_cloexec_works = 0;
4767 ret = socketpair(family, type, proto, sv);
4768 }
4769 }
4770 }
4771 else
4772#endif
4773 {
4774 ret = socketpair(family, type, proto, sv);
4775 }
4776 Py_END_ALLOW_THREADS
4777
4778 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004780
4781 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4782 goto finally;
4783 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4784 goto finally;
4785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004786 s0 = new_sockobject(sv[0], family, type, proto);
4787 if (s0 == NULL)
4788 goto finally;
4789 s1 = new_sockobject(sv[1], family, type, proto);
4790 if (s1 == NULL)
4791 goto finally;
4792 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004793
4794finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 if (res == NULL) {
4796 if (s0 == NULL)
4797 SOCKETCLOSE(sv[0]);
4798 if (s1 == NULL)
4799 SOCKETCLOSE(sv[1]);
4800 }
4801 Py_XDECREF(s0);
4802 Py_XDECREF(s1);
4803 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004804}
4805
4806PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004807"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004808\n\
4809Create a pair of socket objects from the sockets returned by the platform\n\
4810socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004811The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004812AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004813
4814#endif /* HAVE_SOCKETPAIR */
4815
4816
Guido van Rossum006bf911996-06-12 04:04:55 +00004817static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004818socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4823 return NULL;
4824 }
4825 if (x1 < 0) {
4826 PyErr_SetString(PyExc_OverflowError,
4827 "can't convert negative number to unsigned long");
4828 return NULL;
4829 }
4830 x2 = (unsigned int)ntohs((unsigned short)x1);
4831 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004832}
4833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004834PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004835"ntohs(integer) -> integer\n\
4836\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004837Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004838
4839
Guido van Rossum006bf911996-06-12 04:04:55 +00004840static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004841socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 if (PyLong_Check(arg)) {
4846 x = PyLong_AsUnsignedLong(arg);
4847 if (x == (unsigned long) -1 && PyErr_Occurred())
4848 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004849#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 {
4851 unsigned long y;
4852 /* only want the trailing 32 bits */
4853 y = x & 0xFFFFFFFFUL;
4854 if (y ^ x)
4855 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004856 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 x = y;
4858 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 }
4861 else
4862 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004863 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004866}
4867
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004868PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004869"ntohl(integer) -> integer\n\
4870\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004871Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004872
4873
Guido van Rossum006bf911996-06-12 04:04:55 +00004874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004875socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4880 return NULL;
4881 }
4882 if (x1 < 0) {
4883 PyErr_SetString(PyExc_OverflowError,
4884 "can't convert negative number to unsigned long");
4885 return NULL;
4886 }
4887 x2 = (unsigned int)htons((unsigned short)x1);
4888 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004889}
4890
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004891PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004892"htons(integer) -> integer\n\
4893\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004894Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004895
4896
Guido van Rossum006bf911996-06-12 04:04:55 +00004897static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004898socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 if (PyLong_Check(arg)) {
4903 x = PyLong_AsUnsignedLong(arg);
4904 if (x == (unsigned long) -1 && PyErr_Occurred())
4905 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004906#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 {
4908 unsigned long y;
4909 /* only want the trailing 32 bits */
4910 y = x & 0xFFFFFFFFUL;
4911 if (y ^ x)
4912 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004913 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 x = y;
4915 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 }
4918 else
4919 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004920 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 Py_TYPE(arg)->tp_name);
4922 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004923}
4924
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004925PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004926"htonl(integer) -> integer\n\
4927\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004928Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004929
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004930/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004932PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004933"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004934\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004935Convert 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 +00004936binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004937
4938static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004939socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004940{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004941#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004943#endif
4944
4945#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004946#if (SIZEOF_INT != 4)
4947#error "Not sure if in_addr_t exists and int is not 32-bits."
4948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 /* Have to use inet_addr() instead */
4950 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4955 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004956
Tim Peters1df9fdd2003-02-13 03:13:40 +00004957
4958#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004959
4960#ifdef USE_INET_ATON_WEAKLINK
4961 if (inet_aton != NULL) {
4962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 if (inet_aton(ip_addr, &buf))
4964 return PyBytes_FromStringAndSize((char *)(&buf),
4965 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004966
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004967 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 "illegal IP address string passed to inet_aton");
4969 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004970
Thomas Wouters477c8d52006-05-27 19:21:47 +00004971#ifdef USE_INET_ATON_WEAKLINK
4972 } else {
4973#endif
4974
4975#endif
4976
4977#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 /* special-case this address as inet_addr might return INADDR_NONE
4980 * for this */
4981 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004982 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004988 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 "illegal IP address string passed to inet_aton");
4990 return NULL;
4991 }
4992 }
4993 return PyBytes_FromStringAndSize((char *) &packed_addr,
4994 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004995
4996#ifdef USE_INET_ATON_WEAKLINK
4997 }
4998#endif
4999
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005000#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005001}
5002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005003PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005004"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005005\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005006Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005007
5008static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005009socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 char *packed_str;
5012 int addr_len;
5013 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
5016 return NULL;
5017 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005020 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 "packed IP wrong length for inet_ntoa");
5022 return NULL;
5023 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005028}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005029
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005030#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005031
5032PyDoc_STRVAR(inet_pton_doc,
5033"inet_pton(af, ip) -> packed IP address string\n\
5034\n\
5035Convert an IP address from string format to a packed string suitable\n\
5036for use with low-level network functions.");
5037
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005038#endif
5039
5040#ifdef HAVE_INET_PTON
5041
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005042static PyObject *
5043socket_inet_pton(PyObject *self, PyObject *args)
5044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 int af;
5046 char* ip;
5047 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005048#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005049 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005050#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5054 return NULL;
5055 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005056
Martin v. Löwis04697e82004-06-02 12:35:29 +00005057#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005059 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 "can't use AF_INET6, IPv6 is disabled");
5061 return NULL;
5062 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005063#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 retval = inet_pton(af, ip, packed);
5066 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005067 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 return NULL;
5069 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005070 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 "illegal IP address string passed to inet_pton");
5072 return NULL;
5073 } else if (af == AF_INET) {
5074 return PyBytes_FromStringAndSize(packed,
5075 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005076#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 } else if (af == AF_INET6) {
5078 return PyBytes_FromStringAndSize(packed,
5079 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005082 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 return NULL;
5084 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005085}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005086#elif defined(MS_WINDOWS)
5087
5088static PyObject *
5089socket_inet_pton(PyObject *self, PyObject *args)
5090{
5091 int af;
5092 char* ip;
5093 struct sockaddr_in6 addr;
5094 INT ret, size;
5095
5096 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5097 return NULL;
5098 }
5099
Victor Stinnere990c6e2013-11-16 00:18:58 +01005100 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005101 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5102
5103 if (ret) {
5104 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5105 return NULL;
5106 } else if(af == AF_INET) {
5107 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005108 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005109 sizeof(addr4->sin_addr));
5110 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005111 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005112 sizeof(addr.sin6_addr));
5113 } else {
5114 PyErr_SetString(PyExc_OSError, "unknown address family");
5115 return NULL;
5116 }
5117}
5118
5119#endif
5120
5121#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005122
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005123PyDoc_STRVAR(inet_ntop_doc,
5124"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5125\n\
5126Convert a packed IP address of the given family to string format.");
5127
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005128#endif
5129
5130
5131#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005132static PyObject *
5133socket_inet_ntop(PyObject *self, PyObject *args)
5134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 int af;
5136 char* packed;
5137 int len;
5138 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005139#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005140 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005141#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005143#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5146 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5149 return NULL;
5150 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 if (af == AF_INET) {
5153 if (len != sizeof(struct in_addr)) {
5154 PyErr_SetString(PyExc_ValueError,
5155 "invalid length of packed IP address string");
5156 return NULL;
5157 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005158#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 } else if (af == AF_INET6) {
5160 if (len != sizeof(struct in6_addr)) {
5161 PyErr_SetString(PyExc_ValueError,
5162 "invalid length of packed IP address string");
5163 return NULL;
5164 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 } else {
5167 PyErr_Format(PyExc_ValueError,
5168 "unknown address family %d", af);
5169 return NULL;
5170 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 retval = inet_ntop(af, packed, ip, sizeof(ip));
5173 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005174 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 return NULL;
5176 } else {
5177 return PyUnicode_FromString(retval);
5178 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 /* NOTREACHED */
5181 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5182 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005183}
5184
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005185#elif defined(MS_WINDOWS)
5186
5187static PyObject *
5188socket_inet_ntop(PyObject *self, PyObject *args)
5189{
5190 int af;
5191 char* packed;
5192 int len;
5193 struct sockaddr_in6 addr;
5194 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005195#ifdef ENABLE_IPV6
5196 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5197#else
5198 char ip[INET_ADDRSTRLEN + 1];
5199#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005200
5201 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5202 memset((void *) &ip[0], '\0', sizeof(ip));
5203
5204 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5205 return NULL;
5206 }
5207
5208 if (af == AF_INET) {
5209 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5210
5211 if (len != sizeof(struct in_addr)) {
5212 PyErr_SetString(PyExc_ValueError,
5213 "invalid length of packed IP address string");
5214 return NULL;
5215 }
5216 memset(addr4, 0, sizeof(struct sockaddr_in));
5217 addr4->sin_family = AF_INET;
5218 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5219 addrlen = sizeof(struct sockaddr_in);
5220 } else if (af == AF_INET6) {
5221 if (len != sizeof(struct in6_addr)) {
5222 PyErr_SetString(PyExc_ValueError,
5223 "invalid length of packed IP address string");
5224 return NULL;
5225 }
5226
5227 memset(&addr, 0, sizeof(addr));
5228 addr.sin6_family = AF_INET6;
5229 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5230 addrlen = sizeof(addr);
5231 } else {
5232 PyErr_Format(PyExc_ValueError,
5233 "unknown address family %d", af);
5234 return NULL;
5235 }
5236
5237 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005238 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005239 ip, &retlen);
5240
5241 if (ret) {
5242 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5243 return NULL;
5244 } else {
5245 return PyUnicode_FromString(ip);
5246 }
5247}
5248
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005249#endif /* HAVE_INET_PTON */
5250
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005251/* Python interface to getaddrinfo(host, port). */
5252
5253/*ARGSUSED*/
5254static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005255socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005256{
Victor Stinner77af1722011-05-26 14:05:59 +02005257 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005258 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 struct addrinfo hints, *res;
5260 struct addrinfo *res0 = NULL;
5261 PyObject *hobj = NULL;
5262 PyObject *pobj = (PyObject *)NULL;
5263 char pbuf[30];
5264 char *hptr, *pptr;
5265 int family, socktype, protocol, flags;
5266 int error;
5267 PyObject *all = (PyObject *)NULL;
5268 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005269
Georg Brandl6083a4b2013-10-14 06:51:46 +02005270 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005272 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005273 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 &protocol, &flags)) {
5275 return NULL;
5276 }
5277 if (hobj == Py_None) {
5278 hptr = NULL;
5279 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005280 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005281
5282 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 if (!idna)
5284 return NULL;
5285 assert(PyBytes_Check(idna));
5286 hptr = PyBytes_AS_STRING(idna);
5287 } else if (PyBytes_Check(hobj)) {
5288 hptr = PyBytes_AsString(hobj);
5289 } else {
5290 PyErr_SetString(PyExc_TypeError,
5291 "getaddrinfo() argument 1 must be string or None");
5292 return NULL;
5293 }
5294 if (PyLong_CheckExact(pobj)) {
5295 long value = PyLong_AsLong(pobj);
5296 if (value == -1 && PyErr_Occurred())
5297 goto err;
5298 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5299 pptr = pbuf;
5300 } else if (PyUnicode_Check(pobj)) {
5301 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005302 if (pptr == NULL)
5303 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005305 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 } else if (pobj == Py_None) {
5307 pptr = (char *)NULL;
5308 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005309 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 goto err;
5311 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005312#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005313 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5314 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005315 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5316 * This workaround avoids a segfault in libsystem.
5317 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005318 pptr = "00";
5319 }
5320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 memset(&hints, 0, sizeof(hints));
5322 hints.ai_family = family;
5323 hints.ai_socktype = socktype;
5324 hints.ai_protocol = protocol;
5325 hints.ai_flags = flags;
5326 Py_BEGIN_ALLOW_THREADS
5327 ACQUIRE_GETADDRINFO_LOCK
5328 error = getaddrinfo(hptr, pptr, &hints, &res0);
5329 Py_END_ALLOW_THREADS
5330 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5331 if (error) {
5332 set_gaierror(error);
5333 goto err;
5334 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 if ((all = PyList_New(0)) == NULL)
5337 goto err;
5338 for (res = res0; res; res = res->ai_next) {
5339 PyObject *single;
5340 PyObject *addr =
5341 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5342 if (addr == NULL)
5343 goto err;
5344 single = Py_BuildValue("iiisO", res->ai_family,
5345 res->ai_socktype, res->ai_protocol,
5346 res->ai_canonname ? res->ai_canonname : "",
5347 addr);
5348 Py_DECREF(addr);
5349 if (single == NULL)
5350 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 if (PyList_Append(all, single))
5353 goto err;
5354 Py_XDECREF(single);
5355 }
5356 Py_XDECREF(idna);
5357 if (res0)
5358 freeaddrinfo(res0);
5359 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005360 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 Py_XDECREF(all);
5362 Py_XDECREF(idna);
5363 if (res0)
5364 freeaddrinfo(res0);
5365 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005366}
5367
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005368PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005369"getaddrinfo(host, port [, family, type, proto, flags])\n\
5370 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005371\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005372Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005373
5374/* Python interface to getnameinfo(sa, flags). */
5375
5376/*ARGSUSED*/
5377static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005378socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 PyObject *sa = (PyObject *)NULL;
5381 int flags;
5382 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005383 int port;
5384 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5386 struct addrinfo hints, *res = NULL;
5387 int error;
5388 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 flags = flowinfo = scope_id = 0;
5391 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5392 return NULL;
5393 if (!PyTuple_Check(sa)) {
5394 PyErr_SetString(PyExc_TypeError,
5395 "getnameinfo() argument 1 must be a tuple");
5396 return NULL;
5397 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005398 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 &hostp, &port, &flowinfo, &scope_id))
5400 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005401 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005402 PyErr_SetString(PyExc_OverflowError,
5403 "getsockaddrarg: flowinfo must be 0-1048575.");
5404 return NULL;
5405 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5407 memset(&hints, 0, sizeof(hints));
5408 hints.ai_family = AF_UNSPEC;
5409 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005410 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 Py_BEGIN_ALLOW_THREADS
5412 ACQUIRE_GETADDRINFO_LOCK
5413 error = getaddrinfo(hostp, pbuf, &hints, &res);
5414 Py_END_ALLOW_THREADS
5415 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5416 if (error) {
5417 set_gaierror(error);
5418 goto fail;
5419 }
5420 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005421 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 "sockaddr resolved to multiple addresses");
5423 goto fail;
5424 }
5425 switch (res->ai_family) {
5426 case AF_INET:
5427 {
5428 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005429 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 "IPv4 sockaddr must be 2 tuple");
5431 goto fail;
5432 }
5433 break;
5434 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005435#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 case AF_INET6:
5437 {
5438 struct sockaddr_in6 *sin6;
5439 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005440 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 sin6->sin6_scope_id = scope_id;
5442 break;
5443 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005446 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5448 if (error) {
5449 set_gaierror(error);
5450 goto fail;
5451 }
5452 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005453
5454fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 if (res)
5456 freeaddrinfo(res);
5457 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458}
5459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005460PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005461"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005462\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005463Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005464
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005465
5466/* Python API to getting and setting the default timeout value. */
5467
5468static PyObject *
5469socket_getdefaulttimeout(PyObject *self)
5470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 if (defaulttimeout < 0.0) {
5472 Py_INCREF(Py_None);
5473 return Py_None;
5474 }
5475 else
5476 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005477}
5478
5479PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005480"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005481\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005482Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005483A value of None indicates that new socket objects have no timeout.\n\
5484When the socket module is first imported, the default is None.");
5485
5486static PyObject *
5487socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 if (arg == Py_None)
5492 timeout = -1.0;
5493 else {
5494 timeout = PyFloat_AsDouble(arg);
5495 if (timeout < 0.0) {
5496 if (!PyErr_Occurred())
5497 PyErr_SetString(PyExc_ValueError,
5498 "Timeout value out of range");
5499 return NULL;
5500 }
5501 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 Py_INCREF(Py_None);
5506 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005507}
5508
5509PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005510"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005511\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005512Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005513A value of None indicates that new socket objects have no timeout.\n\
5514When the socket module is first imported, the default is None.");
5515
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005516#ifdef HAVE_IF_NAMEINDEX
5517/* Python API for getting interface indices and names */
5518
5519static PyObject *
5520socket_if_nameindex(PyObject *self, PyObject *arg)
5521{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005522 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005523 int i;
5524 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005525
Charles-François Natali60713592011-05-20 16:55:06 +02005526 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005527 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005528 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005529 return NULL;
5530 }
5531
5532 list = PyList_New(0);
5533 if (list == NULL) {
5534 if_freenameindex(ni);
5535 return NULL;
5536 }
5537
Charles-François Natali60713592011-05-20 16:55:06 +02005538 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5539 PyObject *ni_tuple = Py_BuildValue("IO&",
5540 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005541
5542 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5543 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005544 Py_DECREF(list);
5545 if_freenameindex(ni);
5546 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005547 }
5548 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005549 }
5550
5551 if_freenameindex(ni);
5552 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005553}
5554
5555PyDoc_STRVAR(if_nameindex_doc,
5556"if_nameindex()\n\
5557\n\
5558Returns a list of network interface information (index, name) tuples.");
5559
Charles-François Natali60713592011-05-20 16:55:06 +02005560static PyObject *
5561socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005562{
Charles-François Natali60713592011-05-20 16:55:06 +02005563 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005564 unsigned long index;
5565
Charles-François Natali60713592011-05-20 16:55:06 +02005566 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5567 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005568 return NULL;
5569
Charles-François Natali60713592011-05-20 16:55:06 +02005570 index = if_nametoindex(PyBytes_AS_STRING(oname));
5571 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005572 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005573 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005574 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005575 return NULL;
5576 }
5577
5578 return PyLong_FromUnsignedLong(index);
5579}
5580
5581PyDoc_STRVAR(if_nametoindex_doc,
5582"if_nametoindex(if_name)\n\
5583\n\
5584Returns the interface index corresponding to the interface name if_name.");
5585
Charles-François Natali60713592011-05-20 16:55:06 +02005586static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005587socket_if_indextoname(PyObject *self, PyObject *arg)
5588{
Charles-François Natali60713592011-05-20 16:55:06 +02005589 unsigned long index;
5590 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005591
Charles-François Natali60713592011-05-20 16:55:06 +02005592 index = PyLong_AsUnsignedLong(arg);
5593 if (index == (unsigned long) -1)
5594 return NULL;
5595
5596 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005597 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005598 return NULL;
5599 }
5600
Charles-François Natali60713592011-05-20 16:55:06 +02005601 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005602}
5603
5604PyDoc_STRVAR(if_indextoname_doc,
5605"if_indextoname(if_index)\n\
5606\n\
5607Returns the interface name corresponding to the interface index if_index.");
5608
5609#endif /* HAVE_IF_NAMEINDEX */
5610
5611
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005612#ifdef CMSG_LEN
5613/* Python interface to CMSG_LEN(length). */
5614
5615static PyObject *
5616socket_CMSG_LEN(PyObject *self, PyObject *args)
5617{
5618 Py_ssize_t length;
5619 size_t result;
5620
5621 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5622 return NULL;
5623 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5624 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5625 return NULL;
5626 }
5627 return PyLong_FromSize_t(result);
5628}
5629
5630PyDoc_STRVAR(CMSG_LEN_doc,
5631"CMSG_LEN(length) -> control message length\n\
5632\n\
5633Return the total length, without trailing padding, of an ancillary\n\
5634data item with associated data of the given length. This value can\n\
5635often be used as the buffer size for recvmsg() to receive a single\n\
5636item of ancillary data, but RFC 3542 requires portable applications to\n\
5637use CMSG_SPACE() and thus include space for padding, even when the\n\
5638item will be the last in the buffer. Raises OverflowError if length\n\
5639is outside the permissible range of values.");
5640
5641
5642#ifdef CMSG_SPACE
5643/* Python interface to CMSG_SPACE(length). */
5644
5645static PyObject *
5646socket_CMSG_SPACE(PyObject *self, PyObject *args)
5647{
5648 Py_ssize_t length;
5649 size_t result;
5650
5651 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5652 return NULL;
5653 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5654 PyErr_SetString(PyExc_OverflowError,
5655 "CMSG_SPACE() argument out of range");
5656 return NULL;
5657 }
5658 return PyLong_FromSize_t(result);
5659}
5660
5661PyDoc_STRVAR(CMSG_SPACE_doc,
5662"CMSG_SPACE(length) -> buffer size\n\
5663\n\
5664Return the buffer size needed for recvmsg() to receive an ancillary\n\
5665data item with associated data of the given length, along with any\n\
5666trailing padding. The buffer space needed to receive multiple items\n\
5667is the sum of the CMSG_SPACE() values for their associated data\n\
5668lengths. Raises OverflowError if length is outside the permissible\n\
5669range of values.");
5670#endif /* CMSG_SPACE */
5671#endif /* CMSG_LEN */
5672
5673
Guido van Rossum30a685f1991-06-27 15:51:29 +00005674/* List of functions exported by this module. */
5675
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005676static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 {"gethostbyname", socket_gethostbyname,
5678 METH_VARARGS, gethostbyname_doc},
5679 {"gethostbyname_ex", socket_gethostbyname_ex,
5680 METH_VARARGS, ghbn_ex_doc},
5681 {"gethostbyaddr", socket_gethostbyaddr,
5682 METH_VARARGS, gethostbyaddr_doc},
5683 {"gethostname", socket_gethostname,
5684 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005685#ifdef HAVE_SETHOSTNAME
5686 {"sethostname", socket_sethostname,
5687 METH_VARARGS, sethostname_doc},
5688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 {"getservbyname", socket_getservbyname,
5690 METH_VARARGS, getservbyname_doc},
5691 {"getservbyport", socket_getservbyport,
5692 METH_VARARGS, getservbyport_doc},
5693 {"getprotobyname", socket_getprotobyname,
5694 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005695#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 {"dup", socket_dup,
5697 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005698#endif
Dave Cole331708b2004-08-09 04:51:41 +00005699#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 {"socketpair", socket_socketpair,
5701 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 {"ntohs", socket_ntohs,
5704 METH_VARARGS, ntohs_doc},
5705 {"ntohl", socket_ntohl,
5706 METH_O, ntohl_doc},
5707 {"htons", socket_htons,
5708 METH_VARARGS, htons_doc},
5709 {"htonl", socket_htonl,
5710 METH_O, htonl_doc},
5711 {"inet_aton", socket_inet_aton,
5712 METH_VARARGS, inet_aton_doc},
5713 {"inet_ntoa", socket_inet_ntoa,
5714 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005715#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 {"inet_pton", socket_inet_pton,
5717 METH_VARARGS, inet_pton_doc},
5718 {"inet_ntop", socket_inet_ntop,
5719 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005720#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005721 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5722 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 {"getnameinfo", socket_getnameinfo,
5724 METH_VARARGS, getnameinfo_doc},
5725 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5726 METH_NOARGS, getdefaulttimeout_doc},
5727 {"setdefaulttimeout", socket_setdefaulttimeout,
5728 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005729#ifdef HAVE_IF_NAMEINDEX
5730 {"if_nameindex", socket_if_nameindex,
5731 METH_NOARGS, if_nameindex_doc},
5732 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005733 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005734 {"if_indextoname", socket_if_indextoname,
5735 METH_O, if_indextoname_doc},
5736#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005737#ifdef CMSG_LEN
5738 {"CMSG_LEN", socket_CMSG_LEN,
5739 METH_VARARGS, CMSG_LEN_doc},
5740#ifdef CMSG_SPACE
5741 {"CMSG_SPACE", socket_CMSG_SPACE,
5742 METH_VARARGS, CMSG_SPACE_doc},
5743#endif
5744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005746};
5747
Guido van Rossum30a685f1991-06-27 15:51:29 +00005748
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005749#ifdef MS_WINDOWS
5750#define OS_INIT_DEFINED
5751
5752/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005753
5754static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005755os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005756{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005758}
5759
5760static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005761os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 WSADATA WSAData;
5764 int ret;
5765 ret = WSAStartup(0x0101, &WSAData);
5766 switch (ret) {
5767 case 0: /* No error */
5768 Py_AtExit(os_cleanup);
5769 return 1; /* Success */
5770 case WSASYSNOTREADY:
5771 PyErr_SetString(PyExc_ImportError,
5772 "WSAStartup failed: network not ready");
5773 break;
5774 case WSAVERNOTSUPPORTED:
5775 case WSAEINVAL:
5776 PyErr_SetString(
5777 PyExc_ImportError,
5778 "WSAStartup failed: requested version not supported");
5779 break;
5780 default:
5781 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5782 break;
5783 }
5784 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005785}
5786
Guido van Rossum8d665e61996-06-26 18:22:49 +00005787#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005788
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005789
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005790
5791#ifndef OS_INIT_DEFINED
5792static int
5793os_init(void)
5794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005796}
5797#endif
5798
5799
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005800/* C API table - always add new things to the end for binary
5801 compatibility. */
5802static
5803PySocketModule_APIObject PySocketModuleAPI =
5804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005806 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005808};
5809
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005810
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005811/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005812
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005813 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005814 "socket.py" which implements some additional functionality.
5815 The import of "_socket" may fail with an ImportError exception if
5816 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005817 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005818 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005819*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005821PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005822"Implementation module for socket operations.\n\
5823\n\
5824See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005825
Martin v. Löwis1a214512008-06-11 05:26:20 +00005826static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 PyModuleDef_HEAD_INIT,
5828 PySocket_MODULE_NAME,
5829 socket_doc,
5830 -1,
5831 socket_methods,
5832 NULL,
5833 NULL,
5834 NULL,
5835 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005836};
5837
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005838PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005839PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005843 if (!os_init())
5844 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005845
Victor Stinnerdaf45552013-08-28 00:53:59 +02005846#ifdef MS_WINDOWS
5847 if (support_wsa_no_inherit == -1) {
5848 DWORD version = GetVersion();
5849 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5850 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5851 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5852 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5853 }
5854#endif
5855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 Py_TYPE(&sock_type) = &PyType_Type;
5857 m = PyModule_Create(&socketmodule);
5858 if (m == NULL)
5859 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005860
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005861 Py_INCREF(PyExc_OSError);
5862 PySocketModuleAPI.error = PyExc_OSError;
5863 Py_INCREF(PyExc_OSError);
5864 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005866 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005867 if (socket_herror == NULL)
5868 return NULL;
5869 Py_INCREF(socket_herror);
5870 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005871 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 NULL);
5873 if (socket_gaierror == NULL)
5874 return NULL;
5875 Py_INCREF(socket_gaierror);
5876 PyModule_AddObject(m, "gaierror", socket_gaierror);
5877 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005878 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 if (socket_timeout == NULL)
5880 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005881 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 Py_INCREF(socket_timeout);
5883 PyModule_AddObject(m, "timeout", socket_timeout);
5884 Py_INCREF((PyObject *)&sock_type);
5885 if (PyModule_AddObject(m, "SocketType",
5886 (PyObject *)&sock_type) != 0)
5887 return NULL;
5888 Py_INCREF((PyObject *)&sock_type);
5889 if (PyModule_AddObject(m, "socket",
5890 (PyObject *)&sock_type) != 0)
5891 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005892
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005893#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005895#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 Py_INCREF(has_ipv6);
5899 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 /* Export C API */
5902 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5903 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5904 ) != 0)
5905 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005908#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005909 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005910#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005911 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005912#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005913 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005914#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005915#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005916 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005917#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005918#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005920 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005921#endif
5922#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005923 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005924#endif
5925#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005927 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005928#endif
5929#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005931 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005932#endif
5933#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005935 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005936#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005937#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005939 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005940#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005941#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005943 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005944#endif
5945#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005947 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005948#endif
5949#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005950 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005951#endif
5952#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005954 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005955#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005956#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005958 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005959#endif
5960#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005962 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005963#endif
5964#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005966 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005967#endif
5968#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005970 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005971#endif
5972#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005974 PyModule_AddIntMacro(m, AF_NETLINK);
5975 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005976#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005977 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005978#endif
5979#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005980 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005981#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005982 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5983 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005984#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005985 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005986#endif
5987#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005988 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005989#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005990#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005991 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005992#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005993#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005994 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005995#endif
5996#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005997 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005998#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005999 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006000#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006001 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006002#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006003#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006004 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006005#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006006#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006007#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006009 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006010#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006011#ifdef AF_LINK
6012 PyModule_AddIntMacro(m, AF_LINK);
6013#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006014#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006016 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006017#endif
6018#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006020 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006021#endif
6022#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006024 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006025#endif
6026#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006028 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006029#endif
6030#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006032 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006033#endif
6034#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006036 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006037#endif
6038#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006040 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006041#endif
6042#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006044 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006045#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006046
Hye-Shik Chang81268602004-02-02 06:05:24 +00006047#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006048 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6049 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6050 PyModule_AddIntMacro(m, BTPROTO_HCI);
6051 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006052#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006053 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006054#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006055#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006056#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006058#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006059 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6060 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006061#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006062 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6064 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006065#endif
6066
Charles-François Natali47413c12011-10-06 19:47:44 +02006067#ifdef AF_CAN
6068 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006069 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006070#endif
6071#ifdef PF_CAN
6072 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006073 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006074#endif
6075
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006076/* Reliable Datagram Sockets */
6077#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006078 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006079#endif
6080#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006081 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006082#endif
6083
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006084/* Kernel event messages */
6085#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006086 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006087#endif
6088#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006089 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006090#endif
6091
Antoine Pitroub156a462010-10-27 20:13:57 +00006092#ifdef AF_PACKET
6093 PyModule_AddIntMacro(m, AF_PACKET);
6094#endif
6095#ifdef PF_PACKET
6096 PyModule_AddIntMacro(m, PF_PACKET);
6097#endif
6098#ifdef PACKET_HOST
6099 PyModule_AddIntMacro(m, PACKET_HOST);
6100#endif
6101#ifdef PACKET_BROADCAST
6102 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6103#endif
6104#ifdef PACKET_MULTICAST
6105 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6106#endif
6107#ifdef PACKET_OTHERHOST
6108 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6109#endif
6110#ifdef PACKET_OUTGOING
6111 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6112#endif
6113#ifdef PACKET_LOOPBACK
6114 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6115#endif
6116#ifdef PACKET_FASTROUTE
6117 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006118#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006119
Christian Heimes043d6f62008-01-07 17:19:16 +00006120#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006121 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006124 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6125 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6126 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006127
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006128 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6129 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6130 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, SOL_TIPC);
6134 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6135 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6136 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6137 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006138
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006139 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6140 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6141 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6142 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6146 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006147#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006150#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006151 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6152 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6153 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6154 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6155 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6156 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006157#endif
6158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, SOCK_STREAM);
6161 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006162/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006163 PyModule_AddIntMacro(m, SOCK_RAW);
6164 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006165#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006166 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006167#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006168#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006169 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006170#endif
6171#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006173#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006176 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006182 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006183#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006184#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006186#endif
6187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006192 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006204 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006210 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006213 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006216 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006219 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006225 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006231 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006235#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006236#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006238#endif
6239#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006240 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006241#endif
6242#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006243 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006244#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006245#ifdef SO_BINDTODEVICE
6246 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6247#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006248#ifdef SO_PRIORITY
6249 PyModule_AddIntMacro(m, SO_PRIORITY);
6250#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006251#ifdef SO_MARK
6252 PyModule_AddIntMacro(m, SO_MARK);
6253#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 /* Maximum number of connections for "listen" */
6256#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006258#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006260#endif
6261
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006262 /* Ancilliary message types */
6263#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006264 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006265#endif
6266#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006267 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006268#endif
6269#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006271#endif
6272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 /* Flags for send, recv */
6274#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006275 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006278 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006281 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006284 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006287 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006290 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006291#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006293 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006299 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006303#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006304#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006305 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006306#endif
6307#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006308 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006309#endif
6310#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006311 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006312#endif
6313#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006314 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006315#endif
6316#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006317 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006318#endif
6319#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006321#endif
6322#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006324#endif
6325#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006327#endif
6328#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006330#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006331#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006333#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 /* Protocol level and numbers, usable for [gs]etsockopt */
6336#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006340 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006341#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006345 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006347#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006348 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006351 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006353#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006354 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006356#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006357 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006365 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006366#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006368#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006369#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006370 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006371#endif
6372#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6374 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006375#endif
6376#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6378 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6379 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006380
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006381 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6382 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6383 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006384#endif
6385#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6387 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6388 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6389 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006390#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006391#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006393 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6394 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6395 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6396 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6397 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6398 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6399 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6400 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6401 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6402 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6403 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6404 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6405#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006406#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006407 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006408#endif
6409#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006410 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006411#endif
6412#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006413 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006414#endif
6415#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006417#endif
6418#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006419 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006420#endif
6421#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006422 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006423#endif
6424#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006425 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006429#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006437#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006444 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006447 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006450 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006457#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006461 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006464 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006468#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006472 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006478 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006480#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006481 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006492#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006505 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006508 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006517 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006530#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006531#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006536#endif
6537/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006545#endif
6546
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006547#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006549#endif
6550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 /* Some port configuration */
6552#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006561#endif
6562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 /* Some reserved IP v.4 addresses */
6564#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006566#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006571#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006576#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006581#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584#ifdef INADDR_ALLHOSTS_GROUP
6585 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6586 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006587#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006592#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006597#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006599#endif
6600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 /* IPv4 [gs]etsockopt options */
6602#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006649#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006650#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006652#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6655#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006658#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006674#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006678#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006680#endif
6681#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006683#endif
6684#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006686#endif
6687#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006689#endif
6690#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006692#endif
6693#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006695#endif
6696#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006698#endif
6699#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006701#endif
6702#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006704#endif
6705#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006707#endif
6708#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006710#endif
6711#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006713#endif
6714#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006716#endif
6717#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006719#endif
6720#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006722#endif
6723#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006725#endif
6726#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006728#endif
6729#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006731#endif
6732#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006734#endif
6735#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006737#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739 /* TCP options */
6740#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006741 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006743#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006744 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006775#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006776#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006778#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 /* IPX options */
6781#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006783#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006784
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006785/* Reliable Datagram Sockets */
6786#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006788#endif
6789#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006791#endif
6792#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006794#endif
6795#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006797#endif
6798#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006800#endif
6801#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006803#endif
6804#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006806#endif
6807#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006809#endif
6810#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006812#endif
6813#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006815#endif
6816#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006818#endif
6819#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006821#endif
6822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006824#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006826#endif
6827#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006829#endif
6830#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006832#endif
6833#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006835#endif
6836#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006838#endif
6839#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006841#endif
6842#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006844#endif
6845#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006847#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006848#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006850#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006851#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006853#endif
6854#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006856#endif
6857#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006859#endif
6860#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006862#endif
6863#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006865#endif
6866#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006868#endif
6869#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006871#endif
6872#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006874#endif
6875#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006877#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006878#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006880#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006881#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006883#endif
6884#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006886#endif
6887#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006889#endif
6890#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006892#endif
6893#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006895#endif
6896#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006898#endif
6899#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006901#endif
6902#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006904#endif
6905#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006907#endif
6908#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006910#endif
6911#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006913#endif
6914#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006916#endif
6917#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006919#endif
6920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006922#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006924#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006926#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006928#endif
6929#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006931#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006933#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006935#endif
6936#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006938#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006940#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006942#endif
6943
Christian Heimesfaf2f632008-01-06 16:59:19 +00006944#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945 {
6946 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6947 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6948 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006949 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 PyObject *tmp;
6951 tmp = PyLong_FromUnsignedLong(codes[i]);
6952 if (tmp == NULL)
6953 return NULL;
6954 PyModule_AddObject(m, names[i], tmp);
6955 }
6956 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, RCVALL_OFF);
6958 PyModule_AddIntMacro(m, RCVALL_ON);
6959 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006960#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006962#endif
6963#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006965#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006966#endif /* _MSTCPIP_ */
6967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006969#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006973}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006974
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006975
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006976#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006977#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006978
6979/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006980/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006981
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006982int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006983inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006986#if (SIZEOF_INT != 4)
6987#error "Not sure if in_addr_t exists and int is not 32-bits."
6988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006989 unsigned int packed_addr;
6990 packed_addr = inet_addr(src);
6991 if (packed_addr == INADDR_NONE)
6992 return 0;
6993 memcpy(dst, &packed_addr, 4);
6994 return 1;
6995 }
6996 /* Should set errno to EAFNOSUPPORT */
6997 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006998}
6999
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007000const char *
7001inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007003 if (af == AF_INET) {
7004 struct in_addr packed_addr;
7005 if (size < 16)
7006 /* Should set errno to ENOSPC. */
7007 return NULL;
7008 memcpy(&packed_addr, src, sizeof(packed_addr));
7009 return strncpy(dst, inet_ntoa(packed_addr), size);
7010 }
7011 /* Should set errno to EAFNOSUPPORT */
7012 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007013}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007014
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007015#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007016#endif