blob: bb37dd60e1ce90d16a1c3c97824937bad5fc695a [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) { \
683 _PyTime_gettimeofday(&now); \
684 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; \
694 _PyTime_gettimeofday(&now); \
695 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
Guido van Rossum30a685f1991-06-27 15:51:29 +00001216
1217/* Parse a socket address argument according to the socket object's
1218 address family. Return 1 if the address was in the proper format,
1219 0 of not. The address is returned through addr_ret, its length
1220 through len_ret. */
1221
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001223getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001228#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 case AF_UNIX:
1230 {
1231 struct sockaddr_un* addr;
1232 char *path;
1233 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001234 int retval = 0;
1235
1236 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1237 allow embedded nulls on Linux. */
1238 if (PyUnicode_Check(args)) {
1239 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1240 return 0;
1241 }
1242 else
1243 Py_INCREF(args);
1244 if (!PyArg_Parse(args, "y#", &path, &len))
1245 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001248#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 if (len > 0 && path[0] == 0) {
1250 /* Linux abstract namespace extension */
1251 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001252 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001254 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 }
1256 }
1257 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001258#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 {
1260 /* regular NULL-terminated string */
1261 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001262 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001264 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 }
1266 addr->sun_path[len] = 0;
1267 }
1268 addr->sun_family = s->sock_family;
1269 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001271 retval = 1;
1272 unix_out:
1273 Py_DECREF(args);
1274 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001277
Martin v. Löwis11017b12006-01-14 18:12:57 +00001278#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 case AF_NETLINK:
1280 {
1281 struct sockaddr_nl* addr;
1282 int pid, groups;
1283 addr = (struct sockaddr_nl *)addr_ret;
1284 if (!PyTuple_Check(args)) {
1285 PyErr_Format(
1286 PyExc_TypeError,
1287 "getsockaddrarg: "
1288 "AF_NETLINK address must be tuple, not %.500s",
1289 Py_TYPE(args)->tp_name);
1290 return 0;
1291 }
1292 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1293 return 0;
1294 addr->nl_family = AF_NETLINK;
1295 addr->nl_pid = pid;
1296 addr->nl_groups = groups;
1297 *len_ret = sizeof(*addr);
1298 return 1;
1299 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001300#endif
1301
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001302#ifdef AF_RDS
1303 case AF_RDS:
1304 /* RDS sockets use sockaddr_in: fall-through */
1305#endif
1306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 case AF_INET:
1308 {
1309 struct sockaddr_in* addr;
1310 char *host;
1311 int port, result;
1312 if (!PyTuple_Check(args)) {
1313 PyErr_Format(
1314 PyExc_TypeError,
1315 "getsockaddrarg: "
1316 "AF_INET address must be tuple, not %.500s",
1317 Py_TYPE(args)->tp_name);
1318 return 0;
1319 }
1320 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1321 "idna", &host, &port))
1322 return 0;
1323 addr=(struct sockaddr_in*)addr_ret;
1324 result = setipaddr(host, (struct sockaddr *)addr,
1325 sizeof(*addr), AF_INET);
1326 PyMem_Free(host);
1327 if (result < 0)
1328 return 0;
1329 if (port < 0 || port > 0xffff) {
1330 PyErr_SetString(
1331 PyExc_OverflowError,
1332 "getsockaddrarg: port must be 0-65535.");
1333 return 0;
1334 }
1335 addr->sin_family = AF_INET;
1336 addr->sin_port = htons((short)port);
1337 *len_ret = sizeof *addr;
1338 return 1;
1339 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001340
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001341#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 case AF_INET6:
1343 {
1344 struct sockaddr_in6* addr;
1345 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001346 int port, result;
1347 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 flowinfo = scope_id = 0;
1349 if (!PyTuple_Check(args)) {
1350 PyErr_Format(
1351 PyExc_TypeError,
1352 "getsockaddrarg: "
1353 "AF_INET6 address must be tuple, not %.500s",
1354 Py_TYPE(args)->tp_name);
1355 return 0;
1356 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001357 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 "idna", &host, &port, &flowinfo,
1359 &scope_id)) {
1360 return 0;
1361 }
1362 addr = (struct sockaddr_in6*)addr_ret;
1363 result = setipaddr(host, (struct sockaddr *)addr,
1364 sizeof(*addr), AF_INET6);
1365 PyMem_Free(host);
1366 if (result < 0)
1367 return 0;
1368 if (port < 0 || port > 0xffff) {
1369 PyErr_SetString(
1370 PyExc_OverflowError,
1371 "getsockaddrarg: port must be 0-65535.");
1372 return 0;
1373 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001374 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001375 PyErr_SetString(
1376 PyExc_OverflowError,
1377 "getsockaddrarg: flowinfo must be 0-1048575.");
1378 return 0;
1379 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 addr->sin6_family = s->sock_family;
1381 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001382 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 addr->sin6_scope_id = scope_id;
1384 *len_ret = sizeof *addr;
1385 return 1;
1386 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001387#endif
1388
Hye-Shik Chang81268602004-02-02 06:05:24 +00001389#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 case AF_BLUETOOTH:
1391 {
1392 switch (s->sock_proto) {
1393 case BTPROTO_L2CAP:
1394 {
1395 struct sockaddr_l2 *addr;
1396 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 addr = (struct sockaddr_l2 *)addr_ret;
1399 memset(addr, 0, sizeof(struct sockaddr_l2));
1400 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1401 if (!PyArg_ParseTuple(args, "si", &straddr,
1402 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001403 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 "wrong format");
1405 return 0;
1406 }
1407 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1408 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 *len_ret = sizeof *addr;
1411 return 1;
1412 }
1413 case BTPROTO_RFCOMM:
1414 {
1415 struct sockaddr_rc *addr;
1416 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 addr = (struct sockaddr_rc *)addr_ret;
1419 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1420 if (!PyArg_ParseTuple(args, "si", &straddr,
1421 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001422 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 "wrong format");
1424 return 0;
1425 }
1426 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1427 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 *len_ret = sizeof *addr;
1430 return 1;
1431 }
1432 case BTPROTO_HCI:
1433 {
1434 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001435#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001436 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001437
Alexander Belopolskye239d232010-12-08 23:31:48 +00001438 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001439 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001440 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001441 "wrong format");
1442 return 0;
1443 }
1444 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1445 return 0;
1446#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1448 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001449 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 "wrong format");
1451 return 0;
1452 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 *len_ret = sizeof *addr;
1455 return 1;
1456 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001457#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 case BTPROTO_SCO:
1459 {
1460 struct sockaddr_sco *addr;
1461 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 addr = (struct sockaddr_sco *)addr_ret;
1464 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1465 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001466 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 "wrong format");
1468 return 0;
1469 }
1470 straddr = PyBytes_AS_STRING(args);
1471 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1472 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 *len_ret = sizeof *addr;
1475 return 1;
1476 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001479 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 return 0;
1481 }
1482 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001483#endif
1484
Antoine Pitroub156a462010-10-27 20:13:57 +00001485#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 case AF_PACKET:
1487 {
1488 struct sockaddr_ll* addr;
1489 struct ifreq ifr;
1490 char *interfaceName;
1491 int protoNumber;
1492 int hatype = 0;
1493 int pkttype = 0;
1494 char *haddr = NULL;
1495 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 if (!PyTuple_Check(args)) {
1498 PyErr_Format(
1499 PyExc_TypeError,
1500 "getsockaddrarg: "
1501 "AF_PACKET address must be tuple, not %.500s",
1502 Py_TYPE(args)->tp_name);
1503 return 0;
1504 }
1505 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1506 &protoNumber, &pkttype, &hatype,
1507 &haddr, &halen))
1508 return 0;
1509 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1510 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1511 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1512 s->errorhandler();
1513 return 0;
1514 }
1515 if (halen > 8) {
1516 PyErr_SetString(PyExc_ValueError,
1517 "Hardware address must be 8 bytes or less");
1518 return 0;
1519 }
1520 if (protoNumber < 0 || protoNumber > 0xffff) {
1521 PyErr_SetString(
1522 PyExc_OverflowError,
1523 "getsockaddrarg: protoNumber must be 0-65535.");
1524 return 0;
1525 }
1526 addr = (struct sockaddr_ll*)addr_ret;
1527 addr->sll_family = AF_PACKET;
1528 addr->sll_protocol = htons((short)protoNumber);
1529 addr->sll_ifindex = ifr.ifr_ifindex;
1530 addr->sll_pkttype = pkttype;
1531 addr->sll_hatype = hatype;
1532 if (halen != 0) {
1533 memcpy(&addr->sll_addr, haddr, halen);
1534 }
1535 addr->sll_halen = halen;
1536 *len_ret = sizeof *addr;
1537 return 1;
1538 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001539#endif
1540
Christian Heimes043d6f62008-01-07 17:19:16 +00001541#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 case AF_TIPC:
1543 {
1544 unsigned int atype, v1, v2, v3;
1545 unsigned int scope = TIPC_CLUSTER_SCOPE;
1546 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 if (!PyTuple_Check(args)) {
1549 PyErr_Format(
1550 PyExc_TypeError,
1551 "getsockaddrarg: "
1552 "AF_TIPC address must be tuple, not %.500s",
1553 Py_TYPE(args)->tp_name);
1554 return 0;
1555 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 if (!PyArg_ParseTuple(args,
1558 "IIII|I;Invalid TIPC address format",
1559 &atype, &v1, &v2, &v3, &scope))
1560 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 addr = (struct sockaddr_tipc *) addr_ret;
1563 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 addr->family = AF_TIPC;
1566 addr->scope = scope;
1567 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 if (atype == TIPC_ADDR_NAMESEQ) {
1570 addr->addr.nameseq.type = v1;
1571 addr->addr.nameseq.lower = v2;
1572 addr->addr.nameseq.upper = v3;
1573 } else if (atype == TIPC_ADDR_NAME) {
1574 addr->addr.name.name.type = v1;
1575 addr->addr.name.name.instance = v2;
1576 } else if (atype == TIPC_ADDR_ID) {
1577 addr->addr.id.node = v1;
1578 addr->addr.id.ref = v2;
1579 } else {
1580 /* Shouldn't happen */
1581 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1582 return 0;
1583 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 return 1;
1588 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001589#endif
1590
Vinay Sajiped6783f2014-03-21 11:44:32 +00001591#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001592 case AF_CAN:
1593 switch (s->sock_proto) {
1594 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001595 /* fall-through */
1596 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001597 {
1598 struct sockaddr_can *addr;
1599 PyObject *interfaceName;
1600 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001601 Py_ssize_t len;
1602
Benjamin Peterson18b71912013-05-16 15:29:44 -05001603 addr = (struct sockaddr_can *)addr_ret;
1604
Charles-François Natali47413c12011-10-06 19:47:44 +02001605 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1606 &interfaceName))
1607 return 0;
1608
1609 len = PyBytes_GET_SIZE(interfaceName);
1610
1611 if (len == 0) {
1612 ifr.ifr_ifindex = 0;
1613 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001614 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1615 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001616 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1617 s->errorhandler();
1618 Py_DECREF(interfaceName);
1619 return 0;
1620 }
1621 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001622 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001623 "AF_CAN interface name too long");
1624 Py_DECREF(interfaceName);
1625 return 0;
1626 }
1627
1628 addr->can_family = AF_CAN;
1629 addr->can_ifindex = ifr.ifr_ifindex;
1630
1631 *len_ret = sizeof(*addr);
1632 Py_DECREF(interfaceName);
1633 return 1;
1634 }
1635 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001636 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001637 "getsockaddrarg: unsupported CAN protocol");
1638 return 0;
1639 }
1640#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001641
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001642#ifdef PF_SYSTEM
1643 case PF_SYSTEM:
1644 switch (s->sock_proto) {
1645#ifdef SYSPROTO_CONTROL
1646 case SYSPROTO_CONTROL:
1647 {
1648 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001649
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001650 addr = (struct sockaddr_ctl *)addr_ret;
1651 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001652 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001653
1654 if (PyUnicode_Check(args)) {
1655 struct ctl_info info;
1656 PyObject *ctl_name;
1657
1658 if (!PyArg_Parse(args, "O&",
1659 PyUnicode_FSConverter, &ctl_name)) {
1660 return 0;
1661 }
1662
1663 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1664 PyErr_SetString(PyExc_ValueError,
1665 "provided string is too long");
1666 Py_DECREF(ctl_name);
1667 return 0;
1668 }
1669 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1670 sizeof(info.ctl_name));
1671 Py_DECREF(ctl_name);
1672
1673 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1674 PyErr_SetString(PyExc_OSError,
1675 "cannot find kernel control with provided name");
1676 return 0;
1677 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001678
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001679 addr->sc_id = info.ctl_id;
1680 addr->sc_unit = 0;
1681 } else if (!PyArg_ParseTuple(args, "II",
1682 &(addr->sc_id), &(addr->sc_unit))) {
1683 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1684 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001685
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001686 return 0;
1687 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001688
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001689 *len_ret = sizeof(*addr);
1690 return 1;
1691 }
1692#endif
1693 default:
1694 PyErr_SetString(PyExc_OSError,
1695 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1696 return 0;
1697 }
1698#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001703 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001707}
1708
Guido van Rossum30a685f1991-06-27 15:51:29 +00001709
Guido van Rossum48a680c2001-03-02 06:34:14 +00001710/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001711 Return 1 if the family is known, 0 otherwise. The length is returned
1712 through len_ret. */
1713
1714static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001715getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001718
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001719#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 case AF_UNIX:
1721 {
1722 *len_ret = sizeof (struct sockaddr_un);
1723 return 1;
1724 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001725#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001726#if defined(AF_NETLINK)
1727 case AF_NETLINK:
1728 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 *len_ret = sizeof (struct sockaddr_nl);
1730 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001731 }
1732#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001733
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001734#ifdef AF_RDS
1735 case AF_RDS:
1736 /* RDS sockets use sockaddr_in: fall-through */
1737#endif
1738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 case AF_INET:
1740 {
1741 *len_ret = sizeof (struct sockaddr_in);
1742 return 1;
1743 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001744
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001745#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 case AF_INET6:
1747 {
1748 *len_ret = sizeof (struct sockaddr_in6);
1749 return 1;
1750 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001751#endif
1752
Hye-Shik Chang81268602004-02-02 06:05:24 +00001753#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 case AF_BLUETOOTH:
1755 {
1756 switch(s->sock_proto)
1757 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 case BTPROTO_L2CAP:
1760 *len_ret = sizeof (struct sockaddr_l2);
1761 return 1;
1762 case BTPROTO_RFCOMM:
1763 *len_ret = sizeof (struct sockaddr_rc);
1764 return 1;
1765 case BTPROTO_HCI:
1766 *len_ret = sizeof (struct sockaddr_hci);
1767 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001768#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 case BTPROTO_SCO:
1770 *len_ret = sizeof (struct sockaddr_sco);
1771 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001774 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 "unknown BT protocol");
1776 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 }
1779 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001780#endif
1781
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001782#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 case AF_PACKET:
1784 {
1785 *len_ret = sizeof (struct sockaddr_ll);
1786 return 1;
1787 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001788#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001789
Christian Heimes043d6f62008-01-07 17:19:16 +00001790#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 case AF_TIPC:
1792 {
1793 *len_ret = sizeof (struct sockaddr_tipc);
1794 return 1;
1795 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001796#endif
1797
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001798#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001799 case AF_CAN:
1800 {
1801 *len_ret = sizeof (struct sockaddr_can);
1802 return 1;
1803 }
1804#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001805
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001806#ifdef PF_SYSTEM
1807 case PF_SYSTEM:
1808 switch(s->sock_proto) {
1809#ifdef SYSPROTO_CONTROL
1810 case SYSPROTO_CONTROL:
1811 *len_ret = sizeof (struct sockaddr_ctl);
1812 return 1;
1813#endif
1814 default:
1815 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1816 "unknown PF_SYSTEM protocol");
1817 return 0;
1818 }
1819#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001824 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001828}
1829
1830
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001831/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1832 Currently, these methods are only compiled if the RFC 2292/3542
1833 CMSG_LEN() macro is available. Older systems seem to have used
1834 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1835 it may be possible to define CMSG_LEN() that way if it's not
1836 provided. Some architectures might need extra padding after the
1837 cmsghdr, however, and CMSG_LEN() would have to take account of
1838 this. */
1839#ifdef CMSG_LEN
1840/* If length is in range, set *result to CMSG_LEN(length) and return
1841 true; otherwise, return false. */
1842static int
1843get_CMSG_LEN(size_t length, size_t *result)
1844{
1845 size_t tmp;
1846
1847 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1848 return 0;
1849 tmp = CMSG_LEN(length);
1850 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1851 return 0;
1852 *result = tmp;
1853 return 1;
1854}
1855
1856#ifdef CMSG_SPACE
1857/* If length is in range, set *result to CMSG_SPACE(length) and return
1858 true; otherwise, return false. */
1859static int
1860get_CMSG_SPACE(size_t length, size_t *result)
1861{
1862 size_t tmp;
1863
1864 /* Use CMSG_SPACE(1) here in order to take account of the padding
1865 necessary before *and* after the data. */
1866 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1867 return 0;
1868 tmp = CMSG_SPACE(length);
1869 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1870 return 0;
1871 *result = tmp;
1872 return 1;
1873}
1874#endif
1875
1876/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1877 pointer in msg->msg_control with at least "space" bytes after it,
1878 and its cmsg_len member inside the buffer. */
1879static int
1880cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1881{
1882 size_t cmsg_offset;
1883 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1884 sizeof(cmsgh->cmsg_len));
1885
Charles-François Natali466517d2011-08-28 18:23:43 +02001886 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001887 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001888 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001889 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1890 annoying under OS X as it's unsigned there and so it triggers a
1891 tautological comparison warning under Clang when compared against 0.
1892 Since the check is valid on other platforms, silence the warning under
1893 Clang. */
1894 #ifdef __clang__
1895 #pragma clang diagnostic push
1896 #pragma clang diagnostic ignored "-Wtautological-compare"
1897 #endif
1898 if (msg->msg_controllen < 0)
1899 return 0;
1900 #ifdef __clang__
1901 #pragma clang diagnostic pop
1902 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001903 if (space < cmsg_len_end)
1904 space = cmsg_len_end;
1905 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1906 return (cmsg_offset <= (size_t)-1 - space &&
1907 cmsg_offset + space <= msg->msg_controllen);
1908}
1909
1910/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1911 *space to number of bytes following it in the buffer and return
1912 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1913 msg->msg_controllen are valid. */
1914static int
1915get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1916{
1917 size_t data_offset;
1918 char *data_ptr;
1919
1920 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1921 return 0;
1922 data_offset = data_ptr - (char *)msg->msg_control;
1923 if (data_offset > msg->msg_controllen)
1924 return 0;
1925 *space = msg->msg_controllen - data_offset;
1926 return 1;
1927}
1928
1929/* If cmsgh is invalid or not contained in the buffer pointed to by
1930 msg->msg_control, return -1. If cmsgh is valid and its associated
1931 data is entirely contained in the buffer, set *data_len to the
1932 length of the associated data and return 0. If only part of the
1933 associated data is contained in the buffer but cmsgh is otherwise
1934 valid, set *data_len to the length contained in the buffer and
1935 return 1. */
1936static int
1937get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1938{
1939 size_t space, cmsg_data_len;
1940
1941 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1942 cmsgh->cmsg_len < CMSG_LEN(0))
1943 return -1;
1944 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1945 if (!get_cmsg_data_space(msg, cmsgh, &space))
1946 return -1;
1947 if (space >= cmsg_data_len) {
1948 *data_len = cmsg_data_len;
1949 return 0;
1950 }
1951 *data_len = space;
1952 return 1;
1953}
1954#endif /* CMSG_LEN */
1955
1956
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001957/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001958
Guido van Rossum73624e91994-10-10 17:59:00 +00001959static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001960sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 sock_addr_t addrbuf;
1963 SOCKET_T newfd = INVALID_SOCKET;
1964 socklen_t addrlen;
1965 PyObject *sock = NULL;
1966 PyObject *addr = NULL;
1967 PyObject *res = NULL;
1968 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001969#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1970 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
1971 static int accept4_works = -1;
1972#endif
1973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 if (!getsockaddrlen(s, &addrlen))
1975 return NULL;
1976 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 if (!IS_SELECTABLE(s))
1979 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001980
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001981 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001984 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001985 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001986#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1987 if (accept4_works != 0) {
1988 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
1989 SOCK_CLOEXEC);
1990 if (newfd == INVALID_SOCKET && accept4_works == -1) {
1991 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
1992 accept4_works = (errno != ENOSYS);
1993 }
1994 }
1995 if (accept4_works == 0)
1996 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1997#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001999#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002000 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 if (timeout == 1) {
2004 PyErr_SetString(socket_timeout, "timed out");
2005 return NULL;
2006 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002007 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 if (newfd == INVALID_SOCKET)
2010 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002011
Victor Stinnerdaf45552013-08-28 00:53:59 +02002012#ifdef MS_WINDOWS
2013 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2014 PyErr_SetFromWindowsErr(0);
2015 SOCKETCLOSE(newfd);
2016 goto finally;
2017 }
2018#else
2019
2020#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2021 if (!accept4_works)
2022#endif
2023 {
2024 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2025 SOCKETCLOSE(newfd);
2026 goto finally;
2027 }
2028 }
2029#endif
2030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 sock = PyLong_FromSocket_t(newfd);
2032 if (sock == NULL) {
2033 SOCKETCLOSE(newfd);
2034 goto finally;
2035 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2038 addrlen, s->sock_proto);
2039 if (addr == NULL)
2040 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002043
Guido van Rossum67f7a382002-06-06 21:08:16 +00002044finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 Py_XDECREF(sock);
2046 Py_XDECREF(addr);
2047 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002048}
2049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002050PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002051"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002052\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002053Wait for an incoming connection. Return a new socket file descriptor\n\
2054representing the connection, and the address of the client.\n\
2055For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002056
Guido van Rossum11ba0942002-06-13 15:07:44 +00002057/* s.setblocking(flag) method. Argument:
2058 False -- non-blocking mode; same as settimeout(0)
2059 True -- blocking mode; same as settimeout(None)
2060*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002061
Guido van Rossum73624e91994-10-10 17:59:00 +00002062static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002063sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002064{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002065 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 block = PyLong_AsLong(arg);
2068 if (block == -1 && PyErr_Occurred())
2069 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 s->sock_timeout = block ? -1.0 : 0.0;
2072 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 Py_INCREF(Py_None);
2075 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002076}
Guido van Rossume4485b01994-09-07 14:32:49 +00002077
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002078PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002079"setblocking(flag)\n\
2080\n\
2081Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002082setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002083setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002084
Guido van Rossum11ba0942002-06-13 15:07:44 +00002085/* s.settimeout(timeout) method. Argument:
2086 None -- no timeout, blocking mode; same as setblocking(True)
2087 0.0 -- non-blocking mode; same as setblocking(False)
2088 > 0 -- timeout mode; operations time out after timeout seconds
2089 < 0 -- illegal; raises an exception
2090*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002092sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 if (arg == Py_None)
2097 timeout = -1.0;
2098 else {
2099 timeout = PyFloat_AsDouble(arg);
2100 if (timeout < 0.0) {
2101 if (!PyErr_Occurred())
2102 PyErr_SetString(PyExc_ValueError,
2103 "Timeout value out of range");
2104 return NULL;
2105 }
2106 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 s->sock_timeout = timeout;
2109 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 Py_INCREF(Py_None);
2112 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002113}
2114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002115PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002116"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002117\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002118Set a timeout on socket operations. 'timeout' can be a float,\n\
2119giving in seconds, or None. Setting a timeout of None disables\n\
2120the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002121Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002122
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002123/* s.gettimeout() method.
2124 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002125static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002126sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 if (s->sock_timeout < 0.0) {
2129 Py_INCREF(Py_None);
2130 return Py_None;
2131 }
2132 else
2133 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134}
2135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002136PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002137"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002138\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002139Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002140operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002141operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002142
Guido van Rossumaee08791992-09-08 09:05:33 +00002143/* s.setsockopt() method.
2144 With an integer third argument, sets an integer option.
2145 With a string third argument, sets an option from a buffer;
2146 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002147
Guido van Rossum73624e91994-10-10 17:59:00 +00002148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002149sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 int level;
2152 int optname;
2153 int res;
2154 char *buf;
2155 int buflen;
2156 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 if (PyArg_ParseTuple(args, "iii:setsockopt",
2159 &level, &optname, &flag)) {
2160 buf = (char *) &flag;
2161 buflen = sizeof flag;
2162 }
2163 else {
2164 PyErr_Clear();
2165 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2166 &level, &optname, &buf, &buflen))
2167 return NULL;
2168 }
2169 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2170 if (res < 0)
2171 return s->errorhandler();
2172 Py_INCREF(Py_None);
2173 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002174}
2175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177"setsockopt(level, option, value)\n\
2178\n\
2179Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002180The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002181
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002182
Guido van Rossumaee08791992-09-08 09:05:33 +00002183/* s.getsockopt() method.
2184 With two arguments, retrieves an integer option.
2185 With a third integer argument, retrieves a string buffer of that size;
2186 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002187
Guido van Rossum73624e91994-10-10 17:59:00 +00002188static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002189sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 int level;
2192 int optname;
2193 int res;
2194 PyObject *buf;
2195 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2198 &level, &optname, &buflen))
2199 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 if (buflen == 0) {
2202 int flag = 0;
2203 socklen_t flagsize = sizeof flag;
2204 res = getsockopt(s->sock_fd, level, optname,
2205 (void *)&flag, &flagsize);
2206 if (res < 0)
2207 return s->errorhandler();
2208 return PyLong_FromLong(flag);
2209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002211 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 "getsockopt buflen out of range");
2213 return NULL;
2214 }
2215 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2216 if (buf == NULL)
2217 return NULL;
2218 res = getsockopt(s->sock_fd, level, optname,
2219 (void *)PyBytes_AS_STRING(buf), &buflen);
2220 if (res < 0) {
2221 Py_DECREF(buf);
2222 return s->errorhandler();
2223 }
2224 _PyBytes_Resize(&buf, buflen);
2225 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002226}
2227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002228PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002229"getsockopt(level, option[, buffersize]) -> value\n\
2230\n\
2231Get a socket option. See the Unix manual for level and option.\n\
2232If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002233string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002234
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002235
Fred Drake728819a2000-07-01 03:40:12 +00002236/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002237
Guido van Rossum73624e91994-10-10 17:59:00 +00002238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002239sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 sock_addr_t addrbuf;
2242 int addrlen;
2243 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2246 return NULL;
2247 Py_BEGIN_ALLOW_THREADS
2248 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2249 Py_END_ALLOW_THREADS
2250 if (res < 0)
2251 return s->errorhandler();
2252 Py_INCREF(Py_None);
2253 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002254}
2255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002256PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002257"bind(address)\n\
2258\n\
2259Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002260pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002261sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002262
Guido van Rossum30a685f1991-06-27 15:51:29 +00002263
2264/* s.close() method.
2265 Set the file descriptor to -1 so operations tried subsequently
2266 will surely fail. */
2267
Guido van Rossum73624e91994-10-10 17:59:00 +00002268static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002269sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 if ((fd = s->sock_fd) != -1) {
2274 s->sock_fd = -1;
2275 Py_BEGIN_ALLOW_THREADS
2276 (void) SOCKETCLOSE(fd);
2277 Py_END_ALLOW_THREADS
2278 }
2279 Py_INCREF(Py_None);
2280 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002281}
2282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002283PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002284"close()\n\
2285\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002286Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002287
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002288static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002289sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002290{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002291 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002292 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002293 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002294}
2295
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002296PyDoc_STRVAR(detach_doc,
2297"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002298\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002299Close the socket object without closing the underlying file descriptor.\n\
2300The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002301can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002302
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002303static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002304internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 timeout = 0;
2310 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002311
2312#ifdef MS_WINDOWS
2313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 if (s->sock_timeout > 0.0) {
2315 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2316 IS_SELECTABLE(s)) {
2317 /* This is a mess. Best solution: trust select */
2318 fd_set fds;
2319 fd_set fds_exc;
2320 struct timeval tv;
2321 tv.tv_sec = (int)s->sock_timeout;
2322 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2323 FD_ZERO(&fds);
2324 FD_SET(s->sock_fd, &fds);
2325 FD_ZERO(&fds_exc);
2326 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002327 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2328 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 if (res == 0) {
2330 res = WSAEWOULDBLOCK;
2331 timeout = 1;
2332 } else if (res > 0) {
2333 if (FD_ISSET(s->sock_fd, &fds))
2334 /* The socket is in the writable set - this
2335 means connected */
2336 res = 0;
2337 else {
2338 /* As per MS docs, we need to call getsockopt()
2339 to get the underlying error */
2340 int res_size = sizeof res;
2341 /* It must be in the exception set */
2342 assert(FD_ISSET(s->sock_fd, &fds_exc));
2343 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2344 (char *)&res, &res_size))
2345 /* getsockopt also clears WSAGetLastError,
2346 so reset it back. */
2347 WSASetLastError(res);
2348 else
2349 res = WSAGetLastError();
2350 }
2351 }
2352 /* else if (res < 0) an error occurred */
2353 }
2354 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 if (res < 0)
2357 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002358
2359#else
2360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 if (s->sock_timeout > 0.0) {
2362 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2363 timeout = internal_select(s, 1);
2364 if (timeout == 0) {
2365 /* Bug #1019808: in case of an EINPROGRESS,
2366 use getsockopt(SO_ERROR) to get the real
2367 error. */
2368 socklen_t res_size = sizeof res;
2369 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2370 SO_ERROR, &res, &res_size);
2371 if (res == EISCONN)
2372 res = 0;
2373 errno = res;
2374 }
2375 else if (timeout == -1) {
2376 res = errno; /* had error */
2377 }
2378 else
2379 res = EWOULDBLOCK; /* timed out */
2380 }
2381 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 if (res < 0)
2384 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002385
2386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002390}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002391
Fred Drake728819a2000-07-01 03:40:12 +00002392/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002393
Guido van Rossum73624e91994-10-10 17:59:00 +00002394static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 sock_addr_t addrbuf;
2398 int addrlen;
2399 int res;
2400 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2403 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 Py_BEGIN_ALLOW_THREADS
2406 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2407 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 if (timeout == 1) {
2410 PyErr_SetString(socket_timeout, "timed out");
2411 return NULL;
2412 }
2413 if (res != 0)
2414 return s->errorhandler();
2415 Py_INCREF(Py_None);
2416 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002417}
2418
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002419PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002420"connect(address)\n\
2421\n\
2422Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002423is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002424
Guido van Rossum30a685f1991-06-27 15:51:29 +00002425
Fred Drake728819a2000-07-01 03:40:12 +00002426/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002427
2428static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002429sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 sock_addr_t addrbuf;
2432 int addrlen;
2433 int res;
2434 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2437 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 Py_BEGIN_ALLOW_THREADS
2440 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2441 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 /* Signals are not errors (though they may raise exceptions). Adapted
2444 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002445#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 if (res == EINTR && PyErr_CheckSignals())
2447 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002448#endif
2449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002451}
2452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002453PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002454"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002455\n\
2456This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002457instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002458
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002459
Guido van Rossumed233a51992-06-23 09:07:03 +00002460/* s.fileno() method */
2461
Guido van Rossum73624e91994-10-10 17:59:00 +00002462static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002463sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002466}
2467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002468PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002469"fileno() -> integer\n\
2470\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002471Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002472
Guido van Rossumed233a51992-06-23 09:07:03 +00002473
Guido van Rossumc89705d1992-11-26 08:54:07 +00002474/* s.getsockname() method */
2475
Guido van Rossum73624e91994-10-10 17:59:00 +00002476static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002477sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 sock_addr_t addrbuf;
2480 int res;
2481 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 if (!getsockaddrlen(s, &addrlen))
2484 return NULL;
2485 memset(&addrbuf, 0, addrlen);
2486 Py_BEGIN_ALLOW_THREADS
2487 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2488 Py_END_ALLOW_THREADS
2489 if (res < 0)
2490 return s->errorhandler();
2491 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2492 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002493}
2494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002495PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002496"getsockname() -> address info\n\
2497\n\
2498Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002499info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002500
Guido van Rossumc89705d1992-11-26 08:54:07 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002503/* s.getpeername() method */
2504
Guido van Rossum73624e91994-10-10 17:59:00 +00002505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002506sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 sock_addr_t addrbuf;
2509 int res;
2510 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 if (!getsockaddrlen(s, &addrlen))
2513 return NULL;
2514 memset(&addrbuf, 0, addrlen);
2515 Py_BEGIN_ALLOW_THREADS
2516 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2517 Py_END_ALLOW_THREADS
2518 if (res < 0)
2519 return s->errorhandler();
2520 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2521 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002522}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002525"getpeername() -> address info\n\
2526\n\
2527Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002528info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002529
Guido van Rossumb6775db1994-08-01 11:34:53 +00002530#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002531
2532
Guido van Rossum30a685f1991-06-27 15:51:29 +00002533/* s.listen(n) method */
2534
Guido van Rossum73624e91994-10-10 17:59:00 +00002535static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002536sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002537{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002538 /* We try to choose a default backlog high enough to avoid connection drops
2539 * for common workloads, yet not too high to limit resource usage. */
2540 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002542
Charles-François Natali644b8f52014-05-22 19:45:39 +01002543 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002547 /* To avoid problems on systems that don't allow a negative backlog
2548 * (which doesn't make sense anyway) we force a minimum value of 0. */
2549 if (backlog < 0)
2550 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 res = listen(s->sock_fd, backlog);
2552 Py_END_ALLOW_THREADS
2553 if (res < 0)
2554 return s->errorhandler();
2555 Py_INCREF(Py_None);
2556 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002557}
2558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002559PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002560"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002561\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002562Enable a server to accept connections. If backlog is specified, it must be\n\
2563at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002564unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002565connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002566
2567
Thomas Wouters477c8d52006-05-27 19:21:47 +00002568/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002569 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002570 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002571 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002572 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002573 * also possible that we return a number of bytes smaller than the request
2574 * bytes.
2575 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002576
Antoine Pitrou19467d22010-08-17 19:33:30 +00002577static Py_ssize_t
2578sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002580 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 if (!IS_SELECTABLE(s)) {
2584 select_error();
2585 return -1;
2586 }
2587 if (len == 0) {
2588 /* If 0 bytes were requested, do nothing. */
2589 return 0;
2590 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002591
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002592 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002594 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002595 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002596#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002597 if (len > INT_MAX)
2598 len = INT_MAX;
2599 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2600#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002602#endif
2603 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 if (timeout == 1) {
2607 PyErr_SetString(socket_timeout, "timed out");
2608 return -1;
2609 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002610 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 if (outlen < 0) {
2612 /* Note: the call to errorhandler() ALWAYS indirectly returned
2613 NULL, so ignore its return value */
2614 s->errorhandler();
2615 return -1;
2616 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002618}
2619
Guido van Rossum48a680c2001-03-02 06:34:14 +00002620
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002621/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002622
Guido van Rossum73624e91994-10-10 17:59:00 +00002623static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002624sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002625{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002626 Py_ssize_t recvlen, outlen;
2627 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002629
Antoine Pitrou19467d22010-08-17 19:33:30 +00002630 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 if (recvlen < 0) {
2634 PyErr_SetString(PyExc_ValueError,
2635 "negative buffersize in recv");
2636 return NULL;
2637 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 /* Allocate a new string. */
2640 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2641 if (buf == NULL)
2642 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 /* Call the guts */
2645 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2646 if (outlen < 0) {
2647 /* An error occurred, release the string and return an
2648 error. */
2649 Py_DECREF(buf);
2650 return NULL;
2651 }
2652 if (outlen != recvlen) {
2653 /* We did not read as many bytes as we anticipated, resize the
2654 string if possible and be successful. */
2655 _PyBytes_Resize(&buf, outlen);
2656 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002659}
2660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002661PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002662"recv(buffersize[, flags]) -> data\n\
2663\n\
2664Receive up to buffersize bytes from the socket. For the optional flags\n\
2665argument, see the Unix manual. When no data is available, block until\n\
2666at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002668
Guido van Rossum30a685f1991-06-27 15:51:29 +00002669
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002670/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002671
Thomas Wouters477c8d52006-05-27 19:21:47 +00002672static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002673sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002676
Antoine Pitrou19467d22010-08-17 19:33:30 +00002677 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 Py_buffer pbuf;
2679 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002680 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002683 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 &pbuf, &recvlen, &flags))
2685 return NULL;
2686 buf = pbuf.buf;
2687 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 if (recvlen < 0) {
2690 PyBuffer_Release(&pbuf);
2691 PyErr_SetString(PyExc_ValueError,
2692 "negative buffersize in recv_into");
2693 return NULL;
2694 }
2695 if (recvlen == 0) {
2696 /* If nbytes was not specified, use the buffer's length */
2697 recvlen = buflen;
2698 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 /* Check if the buffer is large enough */
2701 if (buflen < recvlen) {
2702 PyBuffer_Release(&pbuf);
2703 PyErr_SetString(PyExc_ValueError,
2704 "buffer too small for requested bytes");
2705 return NULL;
2706 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 /* Call the guts */
2709 readlen = sock_recv_guts(s, buf, recvlen, flags);
2710 if (readlen < 0) {
2711 /* Return an error. */
2712 PyBuffer_Release(&pbuf);
2713 return NULL;
2714 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 PyBuffer_Release(&pbuf);
2717 /* Return the number of bytes read. Note that we do not do anything
2718 special here in the case that readlen < recvlen. */
2719 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002720}
2721
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002722PyDoc_STRVAR(recv_into_doc,
2723"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002724\n\
2725A version of recv() that stores its data into a buffer rather than creating \n\
2726a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2727is not specified (or 0), receive up to the size available in the given buffer.\n\
2728\n\
2729See recv() for documentation about the flags.");
2730
2731
2732/*
Christian Heimes99170a52007-12-19 02:07:34 +00002733 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2734 * into a char buffer. If you have any inc/def ref to do to the objects that
2735 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002736 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002737 * that it is also possible that we return a number of bytes smaller than the
2738 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002739 *
2740 * 'addr' is a return value for the address object. Note that you must decref
2741 * it yourself.
2742 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002743static Py_ssize_t
2744sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 sock_addr_t addrbuf;
2748 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002749 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (!getsockaddrlen(s, &addrlen))
2755 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (!IS_SELECTABLE(s)) {
2758 select_error();
2759 return -1;
2760 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002761
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002762 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 Py_BEGIN_ALLOW_THREADS
2764 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002765 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002767#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002768 if (len > INT_MAX)
2769 len = INT_MAX;
2770 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002772#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 n = recvfrom(s->sock_fd, cbuf, len, flags,
2774 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 }
2777 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 if (timeout == 1) {
2780 PyErr_SetString(socket_timeout, "timed out");
2781 return -1;
2782 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002783 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 if (n < 0) {
2785 s->errorhandler();
2786 return -1;
2787 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2790 addrlen, s->sock_proto)))
2791 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002794}
2795
2796/* s.recvfrom(nbytes [,flags]) method */
2797
2798static PyObject *
2799sock_recvfrom(PySocketSockObject *s, PyObject *args)
2800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 PyObject *buf = NULL;
2802 PyObject *addr = NULL;
2803 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002804 int flags = 0;
2805 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002806
Antoine Pitrou19467d22010-08-17 19:33:30 +00002807 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 if (recvlen < 0) {
2811 PyErr_SetString(PyExc_ValueError,
2812 "negative buffersize in recvfrom");
2813 return NULL;
2814 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2817 if (buf == NULL)
2818 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2821 recvlen, flags, &addr);
2822 if (outlen < 0) {
2823 goto finally;
2824 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 if (outlen != recvlen) {
2827 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002828 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002830 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 goto finally;
2832 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002835
2836finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 Py_XDECREF(buf);
2838 Py_XDECREF(addr);
2839 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002840}
2841
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002842PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002843"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2844\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002845Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002846
Thomas Wouters477c8d52006-05-27 19:21:47 +00002847
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002848/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002849
2850static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002851sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854
Antoine Pitrou19467d22010-08-17 19:33:30 +00002855 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 Py_buffer pbuf;
2857 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002858 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002861
Antoine Pitrou19467d22010-08-17 19:33:30 +00002862 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 kwlist, &pbuf,
2864 &recvlen, &flags))
2865 return NULL;
2866 buf = pbuf.buf;
2867 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 if (recvlen < 0) {
2870 PyBuffer_Release(&pbuf);
2871 PyErr_SetString(PyExc_ValueError,
2872 "negative buffersize in recvfrom_into");
2873 return NULL;
2874 }
2875 if (recvlen == 0) {
2876 /* If nbytes was not specified, use the buffer's length */
2877 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05002878 } else if (recvlen > buflen) {
2879 PyBuffer_Release(&pbuf);
2880 PyErr_SetString(PyExc_ValueError,
2881 "nbytes is greater than the length of the buffer");
2882 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2886 if (readlen < 0) {
2887 PyBuffer_Release(&pbuf);
2888 /* Return an error */
2889 Py_XDECREF(addr);
2890 return NULL;
2891 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 PyBuffer_Release(&pbuf);
2894 /* Return the number of bytes read and the address. Note that we do
2895 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002896 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002897}
2898
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002899PyDoc_STRVAR(recvfrom_into_doc,
2900"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002901\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002902Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002903
2904
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002905/* The sendmsg() and recvmsg[_into]() methods require a working
2906 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2907#ifdef CMSG_LEN
2908/*
2909 * Call recvmsg() with the supplied iovec structures, flags, and
2910 * ancillary data buffer size (controllen). Returns the tuple return
2911 * value for recvmsg() or recvmsg_into(), with the first item provided
2912 * by the supplied makeval() function. makeval() will be called with
2913 * the length read and makeval_data as arguments, and must return a
2914 * new reference (which will be decrefed if there is a subsequent
2915 * error). On error, closes any file descriptors received via
2916 * SCM_RIGHTS.
2917 */
2918static PyObject *
2919sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2920 int flags, Py_ssize_t controllen,
2921 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2922{
2923 ssize_t bytes_received = -1;
2924 int timeout;
2925 sock_addr_t addrbuf;
2926 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002927 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002928 PyObject *cmsg_list = NULL, *retval = NULL;
2929 void *controlbuf = NULL;
2930 struct cmsghdr *cmsgh;
2931 size_t cmsgdatalen = 0;
2932 int cmsg_status;
2933
2934 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2935 ignored" when the socket is connected (Linux fills them in
2936 anyway for AF_UNIX sockets at least). Normally msg_namelen
2937 seems to be set to 0 if there's no address, but try to
2938 initialize msg_name to something that won't be mistaken for a
2939 real address if that doesn't happen. */
2940 if (!getsockaddrlen(s, &addrbuflen))
2941 return NULL;
2942 memset(&addrbuf, 0, addrbuflen);
2943 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2944
2945 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2946 PyErr_SetString(PyExc_ValueError,
2947 "invalid ancillary data buffer length");
2948 return NULL;
2949 }
2950 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2951 return PyErr_NoMemory();
2952
2953 /* Make the system call. */
2954 if (!IS_SELECTABLE(s)) {
2955 select_error();
2956 goto finally;
2957 }
2958
2959 BEGIN_SELECT_LOOP(s)
2960 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002961 msg.msg_name = SAS2SA(&addrbuf);
2962 msg.msg_namelen = addrbuflen;
2963 msg.msg_iov = iov;
2964 msg.msg_iovlen = iovlen;
2965 msg.msg_control = controlbuf;
2966 msg.msg_controllen = controllen;
2967 timeout = internal_select_ex(s, 0, interval);
2968 if (!timeout)
2969 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2970 Py_END_ALLOW_THREADS;
2971 if (timeout == 1) {
2972 PyErr_SetString(socket_timeout, "timed out");
2973 goto finally;
2974 }
2975 END_SELECT_LOOP(s)
2976
2977 if (bytes_received < 0) {
2978 s->errorhandler();
2979 goto finally;
2980 }
2981
2982 /* Make list of (level, type, data) tuples from control messages. */
2983 if ((cmsg_list = PyList_New(0)) == NULL)
2984 goto err_closefds;
2985 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2986 implementations didn't do so. */
2987 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2988 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2989 PyObject *bytes, *tuple;
2990 int tmp;
2991
2992 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2993 if (cmsg_status != 0) {
2994 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2995 "received malformed or improperly-truncated "
2996 "ancillary data", 1) == -1)
2997 goto err_closefds;
2998 }
2999 if (cmsg_status < 0)
3000 break;
3001 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003002 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003003 goto err_closefds;
3004 }
3005
3006 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3007 cmsgdatalen);
3008 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3009 (int)cmsgh->cmsg_type, bytes);
3010 if (tuple == NULL)
3011 goto err_closefds;
3012 tmp = PyList_Append(cmsg_list, tuple);
3013 Py_DECREF(tuple);
3014 if (tmp != 0)
3015 goto err_closefds;
3016
3017 if (cmsg_status != 0)
3018 break;
3019 }
3020
3021 retval = Py_BuildValue("NOiN",
3022 (*makeval)(bytes_received, makeval_data),
3023 cmsg_list,
3024 (int)msg.msg_flags,
3025 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3026 ((msg.msg_namelen > addrbuflen) ?
3027 addrbuflen : msg.msg_namelen),
3028 s->sock_proto));
3029 if (retval == NULL)
3030 goto err_closefds;
3031
3032finally:
3033 Py_XDECREF(cmsg_list);
3034 PyMem_Free(controlbuf);
3035 return retval;
3036
3037err_closefds:
3038#ifdef SCM_RIGHTS
3039 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3040 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3041 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3042 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3043 if (cmsg_status < 0)
3044 break;
3045 if (cmsgh->cmsg_level == SOL_SOCKET &&
3046 cmsgh->cmsg_type == SCM_RIGHTS) {
3047 size_t numfds;
3048 int *fdp;
3049
3050 numfds = cmsgdatalen / sizeof(int);
3051 fdp = (int *)CMSG_DATA(cmsgh);
3052 while (numfds-- > 0)
3053 close(*fdp++);
3054 }
3055 if (cmsg_status != 0)
3056 break;
3057 }
3058#endif /* SCM_RIGHTS */
3059 goto finally;
3060}
3061
3062
3063static PyObject *
3064makeval_recvmsg(ssize_t received, void *data)
3065{
3066 PyObject **buf = data;
3067
3068 if (received < PyBytes_GET_SIZE(*buf))
3069 _PyBytes_Resize(buf, received);
3070 Py_XINCREF(*buf);
3071 return *buf;
3072}
3073
3074/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3075
3076static PyObject *
3077sock_recvmsg(PySocketSockObject *s, PyObject *args)
3078{
3079 Py_ssize_t bufsize, ancbufsize = 0;
3080 int flags = 0;
3081 struct iovec iov;
3082 PyObject *buf = NULL, *retval = NULL;
3083
3084 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3085 return NULL;
3086
3087 if (bufsize < 0) {
3088 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3089 return NULL;
3090 }
3091 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3092 return NULL;
3093 iov.iov_base = PyBytes_AS_STRING(buf);
3094 iov.iov_len = bufsize;
3095
3096 /* Note that we're passing a pointer to *our pointer* to the bytes
3097 object here (&buf); makeval_recvmsg() may incref the object, or
3098 deallocate it and set our pointer to NULL. */
3099 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3100 &makeval_recvmsg, &buf);
3101 Py_XDECREF(buf);
3102 return retval;
3103}
3104
3105PyDoc_STRVAR(recvmsg_doc,
3106"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3107\n\
3108Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3109socket. The ancbufsize argument sets the size in bytes of the\n\
3110internal buffer used to receive the ancillary data; it defaults to 0,\n\
3111meaning that no ancillary data will be received. Appropriate buffer\n\
3112sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3113CMSG_LEN(), and items which do not fit into the buffer might be\n\
3114truncated or discarded. The flags argument defaults to 0 and has the\n\
3115same meaning as for recv().\n\
3116\n\
3117The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3118The data item is a bytes object holding the non-ancillary data\n\
3119received. The ancdata item is a list of zero or more tuples\n\
3120(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3121(control messages) received: cmsg_level and cmsg_type are integers\n\
3122specifying the protocol level and protocol-specific type respectively,\n\
3123and cmsg_data is a bytes object holding the associated data. The\n\
3124msg_flags item is the bitwise OR of various flags indicating\n\
3125conditions on the received message; see your system documentation for\n\
3126details. If the receiving socket is unconnected, address is the\n\
3127address of the sending socket, if available; otherwise, its value is\n\
3128unspecified.\n\
3129\n\
3130If recvmsg() raises an exception after the system call returns, it\n\
3131will first attempt to close any file descriptors received via the\n\
3132SCM_RIGHTS mechanism.");
3133
3134
3135static PyObject *
3136makeval_recvmsg_into(ssize_t received, void *data)
3137{
3138 return PyLong_FromSsize_t(received);
3139}
3140
3141/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3142
3143static PyObject *
3144sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3145{
3146 Py_ssize_t ancbufsize = 0;
3147 int flags = 0;
3148 struct iovec *iovs = NULL;
3149 Py_ssize_t i, nitems, nbufs = 0;
3150 Py_buffer *bufs = NULL;
3151 PyObject *buffers_arg, *fast, *retval = NULL;
3152
3153 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3154 &buffers_arg, &ancbufsize, &flags))
3155 return NULL;
3156
3157 if ((fast = PySequence_Fast(buffers_arg,
3158 "recvmsg_into() argument 1 must be an "
3159 "iterable")) == NULL)
3160 return NULL;
3161 nitems = PySequence_Fast_GET_SIZE(fast);
3162 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003163 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003164 goto finally;
3165 }
3166
3167 /* Fill in an iovec for each item, and save the Py_buffer
3168 structs to release afterwards. */
3169 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3170 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3171 PyErr_NoMemory();
3172 goto finally;
3173 }
3174 for (; nbufs < nitems; nbufs++) {
3175 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3176 "w*;recvmsg_into() argument 1 must be an iterable "
3177 "of single-segment read-write buffers",
3178 &bufs[nbufs]))
3179 goto finally;
3180 iovs[nbufs].iov_base = bufs[nbufs].buf;
3181 iovs[nbufs].iov_len = bufs[nbufs].len;
3182 }
3183
3184 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3185 &makeval_recvmsg_into, NULL);
3186finally:
3187 for (i = 0; i < nbufs; i++)
3188 PyBuffer_Release(&bufs[i]);
3189 PyMem_Free(bufs);
3190 PyMem_Free(iovs);
3191 Py_DECREF(fast);
3192 return retval;
3193}
3194
3195PyDoc_STRVAR(recvmsg_into_doc,
3196"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3197\n\
3198Receive normal data and ancillary data from the socket, scattering the\n\
3199non-ancillary data into a series of buffers. The buffers argument\n\
3200must be an iterable of objects that export writable buffers\n\
3201(e.g. bytearray objects); these will be filled with successive chunks\n\
3202of the non-ancillary data until it has all been written or there are\n\
3203no more buffers. The ancbufsize argument sets the size in bytes of\n\
3204the internal buffer used to receive the ancillary data; it defaults to\n\
32050, meaning that no ancillary data will be received. Appropriate\n\
3206buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3207or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3208truncated or discarded. The flags argument defaults to 0 and has the\n\
3209same meaning as for recv().\n\
3210\n\
3211The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3212The nbytes item is the total number of bytes of non-ancillary data\n\
3213written into the buffers. The ancdata item is a list of zero or more\n\
3214tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3215data (control messages) received: cmsg_level and cmsg_type are\n\
3216integers specifying the protocol level and protocol-specific type\n\
3217respectively, and cmsg_data is a bytes object holding the associated\n\
3218data. The msg_flags item is the bitwise OR of various flags\n\
3219indicating conditions on the received message; see your system\n\
3220documentation for details. If the receiving socket is unconnected,\n\
3221address is the address of the sending socket, if available; otherwise,\n\
3222its value is unspecified.\n\
3223\n\
3224If recvmsg_into() raises an exception after the system call returns,\n\
3225it will first attempt to close any file descriptors received via the\n\
3226SCM_RIGHTS mechanism.");
3227#endif /* CMSG_LEN */
3228
3229
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003230/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003231
Guido van Rossum73624e91994-10-10 17:59:00 +00003232static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003233sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003236 Py_ssize_t len, n = -1;
3237 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3241 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 if (!IS_SELECTABLE(s)) {
3244 PyBuffer_Release(&pbuf);
3245 return select_error();
3246 }
3247 buf = pbuf.buf;
3248 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003249
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003250 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003252 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003253 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003254#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003255 if (len > INT_MAX)
3256 len = INT_MAX;
3257 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003258#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003260#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003264 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 PyErr_SetString(socket_timeout, "timed out");
3266 return NULL;
3267 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003268 END_SELECT_LOOP(s)
3269
3270 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 if (n < 0)
3272 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003273 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003274}
3275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003276PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003277"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003278\n\
3279Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003280argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003281sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003282
3283
3284/* s.sendall(data [,flags]) method */
3285
3286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003287sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003290 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003291 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3295 return NULL;
3296 buf = pbuf.buf;
3297 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 if (!IS_SELECTABLE(s)) {
3300 PyBuffer_Release(&pbuf);
3301 return select_error();
3302 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003305 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 timeout = internal_select(s, 1);
3307 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003308 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003309#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003310 if (len > INT_MAX)
3311 len = INT_MAX;
3312 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003313#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003314 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003316 }
3317 Py_END_ALLOW_THREADS
3318 if (timeout == 1) {
3319 PyBuffer_Release(&pbuf);
3320 PyErr_SetString(socket_timeout, "timed out");
3321 return NULL;
3322 }
3323 /* PyErr_CheckSignals() might change errno */
3324 saved_errno = errno;
3325 /* We must run our signal handlers before looping again.
3326 send() can return a successful partial write when it is
3327 interrupted, so we can't restrict ourselves to EINTR. */
3328 if (PyErr_CheckSignals()) {
3329 PyBuffer_Release(&pbuf);
3330 return NULL;
3331 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003333 /* If interrupted, try again */
3334 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003336 else
3337 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 }
3339 buf += n;
3340 len -= n;
3341 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 if (n < 0)
3345 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 Py_INCREF(Py_None);
3348 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003349}
3350
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003351PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003352"sendall(data[, flags])\n\
3353\n\
3354Send a data string to the socket. For the optional flags\n\
3355argument, see the Unix manual. This calls send() repeatedly\n\
3356until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003357to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003358
Guido van Rossum30a685f1991-06-27 15:51:29 +00003359
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003360/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003361
Guido van Rossum73624e91994-10-10 17:59:00 +00003362static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003363sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 Py_buffer pbuf;
3366 PyObject *addro;
3367 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003368 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 sock_addr_t addrbuf;
3370 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003373 arglen = PyTuple_Size(args);
3374 switch (arglen) {
3375 case 2:
3376 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3377 break;
3378 case 3:
3379 PyArg_ParseTuple(args, "y*iO:sendto",
3380 &pbuf, &flags, &addro);
3381 break;
3382 default:
3383 PyErr_Format(PyExc_TypeError,
3384 "sendto() takes 2 or 3 arguments (%d given)",
3385 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003386 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003388 if (PyErr_Occurred())
3389 return NULL;
3390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 buf = pbuf.buf;
3392 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 if (!IS_SELECTABLE(s)) {
3395 PyBuffer_Release(&pbuf);
3396 return select_error();
3397 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3400 PyBuffer_Release(&pbuf);
3401 return NULL;
3402 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003403
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003404 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003406 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003407 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003408#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003409 if (len > INT_MAX)
3410 len = INT_MAX;
3411 n = sendto(s->sock_fd, buf, (int)len, flags,
3412 SAS2SA(&addrbuf), addrlen);
3413#else
3414 n = sendto(s->sock_fd, buf, len, flags,
3415 SAS2SA(&addrbuf), addrlen);
3416#endif
3417 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003421 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 PyErr_SetString(socket_timeout, "timed out");
3423 return NULL;
3424 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003425 END_SELECT_LOOP(s)
3426 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 if (n < 0)
3428 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003429 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003430}
3431
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003432PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003433"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003434\n\
3435Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003436For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003437
Guido van Rossum30a685f1991-06-27 15:51:29 +00003438
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003439/* The sendmsg() and recvmsg[_into]() methods require a working
3440 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3441#ifdef CMSG_LEN
3442/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3443
3444static PyObject *
3445sock_sendmsg(PySocketSockObject *s, PyObject *args)
3446{
3447 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3448 Py_buffer *databufs = NULL;
3449 struct iovec *iovs = NULL;
3450 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003451 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 struct cmsginfo {
3453 int level;
3454 int type;
3455 Py_buffer data;
3456 } *cmsgs = NULL;
3457 void *controlbuf = NULL;
3458 size_t controllen, controllen_last;
3459 ssize_t bytes_sent = -1;
3460 int addrlen, timeout, flags = 0;
3461 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3462 *cmsg_fast = NULL, *retval = NULL;
3463
3464 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3465 &data_arg, &cmsg_arg, &flags, &addr_arg))
3466 return NULL;
3467
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468 /* Parse destination address. */
3469 if (addr_arg != NULL && addr_arg != Py_None) {
3470 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3471 goto finally;
3472 msg.msg_name = &addrbuf;
3473 msg.msg_namelen = addrlen;
3474 }
3475
3476 /* Fill in an iovec for each message part, and save the Py_buffer
3477 structs to release afterwards. */
3478 if ((data_fast = PySequence_Fast(data_arg,
3479 "sendmsg() argument 1 must be an "
3480 "iterable")) == NULL)
3481 goto finally;
3482 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3483 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003484 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003485 goto finally;
3486 }
3487 msg.msg_iovlen = ndataparts;
3488 if (ndataparts > 0 &&
3489 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3490 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3491 PyErr_NoMemory();
3492 goto finally;
3493 }
3494 for (; ndatabufs < ndataparts; ndatabufs++) {
3495 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3496 "y*;sendmsg() argument 1 must be an iterable of "
3497 "buffer-compatible objects",
3498 &databufs[ndatabufs]))
3499 goto finally;
3500 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3501 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3502 }
3503
3504 if (cmsg_arg == NULL)
3505 ncmsgs = 0;
3506 else {
3507 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3508 "sendmsg() argument 2 must be an "
3509 "iterable")) == NULL)
3510 goto finally;
3511 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3512 }
3513
3514#ifndef CMSG_SPACE
3515 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003516 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 "sending multiple control messages is not supported "
3518 "on this system");
3519 goto finally;
3520 }
3521#endif
3522 /* Save level, type and Py_buffer for each control message,
3523 and calculate total size. */
3524 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3525 PyErr_NoMemory();
3526 goto finally;
3527 }
3528 controllen = controllen_last = 0;
3529 while (ncmsgbufs < ncmsgs) {
3530 size_t bufsize, space;
3531
3532 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3533 "(iiy*):[sendmsg() ancillary data items]",
3534 &cmsgs[ncmsgbufs].level,
3535 &cmsgs[ncmsgbufs].type,
3536 &cmsgs[ncmsgbufs].data))
3537 goto finally;
3538 bufsize = cmsgs[ncmsgbufs++].data.len;
3539
3540#ifdef CMSG_SPACE
3541 if (!get_CMSG_SPACE(bufsize, &space)) {
3542#else
3543 if (!get_CMSG_LEN(bufsize, &space)) {
3544#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003545 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003546 goto finally;
3547 }
3548 controllen += space;
3549 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003550 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003551 goto finally;
3552 }
3553 controllen_last = controllen;
3554 }
3555
3556 /* Construct ancillary data block from control message info. */
3557 if (ncmsgbufs > 0) {
3558 struct cmsghdr *cmsgh = NULL;
3559
3560 if ((msg.msg_control = controlbuf =
3561 PyMem_Malloc(controllen)) == NULL) {
3562 PyErr_NoMemory();
3563 goto finally;
3564 }
3565 msg.msg_controllen = controllen;
3566
3567 /* Need to zero out the buffer as a workaround for glibc's
3568 CMSG_NXTHDR() implementation. After getting the pointer to
3569 the next header, it checks its (uninitialized) cmsg_len
3570 member to see if the "message" fits in the buffer, and
3571 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003572 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003573 memset(controlbuf, 0, controllen);
3574
3575 for (i = 0; i < ncmsgbufs; i++) {
3576 size_t msg_len, data_len = cmsgs[i].data.len;
3577 int enough_space = 0;
3578
3579 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3580 if (cmsgh == NULL) {
3581 PyErr_Format(PyExc_RuntimeError,
3582 "unexpected NULL result from %s()",
3583 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3584 goto finally;
3585 }
3586 if (!get_CMSG_LEN(data_len, &msg_len)) {
3587 PyErr_SetString(PyExc_RuntimeError,
3588 "item size out of range for CMSG_LEN()");
3589 goto finally;
3590 }
3591 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3592 size_t space;
3593
3594 cmsgh->cmsg_len = msg_len;
3595 if (get_cmsg_data_space(&msg, cmsgh, &space))
3596 enough_space = (space >= data_len);
3597 }
3598 if (!enough_space) {
3599 PyErr_SetString(PyExc_RuntimeError,
3600 "ancillary data does not fit in calculated "
3601 "space");
3602 goto finally;
3603 }
3604 cmsgh->cmsg_level = cmsgs[i].level;
3605 cmsgh->cmsg_type = cmsgs[i].type;
3606 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3607 }
3608 }
3609
3610 /* Make the system call. */
3611 if (!IS_SELECTABLE(s)) {
3612 select_error();
3613 goto finally;
3614 }
3615
3616 BEGIN_SELECT_LOOP(s)
3617 Py_BEGIN_ALLOW_THREADS;
3618 timeout = internal_select_ex(s, 1, interval);
3619 if (!timeout)
3620 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3621 Py_END_ALLOW_THREADS;
3622 if (timeout == 1) {
3623 PyErr_SetString(socket_timeout, "timed out");
3624 goto finally;
3625 }
3626 END_SELECT_LOOP(s)
3627
3628 if (bytes_sent < 0) {
3629 s->errorhandler();
3630 goto finally;
3631 }
3632 retval = PyLong_FromSsize_t(bytes_sent);
3633
3634finally:
3635 PyMem_Free(controlbuf);
3636 for (i = 0; i < ncmsgbufs; i++)
3637 PyBuffer_Release(&cmsgs[i].data);
3638 PyMem_Free(cmsgs);
3639 Py_XDECREF(cmsg_fast);
3640 for (i = 0; i < ndatabufs; i++)
3641 PyBuffer_Release(&databufs[i]);
3642 PyMem_Free(databufs);
3643 PyMem_Free(iovs);
3644 Py_XDECREF(data_fast);
3645 return retval;
3646}
3647
3648PyDoc_STRVAR(sendmsg_doc,
3649"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3650\n\
3651Send normal and ancillary data to the socket, gathering the\n\
3652non-ancillary data from a series of buffers and concatenating it into\n\
3653a single message. The buffers argument specifies the non-ancillary\n\
3654data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3655The ancdata argument specifies the ancillary data (control messages)\n\
3656as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3657cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3658protocol level and protocol-specific type respectively, and cmsg_data\n\
3659is a buffer-compatible object holding the associated data. The flags\n\
3660argument defaults to 0 and has the same meaning as for send(). If\n\
3661address is supplied and not None, it sets a destination address for\n\
3662the message. The return value is the number of bytes of non-ancillary\n\
3663data sent.");
3664#endif /* CMSG_LEN */
3665
3666
Guido van Rossum30a685f1991-06-27 15:51:29 +00003667/* s.shutdown(how) method */
3668
Guido van Rossum73624e91994-10-10 17:59:00 +00003669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003670sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 int how;
3673 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003674
Serhiy Storchaka78980432013-01-15 01:12:17 +02003675 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 if (how == -1 && PyErr_Occurred())
3677 return NULL;
3678 Py_BEGIN_ALLOW_THREADS
3679 res = shutdown(s->sock_fd, how);
3680 Py_END_ALLOW_THREADS
3681 if (res < 0)
3682 return s->errorhandler();
3683 Py_INCREF(Py_None);
3684 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003685}
3686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003687PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003688"shutdown(flag)\n\
3689\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003690Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3691of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003692
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003693#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003694static PyObject*
3695sock_ioctl(PySocketSockObject *s, PyObject *arg)
3696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 unsigned long cmd = SIO_RCVALL;
3698 PyObject *argO;
3699 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3702 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003704 switch (cmd) {
3705 case SIO_RCVALL: {
3706 unsigned int option = RCVALL_ON;
3707 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3708 return NULL;
3709 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3710 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3711 return set_error();
3712 }
3713 return PyLong_FromUnsignedLong(recv); }
3714 case SIO_KEEPALIVE_VALS: {
3715 struct tcp_keepalive ka;
3716 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3717 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3718 return NULL;
3719 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3720 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3721 return set_error();
3722 }
3723 return PyLong_FromUnsignedLong(recv); }
3724 default:
3725 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3726 return NULL;
3727 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003728}
3729PyDoc_STRVAR(sock_ioctl_doc,
3730"ioctl(cmd, option) -> long\n\
3731\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003732Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3733SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3734SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003735#endif
3736
3737#if defined(MS_WINDOWS)
3738static PyObject*
3739sock_share(PySocketSockObject *s, PyObject *arg)
3740{
3741 WSAPROTOCOL_INFO info;
3742 DWORD processId;
3743 int result;
3744
3745 if (!PyArg_ParseTuple(arg, "I", &processId))
3746 return NULL;
3747
3748 Py_BEGIN_ALLOW_THREADS
3749 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3750 Py_END_ALLOW_THREADS
3751 if (result == SOCKET_ERROR)
3752 return set_error();
3753 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3754}
3755PyDoc_STRVAR(sock_share_doc,
3756"share(process_id) -> bytes\n\
3757\n\
3758Share the socket with another process. The target process id\n\
3759must be provided and the resulting bytes object passed to the target\n\
3760process. There the shared socket can be instantiated by calling\n\
3761socket.fromshare().");
3762
Christian Heimesfaf2f632008-01-06 16:59:19 +00003763
3764#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003765
3766/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003767
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003768static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3770 accept_doc},
3771 {"bind", (PyCFunction)sock_bind, METH_O,
3772 bind_doc},
3773 {"close", (PyCFunction)sock_close, METH_NOARGS,
3774 close_doc},
3775 {"connect", (PyCFunction)sock_connect, METH_O,
3776 connect_doc},
3777 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3778 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003779 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3780 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003781 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3782 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003783#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003784 {"getpeername", (PyCFunction)sock_getpeername,
3785 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 {"getsockname", (PyCFunction)sock_getsockname,
3788 METH_NOARGS, getsockname_doc},
3789 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3790 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003791#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3793 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003794#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003795#if defined(MS_WINDOWS)
3796 {"share", (PyCFunction)sock_share, METH_VARARGS,
3797 sock_share_doc},
3798#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003799 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 listen_doc},
3801 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3802 recv_doc},
3803 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3804 recv_into_doc},
3805 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3806 recvfrom_doc},
3807 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3808 recvfrom_into_doc},
3809 {"send", (PyCFunction)sock_send, METH_VARARGS,
3810 send_doc},
3811 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3812 sendall_doc},
3813 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3814 sendto_doc},
3815 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3816 setblocking_doc},
3817 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3818 settimeout_doc},
3819 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3820 gettimeout_doc},
3821 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3822 setsockopt_doc},
3823 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3824 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003825#ifdef CMSG_LEN
3826 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3827 recvmsg_doc},
3828 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3829 recvmsg_into_doc,},
3830 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3831 sendmsg_doc},
3832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003834};
3835
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003836/* SockObject members */
3837static PyMemberDef sock_memberlist[] = {
3838 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3839 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3840 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3841 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3842 {0},
3843};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003844
Guido van Rossum73624e91994-10-10 17:59:00 +00003845/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003846 First close the file description. */
3847
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003848static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003849sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003850{
Antoine Pitroue033e062010-10-29 10:38:18 +00003851 if (s->sock_fd != -1) {
3852 PyObject *exc, *val, *tb;
3853 Py_ssize_t old_refcount = Py_REFCNT(s);
3854 ++Py_REFCNT(s);
3855 PyErr_Fetch(&exc, &val, &tb);
3856 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3857 "unclosed %R", s))
3858 /* Spurious errors can appear at shutdown */
3859 if (PyErr_ExceptionMatches(PyExc_Warning))
3860 PyErr_WriteUnraisable((PyObject *) s);
3861 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003863 Py_REFCNT(s) = old_refcount;
3864 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003866}
3867
Guido van Rossum30a685f1991-06-27 15:51:29 +00003868
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003869static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003870sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003871{
Victor Stinnere254e532014-07-26 14:36:55 +02003872 long sock_fd;
3873 /* On Windows, this test is needed because SOCKET_T is unsigned */
3874 if (s->sock_fd == INVALID_SOCKET) {
3875 sock_fd = -1;
3876 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003877#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02003878 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 /* this can occur on Win64, and actually there is a special
3880 ugly printf formatter for decimal pointer length integer
3881 printing, only bother if necessary*/
3882 PyErr_SetString(PyExc_OverflowError,
3883 "no printf formatter to display "
3884 "the socket descriptor in decimal");
3885 return NULL;
3886 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003887#endif
Victor Stinnere254e532014-07-26 14:36:55 +02003888 else
3889 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003890 return PyUnicode_FromFormat(
3891 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02003892 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003893 s->sock_type,
3894 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003895}
3896
3897
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003898/* Create a new, uninitialized socket object. */
3899
3900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003901sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 new = type->tp_alloc(type, 0);
3906 if (new != NULL) {
3907 ((PySocketSockObject *)new)->sock_fd = -1;
3908 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3909 ((PySocketSockObject *)new)->errorhandler = &set_error;
3910 }
3911 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003912}
3913
3914
3915/* Initialize a new socket object. */
3916
Victor Stinnerdaf45552013-08-28 00:53:59 +02003917#ifdef SOCK_CLOEXEC
3918/* socket() and socketpair() fail with EINVAL on Linux kernel older
3919 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3920static int sock_cloexec_works = -1;
3921#endif
3922
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003923/*ARGSUSED*/
3924static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003925sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 PySocketSockObject *s = (PySocketSockObject *)self;
3928 PyObject *fdobj = NULL;
3929 SOCKET_T fd = INVALID_SOCKET;
3930 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3931 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003932#ifndef MS_WINDOWS
3933#ifdef SOCK_CLOEXEC
3934 int *atomic_flag_works = &sock_cloexec_works;
3935#else
3936 int *atomic_flag_works = NULL;
3937#endif
3938#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3941 "|iiiO:socket", keywords,
3942 &family, &type, &proto, &fdobj))
3943 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003946#ifdef MS_WINDOWS
3947 /* recreate a socket that was duplicated */
3948 if (PyBytes_Check(fdobj)) {
3949 WSAPROTOCOL_INFO info;
3950 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3951 PyErr_Format(PyExc_ValueError,
3952 "socket descriptor string has wrong size, "
3953 "should be %zu bytes.", sizeof(info));
3954 return -1;
3955 }
3956 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3957 Py_BEGIN_ALLOW_THREADS
3958 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3959 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3960 Py_END_ALLOW_THREADS
3961 if (fd == INVALID_SOCKET) {
3962 set_error();
3963 return -1;
3964 }
3965 family = info.iAddressFamily;
3966 type = info.iSocketType;
3967 proto = info.iProtocol;
3968 }
3969 else
3970#endif
3971 {
3972 fd = PyLong_AsSocket_t(fdobj);
3973 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3974 return -1;
3975 if (fd == INVALID_SOCKET) {
3976 PyErr_SetString(PyExc_ValueError,
3977 "can't use invalid socket value");
3978 return -1;
3979 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 }
3981 }
3982 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02003983#ifdef MS_WINDOWS
3984 /* Windows implementation */
3985#ifndef WSA_FLAG_NO_HANDLE_INHERIT
3986#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
3987#endif
3988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02003990 if (support_wsa_no_inherit) {
3991 fd = WSASocket(family, type, proto,
3992 NULL, 0,
3993 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
3994 if (fd == INVALID_SOCKET) {
3995 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
3996 support_wsa_no_inherit = 0;
3997 fd = socket(family, type, proto);
3998 }
3999 }
4000 else {
4001 fd = socket(family, type, proto);
4002 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004005 if (fd == INVALID_SOCKET) {
4006 set_error();
4007 return -1;
4008 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004009
4010 if (!support_wsa_no_inherit) {
4011 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4012 closesocket(fd);
4013 PyErr_SetFromWindowsErr(0);
4014 return -1;
4015 }
4016 }
4017#else
4018 /* UNIX */
4019 Py_BEGIN_ALLOW_THREADS
4020#ifdef SOCK_CLOEXEC
4021 if (sock_cloexec_works != 0) {
4022 fd = socket(family, type | SOCK_CLOEXEC, proto);
4023 if (sock_cloexec_works == -1) {
4024 if (fd >= 0) {
4025 sock_cloexec_works = 1;
4026 }
4027 else if (errno == EINVAL) {
4028 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4029 sock_cloexec_works = 0;
4030 fd = socket(family, type, proto);
4031 }
4032 }
4033 }
4034 else
4035#endif
4036 {
4037 fd = socket(family, type, proto);
4038 }
4039 Py_END_ALLOW_THREADS
4040
4041 if (fd == INVALID_SOCKET) {
4042 set_error();
4043 return -1;
4044 }
4045
4046 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4047 SOCKETCLOSE(fd);
4048 return -1;
4049 }
4050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 }
4052 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004055
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004056}
4057
4058
Guido van Rossumb6775db1994-08-01 11:34:53 +00004059/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004060
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004061static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4063 "_socket.socket", /* tp_name */
4064 sizeof(PySocketSockObject), /* tp_basicsize */
4065 0, /* tp_itemsize */
4066 (destructor)sock_dealloc, /* tp_dealloc */
4067 0, /* tp_print */
4068 0, /* tp_getattr */
4069 0, /* tp_setattr */
4070 0, /* tp_reserved */
4071 (reprfunc)sock_repr, /* tp_repr */
4072 0, /* tp_as_number */
4073 0, /* tp_as_sequence */
4074 0, /* tp_as_mapping */
4075 0, /* tp_hash */
4076 0, /* tp_call */
4077 0, /* tp_str */
4078 PyObject_GenericGetAttr, /* tp_getattro */
4079 0, /* tp_setattro */
4080 0, /* tp_as_buffer */
4081 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4082 sock_doc, /* tp_doc */
4083 0, /* tp_traverse */
4084 0, /* tp_clear */
4085 0, /* tp_richcompare */
4086 0, /* tp_weaklistoffset */
4087 0, /* tp_iter */
4088 0, /* tp_iternext */
4089 sock_methods, /* tp_methods */
4090 sock_memberlist, /* tp_members */
4091 0, /* tp_getset */
4092 0, /* tp_base */
4093 0, /* tp_dict */
4094 0, /* tp_descr_get */
4095 0, /* tp_descr_set */
4096 0, /* tp_dictoffset */
4097 sock_initobj, /* tp_init */
4098 PyType_GenericAlloc, /* tp_alloc */
4099 sock_new, /* tp_new */
4100 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004101};
4102
Guido van Rossum30a685f1991-06-27 15:51:29 +00004103
Guido van Rossum81194471991-07-27 21:42:02 +00004104/* Python interface to gethostname(). */
4105
4106/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004107static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004108socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004109{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004110#ifdef MS_WINDOWS
4111 /* Don't use winsock's gethostname, as this returns the ANSI
4112 version of the hostname, whereas we need a Unicode string.
4113 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004114 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004115 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004116 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004117 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004118
4119 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004120 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004121
4122 if (GetLastError() != ERROR_MORE_DATA)
4123 return PyErr_SetFromWindowsErr(0);
4124
4125 if (size == 0)
4126 return PyUnicode_New(0, 0);
4127
4128 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4129 names */
4130 name = PyMem_Malloc(size * sizeof(wchar_t));
4131 if (!name)
4132 return NULL;
4133 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4134 name,
4135 &size))
4136 {
4137 PyMem_Free(name);
4138 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004139 }
Victor Stinner74168972011-11-17 01:11:36 +01004140
4141 result = PyUnicode_FromWideChar(name, size);
4142 PyMem_Free(name);
4143 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004144#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 char buf[1024];
4146 int res;
4147 Py_BEGIN_ALLOW_THREADS
4148 res = gethostname(buf, (int) sizeof buf - 1);
4149 Py_END_ALLOW_THREADS
4150 if (res < 0)
4151 return set_error();
4152 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004153 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004154#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004155}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004156
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004157PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004158"gethostname() -> string\n\
4159\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004160Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004161
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004162#ifdef HAVE_SETHOSTNAME
4163PyDoc_STRVAR(sethostname_doc,
4164"sethostname(name)\n\n\
4165Sets the hostname to name.");
4166
4167static PyObject *
4168socket_sethostname(PyObject *self, PyObject *args)
4169{
4170 PyObject *hnobj;
4171 Py_buffer buf;
4172 int res, flag = 0;
4173
Christian Heimesd2774c72013-06-19 02:06:29 +02004174#ifdef _AIX
4175/* issue #18259, not declared in any useful header file */
4176extern int sethostname(const char *, size_t);
4177#endif
4178
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004179 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4180 PyErr_Clear();
4181 if (!PyArg_ParseTuple(args, "O&:sethostname",
4182 PyUnicode_FSConverter, &hnobj))
4183 return NULL;
4184 flag = 1;
4185 }
4186 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4187 if (!res) {
4188 res = sethostname(buf.buf, buf.len);
4189 PyBuffer_Release(&buf);
4190 }
4191 if (flag)
4192 Py_DECREF(hnobj);
4193 if (res)
4194 return set_error();
4195 Py_RETURN_NONE;
4196}
4197#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004198
Guido van Rossum30a685f1991-06-27 15:51:29 +00004199/* Python interface to gethostbyname(name). */
4200
4201/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004202static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004203socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 char *name;
4206 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004207 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004208
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004209 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 return NULL;
4211 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004212 goto finally;
4213 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4214finally:
4215 PyMem_Free(name);
4216 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004217}
4218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004219PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004220"gethostbyname(host) -> address\n\
4221\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004222Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004223
4224
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004225/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4226
4227static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004228gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 char **pch;
4231 PyObject *rtn_tuple = (PyObject *)NULL;
4232 PyObject *name_list = (PyObject *)NULL;
4233 PyObject *addr_list = (PyObject *)NULL;
4234 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 if (h == NULL) {
4237 /* Let's get real error message to return */
4238 set_herror(h_errno);
4239 return NULL;
4240 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004242 if (h->h_addrtype != af) {
4243 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004244 errno = EAFNOSUPPORT;
4245 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 return NULL;
4247 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 case AF_INET:
4252 if (alen < sizeof(struct sockaddr_in))
4253 return NULL;
4254 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004255
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004256#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 case AF_INET6:
4258 if (alen < sizeof(struct sockaddr_in6))
4259 return NULL;
4260 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004261#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 if ((name_list = PyList_New(0)) == NULL)
4266 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 if ((addr_list = PyList_New(0)) == NULL)
4269 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 /* SF #1511317: h_aliases can be NULL */
4272 if (h->h_aliases) {
4273 for (pch = h->h_aliases; *pch != NULL; pch++) {
4274 int status;
4275 tmp = PyUnicode_FromString(*pch);
4276 if (tmp == NULL)
4277 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 status = PyList_Append(name_list, tmp);
4280 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 if (status)
4283 goto err;
4284 }
4285 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4288 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 case AF_INET:
4293 {
4294 struct sockaddr_in sin;
4295 memset(&sin, 0, sizeof(sin));
4296 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004297#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4301 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 if (pch == h->h_addr_list && alen >= sizeof(sin))
4304 memcpy((char *) addr, &sin, sizeof(sin));
4305 break;
4306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004307
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004308#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004309 case AF_INET6:
4310 {
4311 struct sockaddr_in6 sin6;
4312 memset(&sin6, 0, sizeof(sin6));
4313 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004314#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4318 tmp = makeipaddr((struct sockaddr *)&sin6,
4319 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4322 memcpy((char *) addr, &sin6, sizeof(sin6));
4323 break;
4324 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004325#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004328 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 "unsupported address family");
4330 return NULL;
4331 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 if (tmp == NULL)
4334 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 status = PyList_Append(addr_list, tmp);
4337 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 if (status)
4340 goto err;
4341 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004344
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004345 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 Py_XDECREF(name_list);
4347 Py_XDECREF(addr_list);
4348 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004349}
4350
4351
4352/* Python interface to gethostbyname_ex(name). */
4353
4354/*ARGSUSED*/
4355static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004356socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 char *name;
4359 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004360 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004362 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004363#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004365#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004367#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 char buf[16384];
4369 int buf_len = (sizeof buf) - 1;
4370 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004371#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004372#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004374#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004375#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004376
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004377 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004378 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004379 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004380 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004382#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004383#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004384 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004386#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004388#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 memset((void *) &data, '\0', sizeof(data));
4390 result = gethostbyname_r(name, &hp_allocated, &data);
4391 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004392#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004393#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004394#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004398#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 Py_END_ALLOW_THREADS
4400 /* Some C libraries would require addr.__ss_family instead of
4401 addr.ss_family.
4402 Therefore, we cast the sockaddr_storage into sockaddr to
4403 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004404 sa = SAS2SA(&addr);
4405 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004406 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004407#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004409#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004410finally:
4411 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004413}
4414
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004415PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004416"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4417\n\
4418Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004419for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004420
4421
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004422/* Python interface to gethostbyaddr(IP). */
4423
4424/*ARGSUSED*/
4425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004426socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004427{
Charles-François Natali8b759652011-12-23 16:44:51 +01004428 sock_addr_t addr;
4429 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 char *ip_num;
4431 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004432 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004433#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004435#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004437#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 /* glibcs up to 2.10 assume that the buf argument to
4439 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4440 does not ensure. The attribute below instructs the compiler
4441 to maintain this alignment. */
4442 char buf[16384] Py_ALIGNED(8);
4443 int buf_len = (sizeof buf) - 1;
4444 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004445#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004446#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004448#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004449#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 char *ap;
4451 int al;
4452 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004453
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004454 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 return NULL;
4456 af = AF_UNSPEC;
4457 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004458 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 af = sa->sa_family;
4460 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004461 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 switch (af) {
4463 case AF_INET:
4464 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4465 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4466 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004467#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 case AF_INET6:
4469 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4470 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4471 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004474 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004475 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 }
4477 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004478#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004479#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004480 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 &hp_allocated, buf, buf_len,
4482 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004483#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 h = gethostbyaddr_r(ap, al, af,
4485 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004486#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 memset((void *) &data, '\0', sizeof(data));
4488 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4489 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004490#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004491#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004492#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004496#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004498 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004499#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004501#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004502finally:
4503 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004505}
4506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004507PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004508"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4509\n\
4510Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004511for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004512
Guido van Rossum30a685f1991-06-27 15:51:29 +00004513
4514/* Python interface to getservbyname(name).
4515 This only returns the port number, since the other info is already
4516 known or not useful (like the list of aliases). */
4517
4518/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004520socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 char *name, *proto=NULL;
4523 struct servent *sp;
4524 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4525 return NULL;
4526 Py_BEGIN_ALLOW_THREADS
4527 sp = getservbyname(name, proto);
4528 Py_END_ALLOW_THREADS
4529 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004530 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 return NULL;
4532 }
4533 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004534}
4535
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004536PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004537"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004538\n\
4539Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004540The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4541otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004542
Guido van Rossum30a685f1991-06-27 15:51:29 +00004543
Barry Warsaw11b91a02004-06-28 00:50:43 +00004544/* Python interface to getservbyport(port).
4545 This only returns the service name, since the other info is already
4546 known or not useful (like the list of aliases). */
4547
4548/*ARGSUSED*/
4549static PyObject *
4550socket_getservbyport(PyObject *self, PyObject *args)
4551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 int port;
4553 char *proto=NULL;
4554 struct servent *sp;
4555 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4556 return NULL;
4557 if (port < 0 || port > 0xffff) {
4558 PyErr_SetString(
4559 PyExc_OverflowError,
4560 "getservbyport: port must be 0-65535.");
4561 return NULL;
4562 }
4563 Py_BEGIN_ALLOW_THREADS
4564 sp = getservbyport(htons((short)port), proto);
4565 Py_END_ALLOW_THREADS
4566 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004567 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 return NULL;
4569 }
4570 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004571}
4572
4573PyDoc_STRVAR(getservbyport_doc,
4574"getservbyport(port[, protocolname]) -> string\n\
4575\n\
4576Return the service name from a port number and protocol name.\n\
4577The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4578otherwise any protocol will match.");
4579
Guido van Rossum3901d851996-12-19 16:35:04 +00004580/* Python interface to getprotobyname(name).
4581 This only returns the protocol number, since the other info is
4582 already known or not useful (like the list of aliases). */
4583
4584/*ARGSUSED*/
4585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004586socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 char *name;
4589 struct protoent *sp;
4590 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4591 return NULL;
4592 Py_BEGIN_ALLOW_THREADS
4593 sp = getprotobyname(name);
4594 Py_END_ALLOW_THREADS
4595 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004596 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 return NULL;
4598 }
4599 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004600}
4601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004602PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004603"getprotobyname(name) -> integer\n\
4604\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004605Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606
Guido van Rossum3901d851996-12-19 16:35:04 +00004607
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004608#ifndef NO_DUP
4609/* dup() function for socket fds */
4610
4611static PyObject *
4612socket_dup(PyObject *self, PyObject *fdobj)
4613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 SOCKET_T fd, newfd;
4615 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004616#ifdef MS_WINDOWS
4617 WSAPROTOCOL_INFO info;
4618#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 fd = PyLong_AsSocket_t(fdobj);
4621 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4622 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004623
Victor Stinnerdaf45552013-08-28 00:53:59 +02004624#ifdef MS_WINDOWS
4625 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4626 return set_error();
4627
4628 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4629 FROM_PROTOCOL_INFO,
4630 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 if (newfd == INVALID_SOCKET)
4632 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004633
Victor Stinnerdaf45552013-08-28 00:53:59 +02004634 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4635 closesocket(newfd);
4636 PyErr_SetFromWindowsErr(0);
4637 return NULL;
4638 }
4639#else
4640 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4641 newfd = _Py_dup(fd);
4642 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004643 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004644#endif
4645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 newfdobj = PyLong_FromSocket_t(newfd);
4647 if (newfdobj == NULL)
4648 SOCKETCLOSE(newfd);
4649 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004650}
4651
4652PyDoc_STRVAR(dup_doc,
4653"dup(integer) -> integer\n\
4654\n\
4655Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4656sockets; on some platforms os.dup() won't work for socket file descriptors.");
4657#endif
4658
4659
Dave Cole331708b2004-08-09 04:51:41 +00004660#ifdef HAVE_SOCKETPAIR
4661/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004662 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004663 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004664
4665/*ARGSUSED*/
4666static PyObject *
4667socket_socketpair(PyObject *self, PyObject *args)
4668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 PySocketSockObject *s0 = NULL, *s1 = NULL;
4670 SOCKET_T sv[2];
4671 int family, type = SOCK_STREAM, proto = 0;
4672 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004673#ifdef SOCK_CLOEXEC
4674 int *atomic_flag_works = &sock_cloexec_works;
4675#else
4676 int *atomic_flag_works = NULL;
4677#endif
4678 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004679
4680#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004682#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4686 &family, &type, &proto))
4687 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004690 Py_BEGIN_ALLOW_THREADS
4691#ifdef SOCK_CLOEXEC
4692 if (sock_cloexec_works != 0) {
4693 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4694 if (sock_cloexec_works == -1) {
4695 if (ret >= 0) {
4696 sock_cloexec_works = 1;
4697 }
4698 else if (errno == EINVAL) {
4699 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4700 sock_cloexec_works = 0;
4701 ret = socketpair(family, type, proto, sv);
4702 }
4703 }
4704 }
4705 else
4706#endif
4707 {
4708 ret = socketpair(family, type, proto, sv);
4709 }
4710 Py_END_ALLOW_THREADS
4711
4712 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004714
4715 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4716 goto finally;
4717 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4718 goto finally;
4719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 s0 = new_sockobject(sv[0], family, type, proto);
4721 if (s0 == NULL)
4722 goto finally;
4723 s1 = new_sockobject(sv[1], family, type, proto);
4724 if (s1 == NULL)
4725 goto finally;
4726 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004727
4728finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 if (res == NULL) {
4730 if (s0 == NULL)
4731 SOCKETCLOSE(sv[0]);
4732 if (s1 == NULL)
4733 SOCKETCLOSE(sv[1]);
4734 }
4735 Py_XDECREF(s0);
4736 Py_XDECREF(s1);
4737 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004738}
4739
4740PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004741"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004742\n\
4743Create a pair of socket objects from the sockets returned by the platform\n\
4744socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004745The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004746AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004747
4748#endif /* HAVE_SOCKETPAIR */
4749
4750
Guido van Rossum006bf911996-06-12 04:04:55 +00004751static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004752socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4757 return NULL;
4758 }
4759 if (x1 < 0) {
4760 PyErr_SetString(PyExc_OverflowError,
4761 "can't convert negative number to unsigned long");
4762 return NULL;
4763 }
4764 x2 = (unsigned int)ntohs((unsigned short)x1);
4765 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004766}
4767
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004768PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004769"ntohs(integer) -> integer\n\
4770\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004771Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004772
4773
Guido van Rossum006bf911996-06-12 04:04:55 +00004774static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004775socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 if (PyLong_Check(arg)) {
4780 x = PyLong_AsUnsignedLong(arg);
4781 if (x == (unsigned long) -1 && PyErr_Occurred())
4782 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004783#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 {
4785 unsigned long y;
4786 /* only want the trailing 32 bits */
4787 y = x & 0xFFFFFFFFUL;
4788 if (y ^ x)
4789 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004790 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 x = y;
4792 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 }
4795 else
4796 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004797 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004800}
4801
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004802PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004803"ntohl(integer) -> integer\n\
4804\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004805Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004806
4807
Guido van Rossum006bf911996-06-12 04:04:55 +00004808static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004809socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4814 return NULL;
4815 }
4816 if (x1 < 0) {
4817 PyErr_SetString(PyExc_OverflowError,
4818 "can't convert negative number to unsigned long");
4819 return NULL;
4820 }
4821 x2 = (unsigned int)htons((unsigned short)x1);
4822 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004823}
4824
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004825PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004826"htons(integer) -> integer\n\
4827\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004828Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004829
4830
Guido van Rossum006bf911996-06-12 04:04:55 +00004831static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004832socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 if (PyLong_Check(arg)) {
4837 x = PyLong_AsUnsignedLong(arg);
4838 if (x == (unsigned long) -1 && PyErr_Occurred())
4839 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004840#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 {
4842 unsigned long y;
4843 /* only want the trailing 32 bits */
4844 y = x & 0xFFFFFFFFUL;
4845 if (y ^ x)
4846 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004847 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 x = y;
4849 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 }
4852 else
4853 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004854 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 Py_TYPE(arg)->tp_name);
4856 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004857}
4858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004859PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004860"htonl(integer) -> integer\n\
4861\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004862Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004863
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004864/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004866PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004867"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004868\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004869Convert 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 +00004870binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004871
4872static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004873socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004874{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004875#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004877#endif
4878
4879#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004880#if (SIZEOF_INT != 4)
4881#error "Not sure if in_addr_t exists and int is not 32-bits."
4882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 /* Have to use inet_addr() instead */
4884 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4889 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004890
Tim Peters1df9fdd2003-02-13 03:13:40 +00004891
4892#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004893
4894#ifdef USE_INET_ATON_WEAKLINK
4895 if (inet_aton != NULL) {
4896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 if (inet_aton(ip_addr, &buf))
4898 return PyBytes_FromStringAndSize((char *)(&buf),
4899 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004900
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004901 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 "illegal IP address string passed to inet_aton");
4903 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004904
Thomas Wouters477c8d52006-05-27 19:21:47 +00004905#ifdef USE_INET_ATON_WEAKLINK
4906 } else {
4907#endif
4908
4909#endif
4910
4911#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 /* special-case this address as inet_addr might return INADDR_NONE
4914 * for this */
4915 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004916 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004922 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 "illegal IP address string passed to inet_aton");
4924 return NULL;
4925 }
4926 }
4927 return PyBytes_FromStringAndSize((char *) &packed_addr,
4928 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004929
4930#ifdef USE_INET_ATON_WEAKLINK
4931 }
4932#endif
4933
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004934#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004935}
4936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004937PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004938"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004939\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004940Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004941
4942static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004943socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 char *packed_str;
4946 int addr_len;
4947 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4950 return NULL;
4951 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004954 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 "packed IP wrong length for inet_ntoa");
4956 return NULL;
4957 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004962}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004963
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004964#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004965
4966PyDoc_STRVAR(inet_pton_doc,
4967"inet_pton(af, ip) -> packed IP address string\n\
4968\n\
4969Convert an IP address from string format to a packed string suitable\n\
4970for use with low-level network functions.");
4971
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004972#endif
4973
4974#ifdef HAVE_INET_PTON
4975
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004976static PyObject *
4977socket_inet_pton(PyObject *self, PyObject *args)
4978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 int af;
4980 char* ip;
4981 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004982#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02004983 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004984#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4988 return NULL;
4989 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004990
Martin v. Löwis04697e82004-06-02 12:35:29 +00004991#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004992 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004993 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 "can't use AF_INET6, IPv6 is disabled");
4995 return NULL;
4996 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004997#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 retval = inet_pton(af, ip, packed);
5000 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005001 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 return NULL;
5003 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005004 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 "illegal IP address string passed to inet_pton");
5006 return NULL;
5007 } else if (af == AF_INET) {
5008 return PyBytes_FromStringAndSize(packed,
5009 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005010#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 } else if (af == AF_INET6) {
5012 return PyBytes_FromStringAndSize(packed,
5013 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005016 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 return NULL;
5018 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005019}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005020#elif defined(MS_WINDOWS)
5021
5022static PyObject *
5023socket_inet_pton(PyObject *self, PyObject *args)
5024{
5025 int af;
5026 char* ip;
5027 struct sockaddr_in6 addr;
5028 INT ret, size;
5029
5030 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5031 return NULL;
5032 }
5033
Victor Stinnere990c6e2013-11-16 00:18:58 +01005034 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005035 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5036
5037 if (ret) {
5038 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5039 return NULL;
5040 } else if(af == AF_INET) {
5041 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005042 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005043 sizeof(addr4->sin_addr));
5044 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005045 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005046 sizeof(addr.sin6_addr));
5047 } else {
5048 PyErr_SetString(PyExc_OSError, "unknown address family");
5049 return NULL;
5050 }
5051}
5052
5053#endif
5054
5055#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005056
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005057PyDoc_STRVAR(inet_ntop_doc,
5058"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5059\n\
5060Convert a packed IP address of the given family to string format.");
5061
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005062#endif
5063
5064
5065#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005066static PyObject *
5067socket_inet_ntop(PyObject *self, PyObject *args)
5068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 int af;
5070 char* packed;
5071 int len;
5072 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005073#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005074 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005075#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005077#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5080 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5083 return NULL;
5084 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 if (af == AF_INET) {
5087 if (len != sizeof(struct in_addr)) {
5088 PyErr_SetString(PyExc_ValueError,
5089 "invalid length of packed IP address string");
5090 return NULL;
5091 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005092#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 } else if (af == AF_INET6) {
5094 if (len != sizeof(struct in6_addr)) {
5095 PyErr_SetString(PyExc_ValueError,
5096 "invalid length of packed IP address string");
5097 return NULL;
5098 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 } else {
5101 PyErr_Format(PyExc_ValueError,
5102 "unknown address family %d", af);
5103 return NULL;
5104 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 retval = inet_ntop(af, packed, ip, sizeof(ip));
5107 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005108 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 return NULL;
5110 } else {
5111 return PyUnicode_FromString(retval);
5112 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 /* NOTREACHED */
5115 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5116 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005117}
5118
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005119#elif defined(MS_WINDOWS)
5120
5121static PyObject *
5122socket_inet_ntop(PyObject *self, PyObject *args)
5123{
5124 int af;
5125 char* packed;
5126 int len;
5127 struct sockaddr_in6 addr;
5128 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005129#ifdef ENABLE_IPV6
5130 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5131#else
5132 char ip[INET_ADDRSTRLEN + 1];
5133#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005134
5135 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5136 memset((void *) &ip[0], '\0', sizeof(ip));
5137
5138 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5139 return NULL;
5140 }
5141
5142 if (af == AF_INET) {
5143 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5144
5145 if (len != sizeof(struct in_addr)) {
5146 PyErr_SetString(PyExc_ValueError,
5147 "invalid length of packed IP address string");
5148 return NULL;
5149 }
5150 memset(addr4, 0, sizeof(struct sockaddr_in));
5151 addr4->sin_family = AF_INET;
5152 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5153 addrlen = sizeof(struct sockaddr_in);
5154 } else if (af == AF_INET6) {
5155 if (len != sizeof(struct in6_addr)) {
5156 PyErr_SetString(PyExc_ValueError,
5157 "invalid length of packed IP address string");
5158 return NULL;
5159 }
5160
5161 memset(&addr, 0, sizeof(addr));
5162 addr.sin6_family = AF_INET6;
5163 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5164 addrlen = sizeof(addr);
5165 } else {
5166 PyErr_Format(PyExc_ValueError,
5167 "unknown address family %d", af);
5168 return NULL;
5169 }
5170
5171 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005172 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005173 ip, &retlen);
5174
5175 if (ret) {
5176 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5177 return NULL;
5178 } else {
5179 return PyUnicode_FromString(ip);
5180 }
5181}
5182
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005183#endif /* HAVE_INET_PTON */
5184
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005185/* Python interface to getaddrinfo(host, port). */
5186
5187/*ARGSUSED*/
5188static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005189socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005190{
Victor Stinner77af1722011-05-26 14:05:59 +02005191 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005192 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 struct addrinfo hints, *res;
5194 struct addrinfo *res0 = NULL;
5195 PyObject *hobj = NULL;
5196 PyObject *pobj = (PyObject *)NULL;
5197 char pbuf[30];
5198 char *hptr, *pptr;
5199 int family, socktype, protocol, flags;
5200 int error;
5201 PyObject *all = (PyObject *)NULL;
5202 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005203
Georg Brandl6083a4b2013-10-14 06:51:46 +02005204 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005206 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005207 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 &protocol, &flags)) {
5209 return NULL;
5210 }
5211 if (hobj == Py_None) {
5212 hptr = NULL;
5213 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005214 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005215
5216 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 if (!idna)
5218 return NULL;
5219 assert(PyBytes_Check(idna));
5220 hptr = PyBytes_AS_STRING(idna);
5221 } else if (PyBytes_Check(hobj)) {
5222 hptr = PyBytes_AsString(hobj);
5223 } else {
5224 PyErr_SetString(PyExc_TypeError,
5225 "getaddrinfo() argument 1 must be string or None");
5226 return NULL;
5227 }
5228 if (PyLong_CheckExact(pobj)) {
5229 long value = PyLong_AsLong(pobj);
5230 if (value == -1 && PyErr_Occurred())
5231 goto err;
5232 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5233 pptr = pbuf;
5234 } else if (PyUnicode_Check(pobj)) {
5235 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005236 if (pptr == NULL)
5237 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005239 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 } else if (pobj == Py_None) {
5241 pptr = (char *)NULL;
5242 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005243 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 goto err;
5245 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005246#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005247 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5248 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005249 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5250 * This workaround avoids a segfault in libsystem.
5251 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005252 pptr = "00";
5253 }
5254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 memset(&hints, 0, sizeof(hints));
5256 hints.ai_family = family;
5257 hints.ai_socktype = socktype;
5258 hints.ai_protocol = protocol;
5259 hints.ai_flags = flags;
5260 Py_BEGIN_ALLOW_THREADS
5261 ACQUIRE_GETADDRINFO_LOCK
5262 error = getaddrinfo(hptr, pptr, &hints, &res0);
5263 Py_END_ALLOW_THREADS
5264 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5265 if (error) {
5266 set_gaierror(error);
5267 goto err;
5268 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 if ((all = PyList_New(0)) == NULL)
5271 goto err;
5272 for (res = res0; res; res = res->ai_next) {
5273 PyObject *single;
5274 PyObject *addr =
5275 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5276 if (addr == NULL)
5277 goto err;
5278 single = Py_BuildValue("iiisO", res->ai_family,
5279 res->ai_socktype, res->ai_protocol,
5280 res->ai_canonname ? res->ai_canonname : "",
5281 addr);
5282 Py_DECREF(addr);
5283 if (single == NULL)
5284 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 if (PyList_Append(all, single))
5287 goto err;
5288 Py_XDECREF(single);
5289 }
5290 Py_XDECREF(idna);
5291 if (res0)
5292 freeaddrinfo(res0);
5293 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005294 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 Py_XDECREF(all);
5296 Py_XDECREF(idna);
5297 if (res0)
5298 freeaddrinfo(res0);
5299 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005300}
5301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005302PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005303"getaddrinfo(host, port [, family, type, proto, flags])\n\
5304 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005305\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005306Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005307
5308/* Python interface to getnameinfo(sa, flags). */
5309
5310/*ARGSUSED*/
5311static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005312socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 PyObject *sa = (PyObject *)NULL;
5315 int flags;
5316 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005317 int port;
5318 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5320 struct addrinfo hints, *res = NULL;
5321 int error;
5322 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 flags = flowinfo = scope_id = 0;
5325 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5326 return NULL;
5327 if (!PyTuple_Check(sa)) {
5328 PyErr_SetString(PyExc_TypeError,
5329 "getnameinfo() argument 1 must be a tuple");
5330 return NULL;
5331 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005332 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 &hostp, &port, &flowinfo, &scope_id))
5334 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005335 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005336 PyErr_SetString(PyExc_OverflowError,
5337 "getsockaddrarg: flowinfo must be 0-1048575.");
5338 return NULL;
5339 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5341 memset(&hints, 0, sizeof(hints));
5342 hints.ai_family = AF_UNSPEC;
5343 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005344 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 Py_BEGIN_ALLOW_THREADS
5346 ACQUIRE_GETADDRINFO_LOCK
5347 error = getaddrinfo(hostp, pbuf, &hints, &res);
5348 Py_END_ALLOW_THREADS
5349 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5350 if (error) {
5351 set_gaierror(error);
5352 goto fail;
5353 }
5354 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005355 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 "sockaddr resolved to multiple addresses");
5357 goto fail;
5358 }
5359 switch (res->ai_family) {
5360 case AF_INET:
5361 {
5362 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005363 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 "IPv4 sockaddr must be 2 tuple");
5365 goto fail;
5366 }
5367 break;
5368 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005369#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 case AF_INET6:
5371 {
5372 struct sockaddr_in6 *sin6;
5373 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005374 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 sin6->sin6_scope_id = scope_id;
5376 break;
5377 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005380 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5382 if (error) {
5383 set_gaierror(error);
5384 goto fail;
5385 }
5386 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005387
5388fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 if (res)
5390 freeaddrinfo(res);
5391 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392}
5393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005394PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005395"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005396\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005397Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005399
5400/* Python API to getting and setting the default timeout value. */
5401
5402static PyObject *
5403socket_getdefaulttimeout(PyObject *self)
5404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 if (defaulttimeout < 0.0) {
5406 Py_INCREF(Py_None);
5407 return Py_None;
5408 }
5409 else
5410 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005411}
5412
5413PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005414"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005415\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005416Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005417A value of None indicates that new socket objects have no timeout.\n\
5418When the socket module is first imported, the default is None.");
5419
5420static PyObject *
5421socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 if (arg == Py_None)
5426 timeout = -1.0;
5427 else {
5428 timeout = PyFloat_AsDouble(arg);
5429 if (timeout < 0.0) {
5430 if (!PyErr_Occurred())
5431 PyErr_SetString(PyExc_ValueError,
5432 "Timeout value out of range");
5433 return NULL;
5434 }
5435 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 Py_INCREF(Py_None);
5440 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005441}
5442
5443PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005444"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005445\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005446Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005447A value of None indicates that new socket objects have no timeout.\n\
5448When the socket module is first imported, the default is None.");
5449
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005450#ifdef HAVE_IF_NAMEINDEX
5451/* Python API for getting interface indices and names */
5452
5453static PyObject *
5454socket_if_nameindex(PyObject *self, PyObject *arg)
5455{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005456 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005457 int i;
5458 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005459
Charles-François Natali60713592011-05-20 16:55:06 +02005460 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005461 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005462 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005463 return NULL;
5464 }
5465
5466 list = PyList_New(0);
5467 if (list == NULL) {
5468 if_freenameindex(ni);
5469 return NULL;
5470 }
5471
Charles-François Natali60713592011-05-20 16:55:06 +02005472 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5473 PyObject *ni_tuple = Py_BuildValue("IO&",
5474 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005475
5476 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5477 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005478 Py_DECREF(list);
5479 if_freenameindex(ni);
5480 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005481 }
5482 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005483 }
5484
5485 if_freenameindex(ni);
5486 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005487}
5488
5489PyDoc_STRVAR(if_nameindex_doc,
5490"if_nameindex()\n\
5491\n\
5492Returns a list of network interface information (index, name) tuples.");
5493
Charles-François Natali60713592011-05-20 16:55:06 +02005494static PyObject *
5495socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005496{
Charles-François Natali60713592011-05-20 16:55:06 +02005497 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005498 unsigned long index;
5499
Charles-François Natali60713592011-05-20 16:55:06 +02005500 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5501 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005502 return NULL;
5503
Charles-François Natali60713592011-05-20 16:55:06 +02005504 index = if_nametoindex(PyBytes_AS_STRING(oname));
5505 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005506 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005507 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005508 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005509 return NULL;
5510 }
5511
5512 return PyLong_FromUnsignedLong(index);
5513}
5514
5515PyDoc_STRVAR(if_nametoindex_doc,
5516"if_nametoindex(if_name)\n\
5517\n\
5518Returns the interface index corresponding to the interface name if_name.");
5519
Charles-François Natali60713592011-05-20 16:55:06 +02005520static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005521socket_if_indextoname(PyObject *self, PyObject *arg)
5522{
Charles-François Natali60713592011-05-20 16:55:06 +02005523 unsigned long index;
5524 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005525
Charles-François Natali60713592011-05-20 16:55:06 +02005526 index = PyLong_AsUnsignedLong(arg);
5527 if (index == (unsigned long) -1)
5528 return NULL;
5529
5530 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005531 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005532 return NULL;
5533 }
5534
Charles-François Natali60713592011-05-20 16:55:06 +02005535 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005536}
5537
5538PyDoc_STRVAR(if_indextoname_doc,
5539"if_indextoname(if_index)\n\
5540\n\
5541Returns the interface name corresponding to the interface index if_index.");
5542
5543#endif /* HAVE_IF_NAMEINDEX */
5544
5545
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005546#ifdef CMSG_LEN
5547/* Python interface to CMSG_LEN(length). */
5548
5549static PyObject *
5550socket_CMSG_LEN(PyObject *self, PyObject *args)
5551{
5552 Py_ssize_t length;
5553 size_t result;
5554
5555 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5556 return NULL;
5557 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5558 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5559 return NULL;
5560 }
5561 return PyLong_FromSize_t(result);
5562}
5563
5564PyDoc_STRVAR(CMSG_LEN_doc,
5565"CMSG_LEN(length) -> control message length\n\
5566\n\
5567Return the total length, without trailing padding, of an ancillary\n\
5568data item with associated data of the given length. This value can\n\
5569often be used as the buffer size for recvmsg() to receive a single\n\
5570item of ancillary data, but RFC 3542 requires portable applications to\n\
5571use CMSG_SPACE() and thus include space for padding, even when the\n\
5572item will be the last in the buffer. Raises OverflowError if length\n\
5573is outside the permissible range of values.");
5574
5575
5576#ifdef CMSG_SPACE
5577/* Python interface to CMSG_SPACE(length). */
5578
5579static PyObject *
5580socket_CMSG_SPACE(PyObject *self, PyObject *args)
5581{
5582 Py_ssize_t length;
5583 size_t result;
5584
5585 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5586 return NULL;
5587 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5588 PyErr_SetString(PyExc_OverflowError,
5589 "CMSG_SPACE() argument out of range");
5590 return NULL;
5591 }
5592 return PyLong_FromSize_t(result);
5593}
5594
5595PyDoc_STRVAR(CMSG_SPACE_doc,
5596"CMSG_SPACE(length) -> buffer size\n\
5597\n\
5598Return the buffer size needed for recvmsg() to receive an ancillary\n\
5599data item with associated data of the given length, along with any\n\
5600trailing padding. The buffer space needed to receive multiple items\n\
5601is the sum of the CMSG_SPACE() values for their associated data\n\
5602lengths. Raises OverflowError if length is outside the permissible\n\
5603range of values.");
5604#endif /* CMSG_SPACE */
5605#endif /* CMSG_LEN */
5606
5607
Guido van Rossum30a685f1991-06-27 15:51:29 +00005608/* List of functions exported by this module. */
5609
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005610static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 {"gethostbyname", socket_gethostbyname,
5612 METH_VARARGS, gethostbyname_doc},
5613 {"gethostbyname_ex", socket_gethostbyname_ex,
5614 METH_VARARGS, ghbn_ex_doc},
5615 {"gethostbyaddr", socket_gethostbyaddr,
5616 METH_VARARGS, gethostbyaddr_doc},
5617 {"gethostname", socket_gethostname,
5618 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005619#ifdef HAVE_SETHOSTNAME
5620 {"sethostname", socket_sethostname,
5621 METH_VARARGS, sethostname_doc},
5622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 {"getservbyname", socket_getservbyname,
5624 METH_VARARGS, getservbyname_doc},
5625 {"getservbyport", socket_getservbyport,
5626 METH_VARARGS, getservbyport_doc},
5627 {"getprotobyname", socket_getprotobyname,
5628 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005629#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 {"dup", socket_dup,
5631 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005632#endif
Dave Cole331708b2004-08-09 04:51:41 +00005633#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 {"socketpair", socket_socketpair,
5635 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 {"ntohs", socket_ntohs,
5638 METH_VARARGS, ntohs_doc},
5639 {"ntohl", socket_ntohl,
5640 METH_O, ntohl_doc},
5641 {"htons", socket_htons,
5642 METH_VARARGS, htons_doc},
5643 {"htonl", socket_htonl,
5644 METH_O, htonl_doc},
5645 {"inet_aton", socket_inet_aton,
5646 METH_VARARGS, inet_aton_doc},
5647 {"inet_ntoa", socket_inet_ntoa,
5648 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005649#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 {"inet_pton", socket_inet_pton,
5651 METH_VARARGS, inet_pton_doc},
5652 {"inet_ntop", socket_inet_ntop,
5653 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005654#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005655 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5656 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 {"getnameinfo", socket_getnameinfo,
5658 METH_VARARGS, getnameinfo_doc},
5659 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5660 METH_NOARGS, getdefaulttimeout_doc},
5661 {"setdefaulttimeout", socket_setdefaulttimeout,
5662 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005663#ifdef HAVE_IF_NAMEINDEX
5664 {"if_nameindex", socket_if_nameindex,
5665 METH_NOARGS, if_nameindex_doc},
5666 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005667 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005668 {"if_indextoname", socket_if_indextoname,
5669 METH_O, if_indextoname_doc},
5670#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005671#ifdef CMSG_LEN
5672 {"CMSG_LEN", socket_CMSG_LEN,
5673 METH_VARARGS, CMSG_LEN_doc},
5674#ifdef CMSG_SPACE
5675 {"CMSG_SPACE", socket_CMSG_SPACE,
5676 METH_VARARGS, CMSG_SPACE_doc},
5677#endif
5678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005680};
5681
Guido van Rossum30a685f1991-06-27 15:51:29 +00005682
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005683#ifdef MS_WINDOWS
5684#define OS_INIT_DEFINED
5685
5686/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005687
5688static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005689os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005692}
5693
5694static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005695os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 WSADATA WSAData;
5698 int ret;
5699 ret = WSAStartup(0x0101, &WSAData);
5700 switch (ret) {
5701 case 0: /* No error */
5702 Py_AtExit(os_cleanup);
5703 return 1; /* Success */
5704 case WSASYSNOTREADY:
5705 PyErr_SetString(PyExc_ImportError,
5706 "WSAStartup failed: network not ready");
5707 break;
5708 case WSAVERNOTSUPPORTED:
5709 case WSAEINVAL:
5710 PyErr_SetString(
5711 PyExc_ImportError,
5712 "WSAStartup failed: requested version not supported");
5713 break;
5714 default:
5715 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5716 break;
5717 }
5718 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005719}
5720
Guido van Rossum8d665e61996-06-26 18:22:49 +00005721#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005722
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005723
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005724
5725#ifndef OS_INIT_DEFINED
5726static int
5727os_init(void)
5728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005730}
5731#endif
5732
5733
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005734/* C API table - always add new things to the end for binary
5735 compatibility. */
5736static
5737PySocketModule_APIObject PySocketModuleAPI =
5738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005740 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005742};
5743
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005744
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005745/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005746
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005747 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005748 "socket.py" which implements some additional functionality.
5749 The import of "_socket" may fail with an ImportError exception if
5750 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005751 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005752 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005753*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005754
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005755PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005756"Implementation module for socket operations.\n\
5757\n\
5758See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005759
Martin v. Löwis1a214512008-06-11 05:26:20 +00005760static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 PyModuleDef_HEAD_INIT,
5762 PySocket_MODULE_NAME,
5763 socket_doc,
5764 -1,
5765 socket_methods,
5766 NULL,
5767 NULL,
5768 NULL,
5769 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005770};
5771
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005772PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005773PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 if (!os_init())
5778 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005779
Victor Stinnerdaf45552013-08-28 00:53:59 +02005780#ifdef MS_WINDOWS
5781 if (support_wsa_no_inherit == -1) {
5782 DWORD version = GetVersion();
5783 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5784 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5785 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5786 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5787 }
5788#endif
5789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 Py_TYPE(&sock_type) = &PyType_Type;
5791 m = PyModule_Create(&socketmodule);
5792 if (m == NULL)
5793 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005794
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005795 Py_INCREF(PyExc_OSError);
5796 PySocketModuleAPI.error = PyExc_OSError;
5797 Py_INCREF(PyExc_OSError);
5798 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005800 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 if (socket_herror == NULL)
5802 return NULL;
5803 Py_INCREF(socket_herror);
5804 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005805 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 NULL);
5807 if (socket_gaierror == NULL)
5808 return NULL;
5809 Py_INCREF(socket_gaierror);
5810 PyModule_AddObject(m, "gaierror", socket_gaierror);
5811 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005812 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 if (socket_timeout == NULL)
5814 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005815 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816 Py_INCREF(socket_timeout);
5817 PyModule_AddObject(m, "timeout", socket_timeout);
5818 Py_INCREF((PyObject *)&sock_type);
5819 if (PyModule_AddObject(m, "SocketType",
5820 (PyObject *)&sock_type) != 0)
5821 return NULL;
5822 Py_INCREF((PyObject *)&sock_type);
5823 if (PyModule_AddObject(m, "socket",
5824 (PyObject *)&sock_type) != 0)
5825 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005826
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005827#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005829#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 Py_INCREF(has_ipv6);
5833 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 /* Export C API */
5836 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5837 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5838 ) != 0)
5839 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005842#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005843 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005844#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005845 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005846#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005847 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005848#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005849#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005850 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005851#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005852#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005854 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005855#endif
5856#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005857 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005858#endif
5859#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005861 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005862#endif
5863#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005865 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005866#endif
5867#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005869 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005870#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005871#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005873 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005874#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005875#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005877 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005878#endif
5879#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005881 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005882#endif
5883#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005884 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005885#endif
5886#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005888 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005889#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005890#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005892 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005893#endif
5894#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005896 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005897#endif
5898#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005900 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005901#endif
5902#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005904 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005905#endif
5906#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005908 PyModule_AddIntMacro(m, AF_NETLINK);
5909 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005910#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005911 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005912#endif
5913#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005914 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005915#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005916 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5917 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005918#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005919 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005920#endif
5921#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005922 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005923#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005924#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005925 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005926#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005927#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005928 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005929#endif
5930#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005931 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005932#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005933 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005934#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005935 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005936#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005937#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005938 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005939#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005940#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005941#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005943 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005944#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02005945#ifdef AF_LINK
5946 PyModule_AddIntMacro(m, AF_LINK);
5947#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005948#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005950 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005951#endif
5952#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005954 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005955#endif
5956#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005958 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005959#endif
5960#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005962 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005963#endif
5964#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005966 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005967#endif
5968#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005970 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005971#endif
5972#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005974 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005975#endif
5976#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005978 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005979#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005980
Hye-Shik Chang81268602004-02-02 06:05:24 +00005981#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005982 PyModule_AddIntMacro(m, AF_BLUETOOTH);
5983 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
5984 PyModule_AddIntMacro(m, BTPROTO_HCI);
5985 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005986#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005987 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005988#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005989#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005990#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005991 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005992#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005993 PyModule_AddIntMacro(m, HCI_DATA_DIR);
5994 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005995#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005996 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5998 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005999#endif
6000
Charles-François Natali47413c12011-10-06 19:47:44 +02006001#ifdef AF_CAN
6002 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006003 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006004#endif
6005#ifdef PF_CAN
6006 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006007 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006008#endif
6009
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006010/* Reliable Datagram Sockets */
6011#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006012 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006013#endif
6014#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006015 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006016#endif
6017
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006018/* Kernel event messages */
6019#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006020 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006021#endif
6022#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006023 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006024#endif
6025
Antoine Pitroub156a462010-10-27 20:13:57 +00006026#ifdef AF_PACKET
6027 PyModule_AddIntMacro(m, AF_PACKET);
6028#endif
6029#ifdef PF_PACKET
6030 PyModule_AddIntMacro(m, PF_PACKET);
6031#endif
6032#ifdef PACKET_HOST
6033 PyModule_AddIntMacro(m, PACKET_HOST);
6034#endif
6035#ifdef PACKET_BROADCAST
6036 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6037#endif
6038#ifdef PACKET_MULTICAST
6039 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6040#endif
6041#ifdef PACKET_OTHERHOST
6042 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6043#endif
6044#ifdef PACKET_OUTGOING
6045 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6046#endif
6047#ifdef PACKET_LOOPBACK
6048 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6049#endif
6050#ifdef PACKET_FASTROUTE
6051 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006052#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006053
Christian Heimes043d6f62008-01-07 17:19:16 +00006054#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006055 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006058 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6059 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6060 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006061
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006062 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6063 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6064 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006067 PyModule_AddIntMacro(m, SOL_TIPC);
6068 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6069 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6070 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6071 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006072
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006073 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6074 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6075 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6076 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006079 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6080 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006081#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006083 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006084#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006085 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6086 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6087 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6088 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6089 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6090 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006091#endif
6092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006094 PyModule_AddIntMacro(m, SOCK_STREAM);
6095 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006096/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006097 PyModule_AddIntMacro(m, SOCK_RAW);
6098 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006099#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006100 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006101#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006102#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006103 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006104#endif
6105#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006106 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006107#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006110 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006113 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006116 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006117#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006118#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006119 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006120#endif
6121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006123 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006126 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006127#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006129 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006132 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006135 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006138 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006141 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006144 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006147 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006150 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006153 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006156 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006159 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006165 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006168 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006169#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006170#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006171 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006172#endif
6173#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006174 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006175#endif
6176#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006177 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006178#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006179#ifdef SO_BINDTODEVICE
6180 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6181#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006182#ifdef SO_PRIORITY
6183 PyModule_AddIntMacro(m, SO_PRIORITY);
6184#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 /* Maximum number of connections for "listen" */
6187#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006188 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006189#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006191#endif
6192
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006193 /* Ancilliary message types */
6194#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006196#endif
6197#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006199#endif
6200#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006202#endif
6203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 /* Flags for send, recv */
6205#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006212 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006215 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006221 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006224 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006227 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006234#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006235#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006236 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006237#endif
6238#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006239 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006240#endif
6241#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006243#endif
6244#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006245 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006246#endif
6247#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006248 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006249#endif
6250#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006251 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006252#endif
6253#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006254 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006255#endif
6256#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006258#endif
6259#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006261#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006262#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006263 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006264#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 /* Protocol level and numbers, usable for [gs]etsockopt */
6267#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006268 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006272#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006279 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006292#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006297#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006299#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006300#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006302#endif
6303#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6305 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006306#endif
6307#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006308 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6309 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6310 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006311
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6313 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6314 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006315#endif
6316#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006317 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6318 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6319 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6320 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006321#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006322#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006324 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6325 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6326 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6327 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6328 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6329 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6330 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6331 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6332 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6333 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6334 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6335 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6336#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006337#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006339#endif
6340#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006342#endif
6343#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006345#endif
6346#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006348#endif
6349#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006351#endif
6352#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006354#endif
6355#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006357#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006359 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006360#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006364 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006367 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006368#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006372 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006375 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006378 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006381 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006384 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006387 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006388#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006398 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006399#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006430 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006461#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006462#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006467#endif
6468/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006471#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006476#endif
6477
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006478#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006480#endif
6481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 /* Some port configuration */
6483#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006485#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006490#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006492#endif
6493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 /* Some reserved IP v.4 addresses */
6495#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006497#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006502#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006507#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006512#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515#ifdef INADDR_ALLHOSTS_GROUP
6516 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6517 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006518#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006523#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006527 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006530#endif
6531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 /* IPv4 [gs]etsockopt options */
6533#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006537 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006567 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006580#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006581#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006582 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006583#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6586#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006605#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006609#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006611#endif
6612#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006614#endif
6615#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006616 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006617#endif
6618#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006620#endif
6621#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006623#endif
6624#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006626#endif
6627#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006628 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006629#endif
6630#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006632#endif
6633#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006635#endif
6636#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006638#endif
6639#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006641#endif
6642#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006644#endif
6645#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006647#endif
6648#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006650#endif
6651#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006653#endif
6654#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006656#endif
6657#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006659#endif
6660#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006662#endif
6663#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006665#endif
6666#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006668#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* TCP options */
6671#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006679#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006691#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006692#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006706#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006707#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006709#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006711 /* IPX options */
6712#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006714#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006715
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006716/* Reliable Datagram Sockets */
6717#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006719#endif
6720#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006722#endif
6723#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006725#endif
6726#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006728#endif
6729#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006731#endif
6732#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006734#endif
6735#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006737#endif
6738#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006740#endif
6741#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006743#endif
6744#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006746#endif
6747#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006749#endif
6750#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006752#endif
6753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006755#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006757#endif
6758#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006760#endif
6761#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006763#endif
6764#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006766#endif
6767#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006769#endif
6770#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006772#endif
6773#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006775#endif
6776#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006778#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006779#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006781#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006782#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006784#endif
6785#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006787#endif
6788#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006790#endif
6791#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006793#endif
6794#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006796#endif
6797#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006799#endif
6800#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006802#endif
6803#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006805#endif
6806#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006808#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006809#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006811#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006812#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006814#endif
6815#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006817#endif
6818#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006820#endif
6821#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006823#endif
6824#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006826#endif
6827#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006829#endif
6830#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006832#endif
6833#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006835#endif
6836#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006838#endif
6839#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006841#endif
6842#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006844#endif
6845#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006847#endif
6848#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006850#endif
6851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006853#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006855#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006857#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006858 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006859#endif
6860#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006862#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006864#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006866#endif
6867#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006869#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006871#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006872 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006873#endif
6874
Christian Heimesfaf2f632008-01-06 16:59:19 +00006875#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 {
6877 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6878 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6879 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006880 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881 PyObject *tmp;
6882 tmp = PyLong_FromUnsignedLong(codes[i]);
6883 if (tmp == NULL)
6884 return NULL;
6885 PyModule_AddObject(m, names[i], tmp);
6886 }
6887 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, RCVALL_OFF);
6889 PyModule_AddIntMacro(m, RCVALL_ON);
6890 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006891#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006893#endif
6894#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006896#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006897#endif /* _MSTCPIP_ */
6898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006900#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006901 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006903 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006904}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006905
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006906
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006907#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006908#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006909
6910/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006911/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006912
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006913int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006914inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006917#if (SIZEOF_INT != 4)
6918#error "Not sure if in_addr_t exists and int is not 32-bits."
6919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920 unsigned int packed_addr;
6921 packed_addr = inet_addr(src);
6922 if (packed_addr == INADDR_NONE)
6923 return 0;
6924 memcpy(dst, &packed_addr, 4);
6925 return 1;
6926 }
6927 /* Should set errno to EAFNOSUPPORT */
6928 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006929}
6930
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006931const char *
6932inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934 if (af == AF_INET) {
6935 struct in_addr packed_addr;
6936 if (size < 16)
6937 /* Should set errno to ENOSPC. */
6938 return NULL;
6939 memcpy(&packed_addr, src, sizeof(packed_addr));
6940 return strncpy(dst, inet_ntoa(packed_addr), size);
6941 }
6942 /* Should set errno to EAFNOSUPPORT */
6943 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006944}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006945
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006946#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006947#endif