blob: 0b679dfaa3e30f13aa5f8f74da02fd4aaf240f6e [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__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
139setsockopt(level, optname, value) -- set socket options\n\
140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
156#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Guido van Rossum7a122991999-04-13 04:07:32 +0000166#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000168#endif
169
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100171# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# define HAVE_GETHOSTBYNAME_R_3_ARG
173# elif defined(__sun) || defined(__sgi)
174# define HAVE_GETHOSTBYNAME_R_5_ARG
175# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000176/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# else
178# undef HAVE_GETHOSTBYNAME_R
179# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000180#endif
181
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000182#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
183 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000185#endif
186
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000187/* To use __FreeBSD_version */
188#ifdef HAVE_SYS_PARAM_H
189#include <sys/param.h>
190#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000191/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100192 (this includes the getaddrinfo emulation) protect access with a lock.
193
194 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
195 a mix of code including an unsafe implementation from an old BSD's
196 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
197 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
198 includes the requirement that getaddrinfo be thread-safe.
199
200 See issue #25924 for details.
201 */
202#if defined(WITH_THREAD) && ( \
203 (defined(__APPLE__) && \
204 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000205 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000206 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100207 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000208#define USE_GETADDRINFO_LOCK
209#endif
210
211#ifdef USE_GETADDRINFO_LOCK
212#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
213#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
214#else
215#define ACQUIRE_GETADDRINFO_LOCK
216#define RELEASE_GETADDRINFO_LOCK
217#endif
218
219#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000220# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000221#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000222
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000223#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000224# include <types.h>
225# include <io.h>
226# include <sys/ioctl.h>
227# include <utils.h>
228# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000229#endif
230
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100231#ifdef __APPLE__
232# include <sys/ioctl.h>
233#endif
234
235
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000236#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000237/* make sure that the reentrant (gethostbyaddr_r etc)
238 functions are declared correctly if compiling with
239 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240
Thomas Wouters477c8d52006-05-27 19:21:47 +0000241/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000243#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000244#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000245
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000246#undef _XOPEN_SOURCE
247#include <sys/socket.h>
248#include <sys/types.h>
249#include <netinet/in.h>
250#ifdef _SS_ALIGNSIZE
251#define HAVE_GETADDRINFO 1
252#define HAVE_GETNAMEINFO 1
253#endif
254
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255#define HAVE_INET_PTON
256#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000257#endif
258
Thomas Wouters477c8d52006-05-27 19:21:47 +0000259/* Irix 6.5 fails to define this variable at all. This is needed
260 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000261 are just busted. Same thing for Solaris. */
262#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000263#define INET_ADDRSTRLEN 16
264#endif
265
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000267#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000268#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700271#ifdef HAVE_SYS_SOCKET_H
272#include <sys/socket.h>
273#endif
274
275#ifdef HAVE_NET_IF_H
276#include <net/if.h>
277#endif
278
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000279/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000281#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282
283/* Addressing includes */
284
Guido van Rossum6f489d91996-06-28 20:15:15 +0000285#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286
287/* Non-MS WINDOWS includes */
288# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000289# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Guido van Rossum9376b741999-09-15 22:01:40 +0000291/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000293
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000296#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000297
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000299# ifdef HAVE_FCNTL_H
300# include <fcntl.h>
301# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000302
Steve Dower65e4cb12014-11-22 12:54:57 -0800303#if defined(_MSC_VER) && _MSC_VER >= 1800
304/* Provides the IsWindows7SP1OrGreater() function */
305#include <VersionHelpers.h>
306#endif
307
Jeremy Hylton22308652001-02-02 03:23:09 +0000308#endif
309
Skip Montanaro7befb992004-02-10 16:50:21 +0000310#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000311
Neal Norwitz39d22e52002-11-02 19:55:21 +0000312#ifndef O_NONBLOCK
313# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000314#endif
315
Trent Micka708d6e2004-09-07 17:48:26 +0000316/* include Python's addrinfo.h unless it causes trouble */
317#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
318 /* Do not include addinfo.h on some newer IRIX versions.
319 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
320 * for example, but not by 6.5.10.
321 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000322#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000323 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
324 * EAI_* constants are defined in (the already included) ws2tcpip.h.
325 */
326#else
327# include "addrinfo.h"
328#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000329
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000330#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000331#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000332int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000333const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000334#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000335#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000336
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337#ifdef __APPLE__
338/* On OS X, getaddrinfo returns no error indication of lookup
339 failure, so we must use the emulation instead of the libinfo
340 implementation. Unfortunately, performing an autoconf test
341 for this bug would require DNS access for the machine performing
342 the configuration, which is not acceptable. Therefore, we
343 determine the bug just by checking for __APPLE__. If this bug
344 gets ever fixed, perhaps checking for sys/version.h would be
345 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000346#ifndef HAVE_GETNAMEINFO
347/* This bug seems to be fixed in Jaguar. Ths easiest way I could
348 Find to check for Jaguar is that it has getnameinfo(), which
349 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000350#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000352
353#ifdef HAVE_INET_ATON
354#define USE_INET_ATON_WEAKLINK
355#endif
356
Jack Jansen84262fb2002-07-02 14:40:42 +0000357#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000358
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000359/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000360#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000361/* avoid clashes with the C library definition of the symbol. */
362#define getaddrinfo fake_getaddrinfo
363#define gai_strerror fake_gai_strerror
364#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000365#include "getaddrinfo.c"
366#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000367#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000368#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000369#include "getnameinfo.c"
370#endif
371
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000372#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000373#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000374#endif
375
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000376#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000377#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000378#define EAFNOSUPPORT WSAEAFNOSUPPORT
379#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000380#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000381
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000382#ifndef SOCKETCLOSE
383#define SOCKETCLOSE close
384#endif
385
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000386#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000387#define USE_BLUETOOTH 1
388#if defined(__FreeBSD__)
389#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
390#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000391#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000392#define SOL_HCI SOL_HCI_RAW
393#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define sockaddr_l2 sockaddr_l2cap
395#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000396#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000397#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
398#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000399#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000400#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000401#define sockaddr_l2 sockaddr_bt
402#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000403#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000404#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000405#define SOL_HCI BTPROTO_HCI
406#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
408#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000409#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000410#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000411#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000415#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
416#endif
417#endif
418
Charles-François Natali8b759652011-12-23 16:44:51 +0100419/* Convert "sock_addr_t *" to "struct sockaddr *". */
420#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000421
Martin v. Löwise9416172003-05-03 10:12:45 +0000422/*
423 * Constants for getnameinfo()
424 */
425#if !defined(NI_MAXHOST)
426#define NI_MAXHOST 1025
427#endif
428#if !defined(NI_MAXSERV)
429#define NI_MAXSERV 32
430#endif
431
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000432#ifndef INVALID_SOCKET /* MS defines this */
433#define INVALID_SOCKET (-1)
434#endif
435
Charles-François Natali0cc86852013-09-13 19:53:08 +0200436#ifndef INADDR_NONE
437#define INADDR_NONE (-1)
438#endif
439
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000440/* XXX There's a problem here: *static* functions are not supposed to have
441 a Py prefix (or use CapitalizedWords). Later... */
442
Guido van Rossum30a685f1991-06-27 15:51:29 +0000443/* Global variable holding the exception type for errors detected
444 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000445static PyObject *socket_herror;
446static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000447static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448
Tim Peters643a7fc2002-02-17 04:13:21 +0000449/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000450 The sock_type variable contains pointers to various functions,
451 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000452 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000453static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000454
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000455#if defined(HAVE_POLL_H)
456#include <poll.h>
457#elif defined(HAVE_SYS_POLL_H)
458#include <sys/poll.h>
459#endif
460
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000461/* Largest value to try to store in a socklen_t (used when handling
462 ancillary data). POSIX requires socklen_t to hold at least
463 (2**31)-1 and recommends against storing larger values, but
464 socklen_t was originally int in the BSD interface, so to be on the
465 safe side we use the smaller of (2**31)-1 and INT_MAX. */
466#if INT_MAX > 0x7fffffff
467#define SOCKLEN_T_LIMIT 0x7fffffff
468#else
469#define SOCKLEN_T_LIMIT INT_MAX
470#endif
471
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200472#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000473/* Instead of select(), we'll use poll() since poll() works on any fd. */
474#define IS_SELECTABLE(s) 1
475/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000476#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200477/* If there's no timeout left, we don't have to call select, so it's a safe,
478 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100479#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000480#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000481
482static PyObject*
483select_error(void)
484{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200485 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000487}
488
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000489#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000490#ifndef WSAEAGAIN
491#define WSAEAGAIN WSAEWOULDBLOCK
492#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000493#define CHECK_ERRNO(expected) \
494 (WSAGetLastError() == WSA ## expected)
495#else
496#define CHECK_ERRNO(expected) \
497 (errno == expected)
498#endif
499
Victor Stinnerdaf45552013-08-28 00:53:59 +0200500#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200501# define GET_SOCK_ERROR WSAGetLastError()
502# define SET_SOCK_ERROR(err) WSASetLastError(err)
503# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
504# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
505#else
506# define GET_SOCK_ERROR errno
507# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
508# define SOCK_TIMEOUT_ERR EWOULDBLOCK
509# define SOCK_INPROGRESS_ERR EINPROGRESS
510#endif
511
512
513#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200514/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
515static int support_wsa_no_inherit = -1;
516#endif
517
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518/* Convenience function to raise an error according to errno
519 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520
Guido van Rossum73624e91994-10-10 17:59:00 +0000521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000523{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000524#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 int err_no = WSAGetLastError();
526 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
527 recognizes the error codes used by both GetLastError() and
528 WSAGetLastError */
529 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200530 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000531#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000532
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200533 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000534}
535
Guido van Rossum30a685f1991-06-27 15:51:29 +0000536
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000538set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541
542#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 if (v != NULL) {
548 PyErr_SetObject(socket_herror, v);
549 Py_DECREF(v);
550 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553}
554
555
556static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000557set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560
Martin v. Löwis272cb402002-03-01 08:31:07 +0000561#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 /* EAI_SYSTEM is not available on Windows XP. */
563 if (error == EAI_SYSTEM)
564 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000565#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000567#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000569#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 if (v != NULL) {
573 PyErr_SetObject(socket_gaierror, v);
574 Py_DECREF(v);
575 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578}
579
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000580/* Function to perform the setting of socket blocking mode
581 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582static int
583internal_setblocking(PySocketSockObject *s, int block)
584{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585#ifdef MS_WINDOWS
586 u_long arg;
587#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100588#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100589 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100590 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000591#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000592#ifdef SOCK_NONBLOCK
593 if (block)
594 s->sock_type &= (~SOCK_NONBLOCK);
595 else
596 s->sock_type |= SOCK_NONBLOCK;
597#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100601#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 block = !block;
603 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100604#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
606 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100607 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 else
Victor Stinner9a954832013-12-04 00:41:24 +0100609 new_delay_flag = delay_flag | O_NONBLOCK;
610 if (new_delay_flag != delay_flag)
611 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
612#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000613#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200614 arg = !block;
615 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000616#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Since these don't return anything */
620 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621}
622
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000623static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200624internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
625 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100628#ifdef HAVE_POLL
629 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200630 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100631#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200632 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200633 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100634#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000635
Victor Stinnerb7df3142015-03-27 22:59:32 +0100636#ifdef WITH_THREAD
637 /* must be called with the GIL held */
638 assert(PyGILState_Check());
639#endif
640
Victor Stinner416f2e62015-03-31 13:56:29 +0200641 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200642 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 /* Guard against closed socket */
645 if (s->sock_fd < 0)
646 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 /* Prefer poll, if available, since you can poll() any fd
649 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000650#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100651 pollfd.fd = s->sock_fd;
652 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200653 if (connect) {
654 /* On Windows, the socket becomes writable on connection success,
655 but a connection failure is notified as an error. On POSIX, the
656 socket becomes writable on connection success or on connection
657 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200658 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200659 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660
Victor Stinner71694d52015-03-28 01:18:54 +0100661 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200662 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200663 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000664
Victor Stinner71694d52015-03-28 01:18:54 +0100665 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200666 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100667 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000668#else
Victor Stinnerced11742015-04-09 10:27:25 +0200669 if (interval >= 0) {
670 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
671 tvp = &tv;
672 }
673 else
674 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675
Victor Stinner71694d52015-03-28 01:18:54 +0100676 FD_ZERO(&fds);
677 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200678 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200679 if (connect) {
680 /* On Windows, the socket becomes writable on connection success,
681 but a connection failure is notified as an error. On POSIX, the
682 socket becomes writable on connection success or on connection
683 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200684 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200685 }
Victor Stinner71694d52015-03-28 01:18:54 +0100686
687 /* See if the socket is ready */
688 Py_BEGIN_ALLOW_THREADS;
689 if (writing)
690 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200691 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100692 else
693 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200694 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100695 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000696#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 if (n < 0)
699 return -1;
700 if (n == 0)
701 return 1;
702 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703}
704
Victor Stinner31bf2d52015-04-01 21:57:09 +0200705/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000706
Victor Stinner81c41db2015-04-02 11:50:57 +0200707 On error, raise an exception and return -1 if err is set, or fill err and
708 return -1 otherwise. If a signal was received and the signal handler raised
709 an exception, return -1, and set err to -1 if err is set.
710
711 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100712
Victor Stinner31bf2d52015-04-01 21:57:09 +0200713 If the socket has a timeout, wait until the socket is ready before calling
714 the function: wait until the socket is writable if writing is nonzero, wait
715 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100716
Victor Stinner81c41db2015-04-02 11:50:57 +0200717 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200718 the function, except if the signal handler raised an exception (PEP 475).
719
720 When the function is retried, recompute the timeout using a monotonic clock.
721
Victor Stinner81c41db2015-04-02 11:50:57 +0200722 sock_call_ex() must be called with the GIL held. The socket function is
723 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200724static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200725sock_call_ex(PySocketSockObject *s,
726 int writing,
727 int (*sock_func) (PySocketSockObject *s, void *data),
728 void *data,
729 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200730 int *err,
731 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200732{
Victor Stinner8912d142015-04-06 23:16:34 +0200733 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200734 _PyTime_t deadline = 0;
735 int deadline_initialized = 0;
736 int res;
737
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200738#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200739 /* sock_call() must be called with the GIL held. */
740 assert(PyGILState_Check());
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200741#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200742
743 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200744 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200745 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200746 /* For connect(), poll even for blocking socket. The connection
747 runs asynchronously. */
748 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200749 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200750 _PyTime_t interval;
751
Victor Stinner81c41db2015-04-02 11:50:57 +0200752 if (deadline_initialized) {
753 /* recompute the timeout */
754 interval = deadline - _PyTime_GetMonotonicClock();
755 }
756 else {
757 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200758 deadline = _PyTime_GetMonotonicClock() + timeout;
759 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200761
Victor Stinner10550cd2015-04-03 13:22:27 +0200762 if (interval >= 0)
763 res = internal_select(s, writing, interval, connect);
764 else
765 res = 1;
766 }
767 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200768 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200769 }
770
Victor Stinner31bf2d52015-04-01 21:57:09 +0200771 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200772 if (err)
773 *err = GET_SOCK_ERROR;
774
Victor Stinner31bf2d52015-04-01 21:57:09 +0200775 if (CHECK_ERRNO(EINTR)) {
776 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 if (PyErr_CheckSignals()) {
778 if (err)
779 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200780 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200781 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200782
783 /* retry select() */
784 continue;
785 }
786
787 /* select() failed */
788 s->errorhandler();
789 return -1;
790 }
791
792 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 if (err)
794 *err = SOCK_TIMEOUT_ERR;
795 else
796 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200797 return -1;
798 }
799
800 /* the socket is ready */
801 }
802
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 /* inner loop to retry sock_func() when sock_func() is interrupted
804 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 while (1) {
806 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200807 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200808 Py_END_ALLOW_THREADS
809
810 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 /* sock_func() succeeded */
812 if (err)
813 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200814 return 0;
815 }
816
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 if (err)
818 *err = GET_SOCK_ERROR;
819
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820 if (!CHECK_ERRNO(EINTR))
821 break;
822
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 /* sock_func() was interrupted by a signal */
824 if (PyErr_CheckSignals()) {
825 if (err)
826 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200829
Victor Stinner81c41db2015-04-02 11:50:57 +0200830 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831 }
832
833 if (s->sock_timeout > 0
834 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200835 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200836
837 For example, select() could indicate a socket is ready for
838 reading, but the data then discarded by the OS because of a
839 wrong checksum.
840
841 Loop on select() to recheck for socket readyness. */
842 continue;
843 }
844
Victor Stinner81c41db2015-04-02 11:50:57 +0200845 /* sock_func() failed */
846 if (!err)
847 s->errorhandler();
848 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000849 return -1;
850 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200851}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000852
Victor Stinner81c41db2015-04-02 11:50:57 +0200853static int
854sock_call(PySocketSockObject *s,
855 int writing,
856 int (*func) (PySocketSockObject *s, void *data),
857 void *data)
858{
Victor Stinner8912d142015-04-06 23:16:34 +0200859 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200860}
861
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000862
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000863/* Initialize a new socket object. */
864
Victor Stinner88ed6402015-04-09 10:23:12 +0200865/* Default timeout for new sockets */
866static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000867
Martin v. Löwis1a214512008-06-11 05:26:20 +0000868static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000869init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 s->sock_fd = fd;
873 s->sock_family = family;
874 s->sock_type = type;
875 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000878#ifdef SOCK_NONBLOCK
879 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100880 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000881 else
882#endif
883 {
884 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100885 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000886 internal_setblocking(s, 0);
887 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000888
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000889}
890
891
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892/* Create a new socket object.
893 This just creates the object and initializes it.
894 If the creation fails, return NULL and set an exception (implicit
895 in NEWOBJ()). */
896
Guido van Rossum73624e91994-10-10 17:59:00 +0000897static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000898new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 PySocketSockObject *s;
901 s = (PySocketSockObject *)
902 PyType_GenericNew(&sock_type, NULL, NULL);
903 if (s != NULL)
904 init_sockobject(s, fd, family, type, proto);
905 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906}
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908
Guido van Rossum48a680c2001-03-02 06:34:14 +0000909/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000910 thread to be in gethostbyname or getaddrinfo */
911#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200912static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000913#endif
914
915
Guido van Rossum30a685f1991-06-27 15:51:29 +0000916/* Convert a string specifying a host name or one of a few symbolic
917 names to a numeric IP address. This usually calls gethostbyname()
918 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000919 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920 an error occurred; then an exception is raised. */
921
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000923setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 struct addrinfo hints, *res;
926 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
929 if (name[0] == '\0') {
930 int siz;
931 memset(&hints, 0, sizeof(hints));
932 hints.ai_family = af;
933 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
934 hints.ai_flags = AI_PASSIVE;
935 Py_BEGIN_ALLOW_THREADS
936 ACQUIRE_GETADDRINFO_LOCK
937 error = getaddrinfo(NULL, "0", &hints, &res);
938 Py_END_ALLOW_THREADS
939 /* We assume that those thread-unsafe getaddrinfo() versions
940 *are* safe regarding their return value, ie. that a
941 subsequent call to getaddrinfo() does not destroy the
942 outcome of the first call. */
943 RELEASE_GETADDRINFO_LOCK
944 if (error) {
945 set_gaierror(error);
946 return -1;
947 }
948 switch (res->ai_family) {
949 case AF_INET:
950 siz = 4;
951 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000952#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 case AF_INET6:
954 siz = 16;
955 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 default:
958 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200959 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 "unsupported address family");
961 return -1;
962 }
963 if (res->ai_next) {
964 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200965 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 "wildcard resolved to multiple address");
967 return -1;
968 }
969 if (res->ai_addrlen < addr_ret_size)
970 addr_ret_size = res->ai_addrlen;
971 memcpy(addr_ret, res->ai_addr, addr_ret_size);
972 freeaddrinfo(res);
973 return siz;
974 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200975 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100976 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200977 if (strcmp(name, "255.255.255.255") == 0 ||
978 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 struct sockaddr_in *sin;
980 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200981 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 "address family mismatched");
983 return -1;
984 }
985 sin = (struct sockaddr_in *)addr_ret;
986 memset((void *) sin, '\0', sizeof(*sin));
987 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000988#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 sin->sin_addr.s_addr = INADDR_BROADCAST;
992 return sizeof(sin->sin_addr);
993 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200994
995 /* avoid a name resolution in case of numeric address */
996#ifdef HAVE_INET_PTON
997 /* check for an IPv4 address */
998 if (af == AF_UNSPEC || af == AF_INET) {
999 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1000 memset(sin, 0, sizeof(*sin));
1001 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1002 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001003#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001004 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001005#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001006 return 4;
1007 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001009#ifdef ENABLE_IPV6
1010 /* check for an IPv6 address - if the address contains a scope ID, we
1011 * fallback to getaddrinfo(), which can handle translation from interface
1012 * name to interface index */
1013 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1014 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1015 memset(sin, 0, sizeof(*sin));
1016 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1017 sin->sin6_family = AF_INET6;
1018#ifdef HAVE_SOCKADDR_SA_LEN
1019 sin->sin6_len = sizeof(*sin);
1020#endif
1021 return 16;
1022 }
1023 }
1024#endif /* ENABLE_IPV6 */
1025#else /* HAVE_INET_PTON */
1026 /* check for an IPv4 address */
1027 if (af == AF_INET || af == AF_UNSPEC) {
1028 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1029 memset(sin, 0, sizeof(*sin));
1030 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1031 sin->sin_family = AF_INET;
1032#ifdef HAVE_SOCKADDR_SA_LEN
1033 sin->sin_len = sizeof(*sin);
1034#endif
1035 return 4;
1036 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001037 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001038#endif /* HAVE_INET_PTON */
1039
1040 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 memset(&hints, 0, sizeof(hints));
1042 hints.ai_family = af;
1043 Py_BEGIN_ALLOW_THREADS
1044 ACQUIRE_GETADDRINFO_LOCK
1045 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001046#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 if (error == EAI_NONAME && af == AF_UNSPEC) {
1048 /* On Tru64 V5.1, numeric-to-addr conversion fails
1049 if no address family is given. Assume IPv4 for now.*/
1050 hints.ai_family = AF_INET;
1051 error = getaddrinfo(name, NULL, &hints, &res);
1052 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 Py_END_ALLOW_THREADS
1055 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1056 if (error) {
1057 set_gaierror(error);
1058 return -1;
1059 }
1060 if (res->ai_addrlen < addr_ret_size)
1061 addr_ret_size = res->ai_addrlen;
1062 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1063 freeaddrinfo(res);
1064 switch (addr_ret->sa_family) {
1065 case AF_INET:
1066 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001067#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 case AF_INET6:
1069 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001072 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 return -1;
1074 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001075}
1076
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078/* Create a string object representing an IP address.
1079 This is always a string of the form 'dd.dd.dd.dd' (with variable
1080 size numbers). */
1081
Guido van Rossum73624e91994-10-10 17:59:00 +00001082static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001083makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 char buf[NI_MAXHOST];
1086 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1089 NI_NUMERICHOST);
1090 if (error) {
1091 set_gaierror(error);
1092 return NULL;
1093 }
1094 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001095}
1096
1097
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001098#ifdef USE_BLUETOOTH
1099/* Convert a string representation of a Bluetooth address into a numeric
1100 address. Returns the length (6), or raises an exception and returns -1 if
1101 an error occurred. */
1102
1103static int
1104setbdaddr(char *name, bdaddr_t *bdaddr)
1105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 unsigned int b0, b1, b2, b3, b4, b5;
1107 char ch;
1108 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1111 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1112 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1113 bdaddr->b[0] = b0;
1114 bdaddr->b[1] = b1;
1115 bdaddr->b[2] = b2;
1116 bdaddr->b[3] = b3;
1117 bdaddr->b[4] = b4;
1118 bdaddr->b[5] = b5;
1119 return 6;
1120 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001121 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 return -1;
1123 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001124}
1125
1126/* Create a string representation of the Bluetooth address. This is always a
1127 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1128 value (zero padded if necessary). */
1129
1130static PyObject *
1131makebdaddr(bdaddr_t *bdaddr)
1132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1136 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1137 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1138 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001139}
1140#endif
1141
1142
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143/* Create an object representing the given socket address,
1144 suitable for passing it back to bind(), connect() etc.
1145 The family field of the sockaddr structure is inspected
1146 to determine what kind of address it really is. */
1147
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001148/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001149static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001150makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 if (addrlen == 0) {
1153 /* No address -- may be recvfrom() from known socket */
1154 Py_INCREF(Py_None);
1155 return Py_None;
1156 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 case AF_INET:
1161 {
1162 struct sockaddr_in *a;
1163 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1164 PyObject *ret = NULL;
1165 if (addrobj) {
1166 a = (struct sockaddr_in *)addr;
1167 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1168 Py_DECREF(addrobj);
1169 }
1170 return ret;
1171 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001173#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 case AF_UNIX:
1175 {
1176 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001177#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1179 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001180 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 }
1182 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 {
1185 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001186 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 }
1188 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001189#endif /* AF_UNIX */
1190
Martin v. Löwis11017b12006-01-14 18:12:57 +00001191#if defined(AF_NETLINK)
1192 case AF_NETLINK:
1193 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1195 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001196 }
1197#endif /* AF_NETLINK */
1198
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001199#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 case AF_INET6:
1201 {
1202 struct sockaddr_in6 *a;
1203 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1204 PyObject *ret = NULL;
1205 if (addrobj) {
1206 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001207 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 addrobj,
1209 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001210 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 a->sin6_scope_id);
1212 Py_DECREF(addrobj);
1213 }
1214 return ret;
1215 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001216#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001218#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 case AF_BLUETOOTH:
1220 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 case BTPROTO_L2CAP:
1223 {
1224 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1225 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1226 PyObject *ret = NULL;
1227 if (addrobj) {
1228 ret = Py_BuildValue("Oi",
1229 addrobj,
1230 _BT_L2_MEMB(a, psm));
1231 Py_DECREF(addrobj);
1232 }
1233 return ret;
1234 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 case BTPROTO_RFCOMM:
1237 {
1238 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1239 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1240 PyObject *ret = NULL;
1241 if (addrobj) {
1242 ret = Py_BuildValue("Oi",
1243 addrobj,
1244 _BT_RC_MEMB(a, channel));
1245 Py_DECREF(addrobj);
1246 }
1247 return ret;
1248 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 case BTPROTO_HCI:
1251 {
1252 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001253#if defined(__NetBSD__) || defined(__DragonFly__)
1254 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1255#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 PyObject *ret = NULL;
1257 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1258 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001261
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001262#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 case BTPROTO_SCO:
1264 {
1265 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1266 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1267 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001268#endif
1269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 default:
1271 PyErr_SetString(PyExc_ValueError,
1272 "Unknown Bluetooth protocol");
1273 return NULL;
1274 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001275#endif
1276
Antoine Pitroub156a462010-10-27 20:13:57 +00001277#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 case AF_PACKET:
1279 {
1280 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1281 char *ifname = "";
1282 struct ifreq ifr;
1283 /* need to look up interface name give index */
1284 if (a->sll_ifindex) {
1285 ifr.ifr_ifindex = a->sll_ifindex;
1286 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1287 ifname = ifr.ifr_name;
1288 }
1289 return Py_BuildValue("shbhy#",
1290 ifname,
1291 ntohs(a->sll_protocol),
1292 a->sll_pkttype,
1293 a->sll_hatype,
1294 a->sll_addr,
1295 a->sll_halen);
1296 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001297#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001298
Christian Heimes043d6f62008-01-07 17:19:16 +00001299#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 case AF_TIPC:
1301 {
1302 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1303 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1304 return Py_BuildValue("IIIII",
1305 a->addrtype,
1306 a->addr.nameseq.type,
1307 a->addr.nameseq.lower,
1308 a->addr.nameseq.upper,
1309 a->scope);
1310 } else if (a->addrtype == TIPC_ADDR_NAME) {
1311 return Py_BuildValue("IIIII",
1312 a->addrtype,
1313 a->addr.name.name.type,
1314 a->addr.name.name.instance,
1315 a->addr.name.name.instance,
1316 a->scope);
1317 } else if (a->addrtype == TIPC_ADDR_ID) {
1318 return Py_BuildValue("IIIII",
1319 a->addrtype,
1320 a->addr.id.node,
1321 a->addr.id.ref,
1322 0,
1323 a->scope);
1324 } else {
1325 PyErr_SetString(PyExc_ValueError,
1326 "Invalid address type");
1327 return NULL;
1328 }
1329 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001330#endif
1331
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001332#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001333 case AF_CAN:
1334 {
1335 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1336 char *ifname = "";
1337 struct ifreq ifr;
1338 /* need to look up interface name given index */
1339 if (a->can_ifindex) {
1340 ifr.ifr_ifindex = a->can_ifindex;
1341 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1342 ifname = ifr.ifr_name;
1343 }
1344
1345 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1346 ifname,
1347 a->can_family);
1348 }
1349#endif
1350
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001351#ifdef PF_SYSTEM
1352 case PF_SYSTEM:
1353 switch(proto) {
1354#ifdef SYSPROTO_CONTROL
1355 case SYSPROTO_CONTROL:
1356 {
1357 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1358 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1359 }
1360#endif
1361 default:
1362 PyErr_SetString(PyExc_ValueError,
1363 "Invalid address type");
1364 return 0;
1365 }
1366#endif
1367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 default:
1371 /* If we don't know the address family, don't raise an
1372 exception -- return it as an (int, bytes) tuple. */
1373 return Py_BuildValue("iy#",
1374 addr->sa_family,
1375 addr->sa_data,
1376 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379}
1380
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001381/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1382 (in particular, numeric IP addresses). */
1383struct maybe_idna {
1384 PyObject *obj;
1385 char *buf;
1386};
1387
1388static void
1389idna_cleanup(struct maybe_idna *data)
1390{
1391 Py_CLEAR(data->obj);
1392}
1393
1394static int
1395idna_converter(PyObject *obj, struct maybe_idna *data)
1396{
1397 size_t len;
1398 PyObject *obj2, *obj3;
1399 if (obj == NULL) {
1400 idna_cleanup(data);
1401 return 1;
1402 }
1403 data->obj = NULL;
1404 len = -1;
1405 if (PyBytes_Check(obj)) {
1406 data->buf = PyBytes_AsString(obj);
1407 len = PyBytes_Size(obj);
1408 }
1409 else if (PyByteArray_Check(obj)) {
1410 data->buf = PyByteArray_AsString(obj);
1411 len = PyByteArray_Size(obj);
1412 }
1413 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1414 data->buf = PyUnicode_DATA(obj);
1415 len = PyUnicode_GET_LENGTH(obj);
1416 }
1417 else {
1418 obj2 = PyUnicode_FromObject(obj);
1419 if (!obj2) {
1420 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1421 obj->ob_type->tp_name);
1422 return 0;
1423 }
1424 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1425 Py_DECREF(obj2);
1426 if (!obj3) {
1427 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1428 return 0;
1429 }
1430 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001431 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001432 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1433 return 0;
1434 }
1435 data->obj = obj3;
1436 data->buf = PyBytes_AS_STRING(obj3);
1437 len = PyBytes_GET_SIZE(obj3);
1438 }
1439 if (strlen(data->buf) != len) {
1440 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001441 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001442 return 0;
1443 }
1444 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001445}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001446
1447/* Parse a socket address argument according to the socket object's
1448 address family. Return 1 if the address was in the proper format,
1449 0 of not. The address is returned through addr_ret, its length
1450 through len_ret. */
1451
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001452static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001453getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001457
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001458#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 case AF_UNIX:
1460 {
1461 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001462 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001463 int retval = 0;
1464
1465 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1466 allow embedded nulls on Linux. */
1467 if (PyUnicode_Check(args)) {
1468 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1469 return 0;
1470 }
1471 else
1472 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001473 if (!PyArg_Parse(args, "y*", &path)) {
1474 Py_DECREF(args);
1475 return retval;
1476 }
1477 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001480#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001481 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001483 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001484 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001486 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 }
1488 }
1489 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001490#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 {
1492 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001493 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001494 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001496 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001498 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 }
1500 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001501 memcpy(addr->sun_path, path.buf, path.len);
1502 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001503 retval = 1;
1504 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001505 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001506 Py_DECREF(args);
1507 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001509#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001510
Martin v. Löwis11017b12006-01-14 18:12:57 +00001511#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 case AF_NETLINK:
1513 {
1514 struct sockaddr_nl* addr;
1515 int pid, groups;
1516 addr = (struct sockaddr_nl *)addr_ret;
1517 if (!PyTuple_Check(args)) {
1518 PyErr_Format(
1519 PyExc_TypeError,
1520 "getsockaddrarg: "
1521 "AF_NETLINK address must be tuple, not %.500s",
1522 Py_TYPE(args)->tp_name);
1523 return 0;
1524 }
1525 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1526 return 0;
1527 addr->nl_family = AF_NETLINK;
1528 addr->nl_pid = pid;
1529 addr->nl_groups = groups;
1530 *len_ret = sizeof(*addr);
1531 return 1;
1532 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001533#endif
1534
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001535#ifdef AF_RDS
1536 case AF_RDS:
1537 /* RDS sockets use sockaddr_in: fall-through */
1538#endif
1539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 case AF_INET:
1541 {
1542 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001543 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 int port, result;
1545 if (!PyTuple_Check(args)) {
1546 PyErr_Format(
1547 PyExc_TypeError,
1548 "getsockaddrarg: "
1549 "AF_INET address must be tuple, not %.500s",
1550 Py_TYPE(args)->tp_name);
1551 return 0;
1552 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001553 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1554 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 return 0;
1556 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001557 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001559 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 if (result < 0)
1561 return 0;
1562 if (port < 0 || port > 0xffff) {
1563 PyErr_SetString(
1564 PyExc_OverflowError,
1565 "getsockaddrarg: port must be 0-65535.");
1566 return 0;
1567 }
1568 addr->sin_family = AF_INET;
1569 addr->sin_port = htons((short)port);
1570 *len_ret = sizeof *addr;
1571 return 1;
1572 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001573
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001574#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 case AF_INET6:
1576 {
1577 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001578 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001579 int port, result;
1580 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 flowinfo = scope_id = 0;
1582 if (!PyTuple_Check(args)) {
1583 PyErr_Format(
1584 PyExc_TypeError,
1585 "getsockaddrarg: "
1586 "AF_INET6 address must be tuple, not %.500s",
1587 Py_TYPE(args)->tp_name);
1588 return 0;
1589 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001590 if (!PyArg_ParseTuple(args, "O&i|II",
1591 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 &scope_id)) {
1593 return 0;
1594 }
1595 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001596 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001598 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 if (result < 0)
1600 return 0;
1601 if (port < 0 || port > 0xffff) {
1602 PyErr_SetString(
1603 PyExc_OverflowError,
1604 "getsockaddrarg: port must be 0-65535.");
1605 return 0;
1606 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001607 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001608 PyErr_SetString(
1609 PyExc_OverflowError,
1610 "getsockaddrarg: flowinfo must be 0-1048575.");
1611 return 0;
1612 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 addr->sin6_family = s->sock_family;
1614 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001615 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 addr->sin6_scope_id = scope_id;
1617 *len_ret = sizeof *addr;
1618 return 1;
1619 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001620#endif
1621
Hye-Shik Chang81268602004-02-02 06:05:24 +00001622#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 case AF_BLUETOOTH:
1624 {
1625 switch (s->sock_proto) {
1626 case BTPROTO_L2CAP:
1627 {
1628 struct sockaddr_l2 *addr;
1629 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 addr = (struct sockaddr_l2 *)addr_ret;
1632 memset(addr, 0, sizeof(struct sockaddr_l2));
1633 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1634 if (!PyArg_ParseTuple(args, "si", &straddr,
1635 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001636 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 "wrong format");
1638 return 0;
1639 }
1640 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1641 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 *len_ret = sizeof *addr;
1644 return 1;
1645 }
1646 case BTPROTO_RFCOMM:
1647 {
1648 struct sockaddr_rc *addr;
1649 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 addr = (struct sockaddr_rc *)addr_ret;
1652 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1653 if (!PyArg_ParseTuple(args, "si", &straddr,
1654 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001655 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 "wrong format");
1657 return 0;
1658 }
1659 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1660 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 *len_ret = sizeof *addr;
1663 return 1;
1664 }
1665 case BTPROTO_HCI:
1666 {
1667 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001668#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001669 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001670
Alexander Belopolskye239d232010-12-08 23:31:48 +00001671 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001672 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001673 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001674 "wrong format");
1675 return 0;
1676 }
1677 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1678 return 0;
1679#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1681 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001682 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 "wrong format");
1684 return 0;
1685 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 *len_ret = sizeof *addr;
1688 return 1;
1689 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001690#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 case BTPROTO_SCO:
1692 {
1693 struct sockaddr_sco *addr;
1694 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 addr = (struct sockaddr_sco *)addr_ret;
1697 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1698 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001699 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 "wrong format");
1701 return 0;
1702 }
1703 straddr = PyBytes_AS_STRING(args);
1704 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1705 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 *len_ret = sizeof *addr;
1708 return 1;
1709 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001712 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return 0;
1714 }
1715 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001716#endif
1717
Antoine Pitroub156a462010-10-27 20:13:57 +00001718#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 case AF_PACKET:
1720 {
1721 struct sockaddr_ll* addr;
1722 struct ifreq ifr;
1723 char *interfaceName;
1724 int protoNumber;
1725 int hatype = 0;
1726 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001727 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 if (!PyTuple_Check(args)) {
1730 PyErr_Format(
1731 PyExc_TypeError,
1732 "getsockaddrarg: "
1733 "AF_PACKET address must be tuple, not %.500s",
1734 Py_TYPE(args)->tp_name);
1735 return 0;
1736 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001737 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001739 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 return 0;
1741 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1742 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1743 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1744 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001745 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 return 0;
1747 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001748 if (haddr.buf && haddr.len > 8) {
1749 PyErr_SetString(PyExc_ValueError,
1750 "Hardware address must be 8 bytes or less");
1751 PyBuffer_Release(&haddr);
1752 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 }
1754 if (protoNumber < 0 || protoNumber > 0xffff) {
1755 PyErr_SetString(
1756 PyExc_OverflowError,
1757 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001758 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 return 0;
1760 }
1761 addr = (struct sockaddr_ll*)addr_ret;
1762 addr->sll_family = AF_PACKET;
1763 addr->sll_protocol = htons((short)protoNumber);
1764 addr->sll_ifindex = ifr.ifr_ifindex;
1765 addr->sll_pkttype = pkttype;
1766 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001767 if (haddr.buf) {
1768 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1769 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001771 else
1772 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001774 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 return 1;
1776 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001777#endif
1778
Christian Heimes043d6f62008-01-07 17:19:16 +00001779#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 case AF_TIPC:
1781 {
1782 unsigned int atype, v1, v2, v3;
1783 unsigned int scope = TIPC_CLUSTER_SCOPE;
1784 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 if (!PyTuple_Check(args)) {
1787 PyErr_Format(
1788 PyExc_TypeError,
1789 "getsockaddrarg: "
1790 "AF_TIPC address must be tuple, not %.500s",
1791 Py_TYPE(args)->tp_name);
1792 return 0;
1793 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 if (!PyArg_ParseTuple(args,
1796 "IIII|I;Invalid TIPC address format",
1797 &atype, &v1, &v2, &v3, &scope))
1798 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 addr = (struct sockaddr_tipc *) addr_ret;
1801 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 addr->family = AF_TIPC;
1804 addr->scope = scope;
1805 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 if (atype == TIPC_ADDR_NAMESEQ) {
1808 addr->addr.nameseq.type = v1;
1809 addr->addr.nameseq.lower = v2;
1810 addr->addr.nameseq.upper = v3;
1811 } else if (atype == TIPC_ADDR_NAME) {
1812 addr->addr.name.name.type = v1;
1813 addr->addr.name.name.instance = v2;
1814 } else if (atype == TIPC_ADDR_ID) {
1815 addr->addr.id.node = v1;
1816 addr->addr.id.ref = v2;
1817 } else {
1818 /* Shouldn't happen */
1819 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1820 return 0;
1821 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 return 1;
1826 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001827#endif
1828
Vinay Sajiped6783f2014-03-21 11:44:32 +00001829#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001830 case AF_CAN:
1831 switch (s->sock_proto) {
1832 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001833 /* fall-through */
1834 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001835 {
1836 struct sockaddr_can *addr;
1837 PyObject *interfaceName;
1838 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001839 Py_ssize_t len;
1840
Benjamin Peterson18b71912013-05-16 15:29:44 -05001841 addr = (struct sockaddr_can *)addr_ret;
1842
Charles-François Natali47413c12011-10-06 19:47:44 +02001843 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1844 &interfaceName))
1845 return 0;
1846
1847 len = PyBytes_GET_SIZE(interfaceName);
1848
1849 if (len == 0) {
1850 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001851 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001852 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1853 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001854 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1855 s->errorhandler();
1856 Py_DECREF(interfaceName);
1857 return 0;
1858 }
1859 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001860 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001861 "AF_CAN interface name too long");
1862 Py_DECREF(interfaceName);
1863 return 0;
1864 }
1865
1866 addr->can_family = AF_CAN;
1867 addr->can_ifindex = ifr.ifr_ifindex;
1868
1869 *len_ret = sizeof(*addr);
1870 Py_DECREF(interfaceName);
1871 return 1;
1872 }
1873 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001874 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001875 "getsockaddrarg: unsupported CAN protocol");
1876 return 0;
1877 }
1878#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001879
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001880#ifdef PF_SYSTEM
1881 case PF_SYSTEM:
1882 switch (s->sock_proto) {
1883#ifdef SYSPROTO_CONTROL
1884 case SYSPROTO_CONTROL:
1885 {
1886 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001887
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001888 addr = (struct sockaddr_ctl *)addr_ret;
1889 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001890 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001891
1892 if (PyUnicode_Check(args)) {
1893 struct ctl_info info;
1894 PyObject *ctl_name;
1895
1896 if (!PyArg_Parse(args, "O&",
1897 PyUnicode_FSConverter, &ctl_name)) {
1898 return 0;
1899 }
1900
Victor Stinnerf50e1872015-03-20 11:32:24 +01001901 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001902 PyErr_SetString(PyExc_ValueError,
1903 "provided string is too long");
1904 Py_DECREF(ctl_name);
1905 return 0;
1906 }
1907 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1908 sizeof(info.ctl_name));
1909 Py_DECREF(ctl_name);
1910
1911 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1912 PyErr_SetString(PyExc_OSError,
1913 "cannot find kernel control with provided name");
1914 return 0;
1915 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001916
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001917 addr->sc_id = info.ctl_id;
1918 addr->sc_unit = 0;
1919 } else if (!PyArg_ParseTuple(args, "II",
1920 &(addr->sc_id), &(addr->sc_unit))) {
1921 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1922 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001923
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001924 return 0;
1925 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001926
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001927 *len_ret = sizeof(*addr);
1928 return 1;
1929 }
1930#endif
1931 default:
1932 PyErr_SetString(PyExc_OSError,
1933 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1934 return 0;
1935 }
1936#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001941 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001945}
1946
Guido van Rossum30a685f1991-06-27 15:51:29 +00001947
Guido van Rossum48a680c2001-03-02 06:34:14 +00001948/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001949 Return 1 if the family is known, 0 otherwise. The length is returned
1950 through len_ret. */
1951
1952static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001953getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001956
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001957#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 case AF_UNIX:
1959 {
1960 *len_ret = sizeof (struct sockaddr_un);
1961 return 1;
1962 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001963#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001964#if defined(AF_NETLINK)
1965 case AF_NETLINK:
1966 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 *len_ret = sizeof (struct sockaddr_nl);
1968 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001969 }
1970#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001971
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001972#ifdef AF_RDS
1973 case AF_RDS:
1974 /* RDS sockets use sockaddr_in: fall-through */
1975#endif
1976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 case AF_INET:
1978 {
1979 *len_ret = sizeof (struct sockaddr_in);
1980 return 1;
1981 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001982
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001983#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 case AF_INET6:
1985 {
1986 *len_ret = sizeof (struct sockaddr_in6);
1987 return 1;
1988 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001989#endif
1990
Hye-Shik Chang81268602004-02-02 06:05:24 +00001991#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 case AF_BLUETOOTH:
1993 {
1994 switch(s->sock_proto)
1995 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 case BTPROTO_L2CAP:
1998 *len_ret = sizeof (struct sockaddr_l2);
1999 return 1;
2000 case BTPROTO_RFCOMM:
2001 *len_ret = sizeof (struct sockaddr_rc);
2002 return 1;
2003 case BTPROTO_HCI:
2004 *len_ret = sizeof (struct sockaddr_hci);
2005 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002006#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 case BTPROTO_SCO:
2008 *len_ret = sizeof (struct sockaddr_sco);
2009 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002012 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 "unknown BT protocol");
2014 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 }
2017 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002018#endif
2019
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002020#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 case AF_PACKET:
2022 {
2023 *len_ret = sizeof (struct sockaddr_ll);
2024 return 1;
2025 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002026#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002027
Christian Heimes043d6f62008-01-07 17:19:16 +00002028#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 case AF_TIPC:
2030 {
2031 *len_ret = sizeof (struct sockaddr_tipc);
2032 return 1;
2033 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002034#endif
2035
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002036#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002037 case AF_CAN:
2038 {
2039 *len_ret = sizeof (struct sockaddr_can);
2040 return 1;
2041 }
2042#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002043
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002044#ifdef PF_SYSTEM
2045 case PF_SYSTEM:
2046 switch(s->sock_proto) {
2047#ifdef SYSPROTO_CONTROL
2048 case SYSPROTO_CONTROL:
2049 *len_ret = sizeof (struct sockaddr_ctl);
2050 return 1;
2051#endif
2052 default:
2053 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2054 "unknown PF_SYSTEM protocol");
2055 return 0;
2056 }
2057#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002062 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002066}
2067
2068
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002069/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2070 Currently, these methods are only compiled if the RFC 2292/3542
2071 CMSG_LEN() macro is available. Older systems seem to have used
2072 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2073 it may be possible to define CMSG_LEN() that way if it's not
2074 provided. Some architectures might need extra padding after the
2075 cmsghdr, however, and CMSG_LEN() would have to take account of
2076 this. */
2077#ifdef CMSG_LEN
2078/* If length is in range, set *result to CMSG_LEN(length) and return
2079 true; otherwise, return false. */
2080static int
2081get_CMSG_LEN(size_t length, size_t *result)
2082{
2083 size_t tmp;
2084
2085 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2086 return 0;
2087 tmp = CMSG_LEN(length);
2088 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2089 return 0;
2090 *result = tmp;
2091 return 1;
2092}
2093
2094#ifdef CMSG_SPACE
2095/* If length is in range, set *result to CMSG_SPACE(length) and return
2096 true; otherwise, return false. */
2097static int
2098get_CMSG_SPACE(size_t length, size_t *result)
2099{
2100 size_t tmp;
2101
2102 /* Use CMSG_SPACE(1) here in order to take account of the padding
2103 necessary before *and* after the data. */
2104 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2105 return 0;
2106 tmp = CMSG_SPACE(length);
2107 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2108 return 0;
2109 *result = tmp;
2110 return 1;
2111}
2112#endif
2113
2114/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2115 pointer in msg->msg_control with at least "space" bytes after it,
2116 and its cmsg_len member inside the buffer. */
2117static int
2118cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2119{
2120 size_t cmsg_offset;
2121 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2122 sizeof(cmsgh->cmsg_len));
2123
Charles-François Natali466517d2011-08-28 18:23:43 +02002124 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002125 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002126 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002127 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2128 annoying under OS X as it's unsigned there and so it triggers a
2129 tautological comparison warning under Clang when compared against 0.
2130 Since the check is valid on other platforms, silence the warning under
2131 Clang. */
2132 #ifdef __clang__
2133 #pragma clang diagnostic push
2134 #pragma clang diagnostic ignored "-Wtautological-compare"
2135 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002136 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002137 #pragma GCC diagnostic push
2138 #pragma GCC diagnostic ignored "-Wtype-limits"
2139 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002140 if (msg->msg_controllen < 0)
2141 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002142 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002143 #pragma GCC diagnostic pop
2144 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002145 #ifdef __clang__
2146 #pragma clang diagnostic pop
2147 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002148 if (space < cmsg_len_end)
2149 space = cmsg_len_end;
2150 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2151 return (cmsg_offset <= (size_t)-1 - space &&
2152 cmsg_offset + space <= msg->msg_controllen);
2153}
2154
2155/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2156 *space to number of bytes following it in the buffer and return
2157 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2158 msg->msg_controllen are valid. */
2159static int
2160get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2161{
2162 size_t data_offset;
2163 char *data_ptr;
2164
2165 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2166 return 0;
2167 data_offset = data_ptr - (char *)msg->msg_control;
2168 if (data_offset > msg->msg_controllen)
2169 return 0;
2170 *space = msg->msg_controllen - data_offset;
2171 return 1;
2172}
2173
2174/* If cmsgh is invalid or not contained in the buffer pointed to by
2175 msg->msg_control, return -1. If cmsgh is valid and its associated
2176 data is entirely contained in the buffer, set *data_len to the
2177 length of the associated data and return 0. If only part of the
2178 associated data is contained in the buffer but cmsgh is otherwise
2179 valid, set *data_len to the length contained in the buffer and
2180 return 1. */
2181static int
2182get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2183{
2184 size_t space, cmsg_data_len;
2185
2186 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2187 cmsgh->cmsg_len < CMSG_LEN(0))
2188 return -1;
2189 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2190 if (!get_cmsg_data_space(msg, cmsgh, &space))
2191 return -1;
2192 if (space >= cmsg_data_len) {
2193 *data_len = cmsg_data_len;
2194 return 0;
2195 }
2196 *data_len = space;
2197 return 1;
2198}
2199#endif /* CMSG_LEN */
2200
2201
Victor Stinner31bf2d52015-04-01 21:57:09 +02002202struct sock_accept {
2203 socklen_t *addrlen;
2204 sock_addr_t *addrbuf;
2205 SOCKET_T result;
2206};
2207
2208#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2209/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2210static int accept4_works = -1;
2211#endif
2212
2213static int
2214sock_accept_impl(PySocketSockObject *s, void *data)
2215{
2216 struct sock_accept *ctx = data;
2217
2218#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2219 if (accept4_works != 0) {
2220 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2221 SOCK_CLOEXEC);
2222 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2223 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2224 accept4_works = (errno != ENOSYS);
2225 }
2226 }
2227 if (accept4_works == 0)
2228 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2229#else
2230 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2231#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002232
2233#ifdef MS_WINDOWS
2234 return (ctx->result != INVALID_SOCKET);
2235#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002236 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002237#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002238}
2239
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002240/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002241
Guido van Rossum73624e91994-10-10 17:59:00 +00002242static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002243sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002246 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 socklen_t addrlen;
2248 PyObject *sock = NULL;
2249 PyObject *addr = NULL;
2250 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002251 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 if (!getsockaddrlen(s, &addrlen))
2254 return NULL;
2255 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 if (!IS_SELECTABLE(s))
2258 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002259
Victor Stinner31bf2d52015-04-01 21:57:09 +02002260 ctx.addrlen = &addrlen;
2261 ctx.addrbuf = &addrbuf;
2262 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002264 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002265
Victor Stinnerdaf45552013-08-28 00:53:59 +02002266#ifdef MS_WINDOWS
2267 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2268 PyErr_SetFromWindowsErr(0);
2269 SOCKETCLOSE(newfd);
2270 goto finally;
2271 }
2272#else
2273
2274#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2275 if (!accept4_works)
2276#endif
2277 {
2278 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2279 SOCKETCLOSE(newfd);
2280 goto finally;
2281 }
2282 }
2283#endif
2284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 sock = PyLong_FromSocket_t(newfd);
2286 if (sock == NULL) {
2287 SOCKETCLOSE(newfd);
2288 goto finally;
2289 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2292 addrlen, s->sock_proto);
2293 if (addr == NULL)
2294 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002297
Guido van Rossum67f7a382002-06-06 21:08:16 +00002298finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 Py_XDECREF(sock);
2300 Py_XDECREF(addr);
2301 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002302}
2303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002304PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002305"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002306\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002307Wait for an incoming connection. Return a new socket file descriptor\n\
2308representing the connection, and the address of the client.\n\
2309For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002310
Guido van Rossum11ba0942002-06-13 15:07:44 +00002311/* s.setblocking(flag) method. Argument:
2312 False -- non-blocking mode; same as settimeout(0)
2313 True -- blocking mode; same as settimeout(None)
2314*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002315
Guido van Rossum73624e91994-10-10 17:59:00 +00002316static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002317sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002318{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002319 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 block = PyLong_AsLong(arg);
2322 if (block == -1 && PyErr_Occurred())
2323 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324
Victor Stinner9001d802015-04-06 23:06:01 +02002325 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 Py_INCREF(Py_None);
2329 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002330}
Guido van Rossume4485b01994-09-07 14:32:49 +00002331
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333"setblocking(flag)\n\
2334\n\
2335Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002336setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002337setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002338
Victor Stinner71694d52015-03-28 01:18:54 +01002339static int
2340socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2341{
2342#ifdef MS_WINDOWS
2343 struct timeval tv;
2344#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002345#ifndef HAVE_POLL
2346 _PyTime_t ms;
2347#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002348 int overflow = 0;
2349
2350 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002351 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002352 return 0;
2353 }
2354
Victor Stinner869e1772015-03-30 03:49:14 +02002355 if (_PyTime_FromSecondsObject(timeout,
2356 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002357 return -1;
2358
2359 if (*timeout < 0) {
2360 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2361 return -1;
2362 }
2363
2364#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002365 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002366#endif
2367#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002368 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2369 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002370#endif
2371 if (overflow) {
2372 PyErr_SetString(PyExc_OverflowError,
2373 "timeout doesn't fit into C timeval");
2374 return -1;
2375 }
2376
2377 return 0;
2378}
2379
Guido van Rossum11ba0942002-06-13 15:07:44 +00002380/* s.settimeout(timeout) method. Argument:
2381 None -- no timeout, blocking mode; same as setblocking(True)
2382 0.0 -- non-blocking mode; same as setblocking(False)
2383 > 0 -- timeout mode; operations time out after timeout seconds
2384 < 0 -- illegal; raises an exception
2385*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002386static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002387sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002388{
Victor Stinner71694d52015-03-28 01:18:54 +01002389 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002390
Victor Stinner71694d52015-03-28 01:18:54 +01002391 if (socket_parse_timeout(&timeout, arg) < 0)
2392 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002395 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 Py_INCREF(Py_None);
2398 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399}
2400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002401PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002402"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002403\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002404Set a timeout on socket operations. 'timeout' can be a float,\n\
2405giving in seconds, or None. Setting a timeout of None disables\n\
2406the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002408
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002409/* s.gettimeout() method.
2410 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002411static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002412sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002413{
Victor Stinner71694d52015-03-28 01:18:54 +01002414 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 Py_INCREF(Py_None);
2416 return Py_None;
2417 }
Victor Stinner71694d52015-03-28 01:18:54 +01002418 else {
2419 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2420 return PyFloat_FromDouble(seconds);
2421 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002422}
2423
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002424PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002425"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002426\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002427Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002428operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002430
Guido van Rossumaee08791992-09-08 09:05:33 +00002431/* s.setsockopt() method.
2432 With an integer third argument, sets an integer option.
2433 With a string third argument, sets an option from a buffer;
2434 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002435
Guido van Rossum73624e91994-10-10 17:59:00 +00002436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002437sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 int level;
2440 int optname;
2441 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002442 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 if (PyArg_ParseTuple(args, "iii:setsockopt",
2446 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002447 res = setsockopt(s->sock_fd, level, optname,
2448 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 }
2450 else {
2451 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002452 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2453 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002455 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2456 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 if (res < 0)
2459 return s->errorhandler();
2460 Py_INCREF(Py_None);
2461 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002462}
2463
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002464PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002465"setsockopt(level, option, value)\n\
2466\n\
2467Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002468The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002469
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002470
Guido van Rossumaee08791992-09-08 09:05:33 +00002471/* s.getsockopt() method.
2472 With two arguments, retrieves an integer option.
2473 With a third integer argument, retrieves a string buffer of that size;
2474 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002475
Guido van Rossum73624e91994-10-10 17:59:00 +00002476static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002477sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 int level;
2480 int optname;
2481 int res;
2482 PyObject *buf;
2483 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2486 &level, &optname, &buflen))
2487 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 if (buflen == 0) {
2490 int flag = 0;
2491 socklen_t flagsize = sizeof flag;
2492 res = getsockopt(s->sock_fd, level, optname,
2493 (void *)&flag, &flagsize);
2494 if (res < 0)
2495 return s->errorhandler();
2496 return PyLong_FromLong(flag);
2497 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002499 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 "getsockopt buflen out of range");
2501 return NULL;
2502 }
2503 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2504 if (buf == NULL)
2505 return NULL;
2506 res = getsockopt(s->sock_fd, level, optname,
2507 (void *)PyBytes_AS_STRING(buf), &buflen);
2508 if (res < 0) {
2509 Py_DECREF(buf);
2510 return s->errorhandler();
2511 }
2512 _PyBytes_Resize(&buf, buflen);
2513 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002514}
2515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002516PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002517"getsockopt(level, option[, buffersize]) -> value\n\
2518\n\
2519Get a socket option. See the Unix manual for level and option.\n\
2520If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002523
Fred Drake728819a2000-07-01 03:40:12 +00002524/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002525
Guido van Rossum73624e91994-10-10 17:59:00 +00002526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 sock_addr_t addrbuf;
2530 int addrlen;
2531 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2534 return NULL;
2535 Py_BEGIN_ALLOW_THREADS
2536 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2537 Py_END_ALLOW_THREADS
2538 if (res < 0)
2539 return s->errorhandler();
2540 Py_INCREF(Py_None);
2541 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002542}
2543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545"bind(address)\n\
2546\n\
2547Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002548pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002549sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002550
Guido van Rossum30a685f1991-06-27 15:51:29 +00002551
2552/* s.close() method.
2553 Set the file descriptor to -1 so operations tried subsequently
2554 will surely fail. */
2555
Guido van Rossum73624e91994-10-10 17:59:00 +00002556static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002557sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002560
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002561 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2562 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2563 * for more details.
2564 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 if ((fd = s->sock_fd) != -1) {
2566 s->sock_fd = -1;
2567 Py_BEGIN_ALLOW_THREADS
2568 (void) SOCKETCLOSE(fd);
2569 Py_END_ALLOW_THREADS
2570 }
2571 Py_INCREF(Py_None);
2572 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576"close()\n\
2577\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002578Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002580static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002581sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002582{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002583 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002584 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002585 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002586}
2587
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002588PyDoc_STRVAR(detach_doc,
2589"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002590\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002591Close the socket object without closing the underlying file descriptor.\n\
2592The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002593can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002594
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002595static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002596sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002597{
Victor Stinner81c41db2015-04-02 11:50:57 +02002598 int err;
2599 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002600
Victor Stinner81c41db2015-04-02 11:50:57 +02002601 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2602 /* getsockopt() failed */
2603 return 0;
2604 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002605
Victor Stinner81c41db2015-04-02 11:50:57 +02002606 if (err == EISCONN)
2607 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002608 if (err != 0) {
2609 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2610 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002611 return 0;
2612 }
2613 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002614}
2615
2616static int
2617internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2618 int raise)
2619{
2620 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002621
2622 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002624 Py_END_ALLOW_THREADS
2625
Victor Stinner70a46f62015-03-31 22:03:59 +02002626 if (!res) {
2627 /* connect() succeeded, the socket is connected */
2628 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002630
Victor Stinner81c41db2015-04-02 11:50:57 +02002631 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002632
Victor Stinner81c41db2015-04-02 11:50:57 +02002633 /* save error, PyErr_CheckSignals() can replace it */
2634 err = GET_SOCK_ERROR;
2635 if (CHECK_ERRNO(EINTR)) {
2636 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002637 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002638
2639 /* Issue #23618: when connect() fails with EINTR, the connection is
2640 running asynchronously.
2641
2642 If the socket is blocking or has a timeout, wait until the
2643 connection completes, fails or timed out using select(), and then
2644 get the connection status using getsockopt(SO_ERROR).
2645
2646 If the socket is non-blocking, raise InterruptedError. The caller is
2647 responsible to wait until the connection completes, fails or timed
2648 out (it's the case in asyncio for example). */
2649 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2650 }
2651 else {
2652 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2653 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002654 }
2655
Victor Stinner81c41db2015-04-02 11:50:57 +02002656 if (!wait_connect) {
2657 if (raise) {
2658 /* restore error, maybe replaced by PyErr_CheckSignals() */
2659 SET_SOCK_ERROR(err);
2660 s->errorhandler();
2661 return -1;
2662 }
2663 else
2664 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002665 }
2666
Victor Stinner81c41db2015-04-02 11:50:57 +02002667 if (raise) {
2668 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002669 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2670 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002671 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002672 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002673 else {
2674 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002675 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2676 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002677 return err;
2678 }
2679 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002680}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002681
Fred Drake728819a2000-07-01 03:40:12 +00002682/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002683
Guido van Rossum73624e91994-10-10 17:59:00 +00002684static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002685sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 sock_addr_t addrbuf;
2688 int addrlen;
2689 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2692 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002693
Victor Stinner81c41db2015-04-02 11:50:57 +02002694 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002695 if (res < 0)
2696 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002697
Victor Stinneree699e92015-03-31 21:28:42 +02002698 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002699}
2700
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002701PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002702"connect(address)\n\
2703\n\
2704Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002705is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706
Guido van Rossum30a685f1991-06-27 15:51:29 +00002707
Fred Drake728819a2000-07-01 03:40:12 +00002708/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002709
2710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002711sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 sock_addr_t addrbuf;
2714 int addrlen;
2715 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2718 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002719
Victor Stinner81c41db2015-04-02 11:50:57 +02002720 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002721 if (res < 0)
2722 return NULL;
2723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002725}
2726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002727PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002728"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002729\n\
2730This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002732
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002733
Guido van Rossumed233a51992-06-23 09:07:03 +00002734/* s.fileno() method */
2735
Guido van Rossum73624e91994-10-10 17:59:00 +00002736static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002737sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002740}
2741
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002742PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002743"fileno() -> integer\n\
2744\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002746
Guido van Rossumed233a51992-06-23 09:07:03 +00002747
Guido van Rossumc89705d1992-11-26 08:54:07 +00002748/* s.getsockname() method */
2749
Guido van Rossum73624e91994-10-10 17:59:00 +00002750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 sock_addr_t addrbuf;
2754 int res;
2755 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (!getsockaddrlen(s, &addrlen))
2758 return NULL;
2759 memset(&addrbuf, 0, addrlen);
2760 Py_BEGIN_ALLOW_THREADS
2761 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2762 Py_END_ALLOW_THREADS
2763 if (res < 0)
2764 return s->errorhandler();
2765 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2766 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002767}
2768
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002769PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002770"getsockname() -> address info\n\
2771\n\
2772Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002773info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002774
Guido van Rossumc89705d1992-11-26 08:54:07 +00002775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002777/* s.getpeername() method */
2778
Guido van Rossum73624e91994-10-10 17:59:00 +00002779static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002780sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 sock_addr_t addrbuf;
2783 int res;
2784 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 if (!getsockaddrlen(s, &addrlen))
2787 return NULL;
2788 memset(&addrbuf, 0, addrlen);
2789 Py_BEGIN_ALLOW_THREADS
2790 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2791 Py_END_ALLOW_THREADS
2792 if (res < 0)
2793 return s->errorhandler();
2794 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2795 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002796}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002799"getpeername() -> address info\n\
2800\n\
2801Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002802info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002803
Guido van Rossumb6775db1994-08-01 11:34:53 +00002804#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002805
2806
Guido van Rossum30a685f1991-06-27 15:51:29 +00002807/* s.listen(n) method */
2808
Guido van Rossum73624e91994-10-10 17:59:00 +00002809static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002810sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002811{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002812 /* We try to choose a default backlog high enough to avoid connection drops
2813 * for common workloads, yet not too high to limit resource usage. */
2814 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002816
Charles-François Natali644b8f52014-05-22 19:45:39 +01002817 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002821 /* To avoid problems on systems that don't allow a negative backlog
2822 * (which doesn't make sense anyway) we force a minimum value of 0. */
2823 if (backlog < 0)
2824 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 res = listen(s->sock_fd, backlog);
2826 Py_END_ALLOW_THREADS
2827 if (res < 0)
2828 return s->errorhandler();
2829 Py_INCREF(Py_None);
2830 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002831}
2832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002833PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002834"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002835\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002836Enable a server to accept connections. If backlog is specified, it must be\n\
2837at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002838unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002839connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002840
Victor Stinner31bf2d52015-04-01 21:57:09 +02002841struct sock_recv {
2842 char *cbuf;
2843 Py_ssize_t len;
2844 int flags;
2845 Py_ssize_t result;
2846};
2847
2848static int
2849sock_recv_impl(PySocketSockObject *s, void *data)
2850{
2851 struct sock_recv *ctx = data;
2852
2853#ifdef MS_WINDOWS
2854 if (ctx->len > INT_MAX)
2855 ctx->len = INT_MAX;
2856 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2857#else
2858 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2859#endif
2860 return (ctx->result >= 0);
2861}
2862
Guido van Rossum82a5c661998-07-07 20:45:43 +00002863
Thomas Wouters477c8d52006-05-27 19:21:47 +00002864/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002865 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002866 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002867 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002868 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002869 * also possible that we return a number of bytes smaller than the request
2870 * bytes.
2871 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002872
Antoine Pitrou19467d22010-08-17 19:33:30 +00002873static Py_ssize_t
2874sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002875{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002876 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 if (!IS_SELECTABLE(s)) {
2879 select_error();
2880 return -1;
2881 }
2882 if (len == 0) {
2883 /* If 0 bytes were requested, do nothing. */
2884 return 0;
2885 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002886
Victor Stinner31bf2d52015-04-01 21:57:09 +02002887 ctx.cbuf = cbuf;
2888 ctx.len = len;
2889 ctx.flags = flags;
2890 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002892
2893 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002894}
2895
Guido van Rossum48a680c2001-03-02 06:34:14 +00002896
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002897/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002898
Guido van Rossum73624e91994-10-10 17:59:00 +00002899static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002900sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002901{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002902 Py_ssize_t recvlen, outlen;
2903 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002905
Antoine Pitrou19467d22010-08-17 19:33:30 +00002906 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 if (recvlen < 0) {
2910 PyErr_SetString(PyExc_ValueError,
2911 "negative buffersize in recv");
2912 return NULL;
2913 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 /* Allocate a new string. */
2916 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2917 if (buf == NULL)
2918 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 /* Call the guts */
2921 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2922 if (outlen < 0) {
2923 /* An error occurred, release the string and return an
2924 error. */
2925 Py_DECREF(buf);
2926 return NULL;
2927 }
2928 if (outlen != recvlen) {
2929 /* We did not read as many bytes as we anticipated, resize the
2930 string if possible and be successful. */
2931 _PyBytes_Resize(&buf, outlen);
2932 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002935}
2936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002937PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002938"recv(buffersize[, flags]) -> data\n\
2939\n\
2940Receive up to buffersize bytes from the socket. For the optional flags\n\
2941argument, see the Unix manual. When no data is available, block until\n\
2942at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002943the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002944
Guido van Rossum30a685f1991-06-27 15:51:29 +00002945
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002946/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002947
Thomas Wouters477c8d52006-05-27 19:21:47 +00002948static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002949sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002952
Antoine Pitrou19467d22010-08-17 19:33:30 +00002953 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 Py_buffer pbuf;
2955 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002956 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002959 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 &pbuf, &recvlen, &flags))
2961 return NULL;
2962 buf = pbuf.buf;
2963 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 if (recvlen < 0) {
2966 PyBuffer_Release(&pbuf);
2967 PyErr_SetString(PyExc_ValueError,
2968 "negative buffersize in recv_into");
2969 return NULL;
2970 }
2971 if (recvlen == 0) {
2972 /* If nbytes was not specified, use the buffer's length */
2973 recvlen = buflen;
2974 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 /* Check if the buffer is large enough */
2977 if (buflen < recvlen) {
2978 PyBuffer_Release(&pbuf);
2979 PyErr_SetString(PyExc_ValueError,
2980 "buffer too small for requested bytes");
2981 return NULL;
2982 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 /* Call the guts */
2985 readlen = sock_recv_guts(s, buf, recvlen, flags);
2986 if (readlen < 0) {
2987 /* Return an error. */
2988 PyBuffer_Release(&pbuf);
2989 return NULL;
2990 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 PyBuffer_Release(&pbuf);
2993 /* Return the number of bytes read. Note that we do not do anything
2994 special here in the case that readlen < recvlen. */
2995 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002996}
2997
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002998PyDoc_STRVAR(recv_into_doc,
2999"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003000\n\
3001A version of recv() that stores its data into a buffer rather than creating \n\
3002a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3003is not specified (or 0), receive up to the size available in the given buffer.\n\
3004\n\
3005See recv() for documentation about the flags.");
3006
Victor Stinner31bf2d52015-04-01 21:57:09 +02003007struct sock_recvfrom {
3008 char* cbuf;
3009 Py_ssize_t len;
3010 int flags;
3011 socklen_t *addrlen;
3012 sock_addr_t *addrbuf;
3013 Py_ssize_t result;
3014};
3015
3016static int
3017sock_recvfrom_impl(PySocketSockObject *s, void *data)
3018{
3019 struct sock_recvfrom *ctx = data;
3020
3021 memset(ctx->addrbuf, 0, *ctx->addrlen);
3022
3023#ifdef MS_WINDOWS
3024 if (ctx->len > INT_MAX)
3025 ctx->len = INT_MAX;
3026 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3027 SAS2SA(ctx->addrbuf), ctx->addrlen);
3028#else
3029 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3030 SAS2SA(ctx->addrbuf), ctx->addrlen);
3031#endif
3032 return (ctx->result >= 0);
3033}
3034
Thomas Wouters477c8d52006-05-27 19:21:47 +00003035
3036/*
Christian Heimes99170a52007-12-19 02:07:34 +00003037 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3038 * into a char buffer. If you have any inc/def ref to do to the objects that
3039 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003040 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003041 * that it is also possible that we return a number of bytes smaller than the
3042 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003043 *
3044 * 'addr' is a return value for the address object. Note that you must decref
3045 * it yourself.
3046 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003047static Py_ssize_t
3048sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003053 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 if (!getsockaddrlen(s, &addrlen))
3058 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 if (!IS_SELECTABLE(s)) {
3061 select_error();
3062 return -1;
3063 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003064
Victor Stinner31bf2d52015-04-01 21:57:09 +02003065 ctx.cbuf = cbuf;
3066 ctx.len = len;
3067 ctx.flags = flags;
3068 ctx.addrbuf = &addrbuf;
3069 ctx.addrlen = &addrlen;
3070 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003072
Victor Stinner31bf2d52015-04-01 21:57:09 +02003073 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3074 s->sock_proto);
3075 if (*addr == NULL)
3076 return -1;
3077
3078 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003079}
3080
3081/* s.recvfrom(nbytes [,flags]) method */
3082
3083static PyObject *
3084sock_recvfrom(PySocketSockObject *s, PyObject *args)
3085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 PyObject *buf = NULL;
3087 PyObject *addr = NULL;
3088 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003089 int flags = 0;
3090 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003091
Antoine Pitrou19467d22010-08-17 19:33:30 +00003092 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 if (recvlen < 0) {
3096 PyErr_SetString(PyExc_ValueError,
3097 "negative buffersize in recvfrom");
3098 return NULL;
3099 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3102 if (buf == NULL)
3103 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3106 recvlen, flags, &addr);
3107 if (outlen < 0) {
3108 goto finally;
3109 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 if (outlen != recvlen) {
3112 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003113 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003115 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 goto finally;
3117 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003120
3121finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 Py_XDECREF(buf);
3123 Py_XDECREF(addr);
3124 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003125}
3126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003127PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003128"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3129\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003130Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003131
Thomas Wouters477c8d52006-05-27 19:21:47 +00003132
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003133/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003134
3135static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003136sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003139
Antoine Pitrou19467d22010-08-17 19:33:30 +00003140 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 Py_buffer pbuf;
3142 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003143 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003146
Antoine Pitrou19467d22010-08-17 19:33:30 +00003147 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 kwlist, &pbuf,
3149 &recvlen, &flags))
3150 return NULL;
3151 buf = pbuf.buf;
3152 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 if (recvlen < 0) {
3155 PyBuffer_Release(&pbuf);
3156 PyErr_SetString(PyExc_ValueError,
3157 "negative buffersize in recvfrom_into");
3158 return NULL;
3159 }
3160 if (recvlen == 0) {
3161 /* If nbytes was not specified, use the buffer's length */
3162 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003163 } else if (recvlen > buflen) {
3164 PyBuffer_Release(&pbuf);
3165 PyErr_SetString(PyExc_ValueError,
3166 "nbytes is greater than the length of the buffer");
3167 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3171 if (readlen < 0) {
3172 PyBuffer_Release(&pbuf);
3173 /* Return an error */
3174 Py_XDECREF(addr);
3175 return NULL;
3176 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 PyBuffer_Release(&pbuf);
3179 /* Return the number of bytes read and the address. Note that we do
3180 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003181 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003182}
3183
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003184PyDoc_STRVAR(recvfrom_into_doc,
3185"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003186\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003187Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003188
Victor Stinner35bee932015-04-02 12:28:07 +02003189/* The sendmsg() and recvmsg[_into]() methods require a working
3190 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3191#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003192struct sock_recvmsg {
3193 struct msghdr *msg;
3194 int flags;
3195 ssize_t result;
3196};
3197
3198static int
3199sock_recvmsg_impl(PySocketSockObject *s, void *data)
3200{
3201 struct sock_recvmsg *ctx = data;
3202
3203 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3204 return (ctx->result >= 0);
3205}
3206
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003207/*
3208 * Call recvmsg() with the supplied iovec structures, flags, and
3209 * ancillary data buffer size (controllen). Returns the tuple return
3210 * value for recvmsg() or recvmsg_into(), with the first item provided
3211 * by the supplied makeval() function. makeval() will be called with
3212 * the length read and makeval_data as arguments, and must return a
3213 * new reference (which will be decrefed if there is a subsequent
3214 * error). On error, closes any file descriptors received via
3215 * SCM_RIGHTS.
3216 */
3217static PyObject *
3218sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3219 int flags, Py_ssize_t controllen,
3220 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3221{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003222 sock_addr_t addrbuf;
3223 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003224 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003225 PyObject *cmsg_list = NULL, *retval = NULL;
3226 void *controlbuf = NULL;
3227 struct cmsghdr *cmsgh;
3228 size_t cmsgdatalen = 0;
3229 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003230 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003231
3232 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3233 ignored" when the socket is connected (Linux fills them in
3234 anyway for AF_UNIX sockets at least). Normally msg_namelen
3235 seems to be set to 0 if there's no address, but try to
3236 initialize msg_name to something that won't be mistaken for a
3237 real address if that doesn't happen. */
3238 if (!getsockaddrlen(s, &addrbuflen))
3239 return NULL;
3240 memset(&addrbuf, 0, addrbuflen);
3241 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3242
3243 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3244 PyErr_SetString(PyExc_ValueError,
3245 "invalid ancillary data buffer length");
3246 return NULL;
3247 }
3248 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3249 return PyErr_NoMemory();
3250
3251 /* Make the system call. */
3252 if (!IS_SELECTABLE(s)) {
3253 select_error();
3254 goto finally;
3255 }
3256
Victor Stinner31bf2d52015-04-01 21:57:09 +02003257 msg.msg_name = SAS2SA(&addrbuf);
3258 msg.msg_namelen = addrbuflen;
3259 msg.msg_iov = iov;
3260 msg.msg_iovlen = iovlen;
3261 msg.msg_control = controlbuf;
3262 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003263
Victor Stinner31bf2d52015-04-01 21:57:09 +02003264 ctx.msg = &msg;
3265 ctx.flags = flags;
3266 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003267 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003268
3269 /* Make list of (level, type, data) tuples from control messages. */
3270 if ((cmsg_list = PyList_New(0)) == NULL)
3271 goto err_closefds;
3272 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3273 implementations didn't do so. */
3274 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3275 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3276 PyObject *bytes, *tuple;
3277 int tmp;
3278
3279 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3280 if (cmsg_status != 0) {
3281 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3282 "received malformed or improperly-truncated "
3283 "ancillary data", 1) == -1)
3284 goto err_closefds;
3285 }
3286 if (cmsg_status < 0)
3287 break;
3288 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003289 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003290 goto err_closefds;
3291 }
3292
3293 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3294 cmsgdatalen);
3295 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3296 (int)cmsgh->cmsg_type, bytes);
3297 if (tuple == NULL)
3298 goto err_closefds;
3299 tmp = PyList_Append(cmsg_list, tuple);
3300 Py_DECREF(tuple);
3301 if (tmp != 0)
3302 goto err_closefds;
3303
3304 if (cmsg_status != 0)
3305 break;
3306 }
3307
3308 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003309 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003310 cmsg_list,
3311 (int)msg.msg_flags,
3312 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3313 ((msg.msg_namelen > addrbuflen) ?
3314 addrbuflen : msg.msg_namelen),
3315 s->sock_proto));
3316 if (retval == NULL)
3317 goto err_closefds;
3318
3319finally:
3320 Py_XDECREF(cmsg_list);
3321 PyMem_Free(controlbuf);
3322 return retval;
3323
3324err_closefds:
3325#ifdef SCM_RIGHTS
3326 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3327 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3328 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3329 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3330 if (cmsg_status < 0)
3331 break;
3332 if (cmsgh->cmsg_level == SOL_SOCKET &&
3333 cmsgh->cmsg_type == SCM_RIGHTS) {
3334 size_t numfds;
3335 int *fdp;
3336
3337 numfds = cmsgdatalen / sizeof(int);
3338 fdp = (int *)CMSG_DATA(cmsgh);
3339 while (numfds-- > 0)
3340 close(*fdp++);
3341 }
3342 if (cmsg_status != 0)
3343 break;
3344 }
3345#endif /* SCM_RIGHTS */
3346 goto finally;
3347}
3348
3349
3350static PyObject *
3351makeval_recvmsg(ssize_t received, void *data)
3352{
3353 PyObject **buf = data;
3354
3355 if (received < PyBytes_GET_SIZE(*buf))
3356 _PyBytes_Resize(buf, received);
3357 Py_XINCREF(*buf);
3358 return *buf;
3359}
3360
3361/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3362
3363static PyObject *
3364sock_recvmsg(PySocketSockObject *s, PyObject *args)
3365{
3366 Py_ssize_t bufsize, ancbufsize = 0;
3367 int flags = 0;
3368 struct iovec iov;
3369 PyObject *buf = NULL, *retval = NULL;
3370
3371 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3372 return NULL;
3373
3374 if (bufsize < 0) {
3375 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3376 return NULL;
3377 }
3378 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3379 return NULL;
3380 iov.iov_base = PyBytes_AS_STRING(buf);
3381 iov.iov_len = bufsize;
3382
3383 /* Note that we're passing a pointer to *our pointer* to the bytes
3384 object here (&buf); makeval_recvmsg() may incref the object, or
3385 deallocate it and set our pointer to NULL. */
3386 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3387 &makeval_recvmsg, &buf);
3388 Py_XDECREF(buf);
3389 return retval;
3390}
3391
3392PyDoc_STRVAR(recvmsg_doc,
3393"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3394\n\
3395Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3396socket. The ancbufsize argument sets the size in bytes of the\n\
3397internal buffer used to receive the ancillary data; it defaults to 0,\n\
3398meaning that no ancillary data will be received. Appropriate buffer\n\
3399sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3400CMSG_LEN(), and items which do not fit into the buffer might be\n\
3401truncated or discarded. The flags argument defaults to 0 and has the\n\
3402same meaning as for recv().\n\
3403\n\
3404The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3405The data item is a bytes object holding the non-ancillary data\n\
3406received. The ancdata item is a list of zero or more tuples\n\
3407(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3408(control messages) received: cmsg_level and cmsg_type are integers\n\
3409specifying the protocol level and protocol-specific type respectively,\n\
3410and cmsg_data is a bytes object holding the associated data. The\n\
3411msg_flags item is the bitwise OR of various flags indicating\n\
3412conditions on the received message; see your system documentation for\n\
3413details. If the receiving socket is unconnected, address is the\n\
3414address of the sending socket, if available; otherwise, its value is\n\
3415unspecified.\n\
3416\n\
3417If recvmsg() raises an exception after the system call returns, it\n\
3418will first attempt to close any file descriptors received via the\n\
3419SCM_RIGHTS mechanism.");
3420
3421
3422static PyObject *
3423makeval_recvmsg_into(ssize_t received, void *data)
3424{
3425 return PyLong_FromSsize_t(received);
3426}
3427
3428/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3429
3430static PyObject *
3431sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3432{
3433 Py_ssize_t ancbufsize = 0;
3434 int flags = 0;
3435 struct iovec *iovs = NULL;
3436 Py_ssize_t i, nitems, nbufs = 0;
3437 Py_buffer *bufs = NULL;
3438 PyObject *buffers_arg, *fast, *retval = NULL;
3439
3440 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3441 &buffers_arg, &ancbufsize, &flags))
3442 return NULL;
3443
3444 if ((fast = PySequence_Fast(buffers_arg,
3445 "recvmsg_into() argument 1 must be an "
3446 "iterable")) == NULL)
3447 return NULL;
3448 nitems = PySequence_Fast_GET_SIZE(fast);
3449 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003450 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451 goto finally;
3452 }
3453
3454 /* Fill in an iovec for each item, and save the Py_buffer
3455 structs to release afterwards. */
3456 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3457 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3458 PyErr_NoMemory();
3459 goto finally;
3460 }
3461 for (; nbufs < nitems; nbufs++) {
3462 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3463 "w*;recvmsg_into() argument 1 must be an iterable "
3464 "of single-segment read-write buffers",
3465 &bufs[nbufs]))
3466 goto finally;
3467 iovs[nbufs].iov_base = bufs[nbufs].buf;
3468 iovs[nbufs].iov_len = bufs[nbufs].len;
3469 }
3470
3471 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3472 &makeval_recvmsg_into, NULL);
3473finally:
3474 for (i = 0; i < nbufs; i++)
3475 PyBuffer_Release(&bufs[i]);
3476 PyMem_Free(bufs);
3477 PyMem_Free(iovs);
3478 Py_DECREF(fast);
3479 return retval;
3480}
3481
3482PyDoc_STRVAR(recvmsg_into_doc,
3483"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3484\n\
3485Receive normal data and ancillary data from the socket, scattering the\n\
3486non-ancillary data into a series of buffers. The buffers argument\n\
3487must be an iterable of objects that export writable buffers\n\
3488(e.g. bytearray objects); these will be filled with successive chunks\n\
3489of the non-ancillary data until it has all been written or there are\n\
3490no more buffers. The ancbufsize argument sets the size in bytes of\n\
3491the internal buffer used to receive the ancillary data; it defaults to\n\
34920, meaning that no ancillary data will be received. Appropriate\n\
3493buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3494or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3495truncated or discarded. The flags argument defaults to 0 and has the\n\
3496same meaning as for recv().\n\
3497\n\
3498The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3499The nbytes item is the total number of bytes of non-ancillary data\n\
3500written into the buffers. The ancdata item is a list of zero or more\n\
3501tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3502data (control messages) received: cmsg_level and cmsg_type are\n\
3503integers specifying the protocol level and protocol-specific type\n\
3504respectively, and cmsg_data is a bytes object holding the associated\n\
3505data. The msg_flags item is the bitwise OR of various flags\n\
3506indicating conditions on the received message; see your system\n\
3507documentation for details. If the receiving socket is unconnected,\n\
3508address is the address of the sending socket, if available; otherwise,\n\
3509its value is unspecified.\n\
3510\n\
3511If recvmsg_into() raises an exception after the system call returns,\n\
3512it will first attempt to close any file descriptors received via the\n\
3513SCM_RIGHTS mechanism.");
3514#endif /* CMSG_LEN */
3515
3516
Victor Stinner31bf2d52015-04-01 21:57:09 +02003517struct sock_send {
3518 char *buf;
3519 Py_ssize_t len;
3520 int flags;
3521 Py_ssize_t result;
3522};
3523
3524static int
3525sock_send_impl(PySocketSockObject *s, void *data)
3526{
3527 struct sock_send *ctx = data;
3528
3529#ifdef MS_WINDOWS
3530 if (ctx->len > INT_MAX)
3531 ctx->len = INT_MAX;
3532 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3533#else
3534 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3535#endif
3536 return (ctx->result >= 0);
3537}
3538
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003539/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003540
Guido van Rossum73624e91994-10-10 17:59:00 +00003541static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003542sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003543{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003544 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003546 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3549 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 if (!IS_SELECTABLE(s)) {
3552 PyBuffer_Release(&pbuf);
3553 return select_error();
3554 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003555 ctx.buf = pbuf.buf;
3556 ctx.len = pbuf.len;
3557 ctx.flags = flags;
3558 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003559 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 return NULL;
3561 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003562 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003563
3564 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003565}
3566
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003567PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003568"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003569\n\
3570Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003571argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003572sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003573
3574
3575/* s.sendall(data [,flags]) method */
3576
3577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003578sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003581 Py_ssize_t len, n;
3582 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003584 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003585 int has_timeout = (s->sock_timeout > 0);
3586 _PyTime_t interval = s->sock_timeout;
3587 _PyTime_t deadline = 0;
3588 int deadline_initialized = 0;
3589 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3592 return NULL;
3593 buf = pbuf.buf;
3594 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 if (!IS_SELECTABLE(s)) {
3597 PyBuffer_Release(&pbuf);
3598 return select_error();
3599 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003602 if (has_timeout) {
3603 if (deadline_initialized) {
3604 /* recompute the timeout */
3605 interval = deadline - _PyTime_GetMonotonicClock();
3606 }
3607 else {
3608 deadline_initialized = 1;
3609 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3610 }
3611
3612 if (interval <= 0) {
3613 PyErr_SetString(socket_timeout, "timed out");
3614 goto done;
3615 }
3616 }
3617
Victor Stinner02f32ab2015-04-01 22:53:26 +02003618 ctx.buf = buf;
3619 ctx.len = len;
3620 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003621 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3622 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003623 n = ctx.result;
3624 assert(n >= 0);
3625
3626 buf += n;
3627 len -= n;
3628
3629 /* We must run our signal handlers before looping again.
3630 send() can return a successful partial write when it is
3631 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003632 if (PyErr_CheckSignals())
3633 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003634 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003636
Victor Stinner8912d142015-04-06 23:16:34 +02003637 Py_INCREF(Py_None);
3638 res = Py_None;
3639
3640done:
3641 PyBuffer_Release(&pbuf);
3642 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003643}
3644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003645PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003646"sendall(data[, flags])\n\
3647\n\
3648Send a data string to the socket. For the optional flags\n\
3649argument, see the Unix manual. This calls send() repeatedly\n\
3650until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003651to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003652
Guido van Rossum30a685f1991-06-27 15:51:29 +00003653
Victor Stinner31bf2d52015-04-01 21:57:09 +02003654struct sock_sendto {
3655 char *buf;
3656 Py_ssize_t len;
3657 int flags;
3658 int addrlen;
3659 sock_addr_t *addrbuf;
3660 Py_ssize_t result;
3661};
3662
3663static int
3664sock_sendto_impl(PySocketSockObject *s, void *data)
3665{
3666 struct sock_sendto *ctx = data;
3667
3668#ifdef MS_WINDOWS
3669 if (ctx->len > INT_MAX)
3670 ctx->len = INT_MAX;
3671 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3672 SAS2SA(ctx->addrbuf), ctx->addrlen);
3673#else
3674 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3675 SAS2SA(ctx->addrbuf), ctx->addrlen);
3676#endif
3677 return (ctx->result >= 0);
3678}
3679
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003680/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003681
Guido van Rossum73624e91994-10-10 17:59:00 +00003682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003683sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 Py_buffer pbuf;
3686 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003687 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003689 int addrlen, flags;
3690 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003693 arglen = PyTuple_Size(args);
3694 switch (arglen) {
3695 case 2:
3696 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3697 break;
3698 case 3:
3699 PyArg_ParseTuple(args, "y*iO:sendto",
3700 &pbuf, &flags, &addro);
3701 break;
3702 default:
3703 PyErr_Format(PyExc_TypeError,
3704 "sendto() takes 2 or 3 arguments (%d given)",
3705 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003706 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003708 if (PyErr_Occurred())
3709 return NULL;
3710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 if (!IS_SELECTABLE(s)) {
3712 PyBuffer_Release(&pbuf);
3713 return select_error();
3714 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3717 PyBuffer_Release(&pbuf);
3718 return NULL;
3719 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003720
Victor Stinner31bf2d52015-04-01 21:57:09 +02003721 ctx.buf = pbuf.buf;
3722 ctx.len = pbuf.len;
3723 ctx.flags = flags;
3724 ctx.addrlen = addrlen;
3725 ctx.addrbuf = &addrbuf;
3726 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003727 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 return NULL;
3729 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003730 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003731
3732 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003733}
3734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003735PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003736"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003737\n\
3738Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003739For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003740
Guido van Rossum30a685f1991-06-27 15:51:29 +00003741
Victor Stinner35bee932015-04-02 12:28:07 +02003742/* The sendmsg() and recvmsg[_into]() methods require a working
3743 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3744#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003745struct sock_sendmsg {
3746 struct msghdr *msg;
3747 int flags;
3748 ssize_t result;
3749};
3750
3751static int
3752sock_sendmsg_impl(PySocketSockObject *s, void *data)
3753{
3754 struct sock_sendmsg *ctx = data;
3755
3756 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3757 return (ctx->result >= 0);
3758}
3759
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003760/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3761
3762static PyObject *
3763sock_sendmsg(PySocketSockObject *s, PyObject *args)
3764{
3765 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3766 Py_buffer *databufs = NULL;
3767 struct iovec *iovs = NULL;
3768 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003769 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003770 struct cmsginfo {
3771 int level;
3772 int type;
3773 Py_buffer data;
3774 } *cmsgs = NULL;
3775 void *controlbuf = NULL;
3776 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003777 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003778 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3779 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003780 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003781
3782 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3783 &data_arg, &cmsg_arg, &flags, &addr_arg))
3784 return NULL;
3785
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003786 /* Parse destination address. */
3787 if (addr_arg != NULL && addr_arg != Py_None) {
3788 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3789 goto finally;
3790 msg.msg_name = &addrbuf;
3791 msg.msg_namelen = addrlen;
3792 }
3793
3794 /* Fill in an iovec for each message part, and save the Py_buffer
3795 structs to release afterwards. */
3796 if ((data_fast = PySequence_Fast(data_arg,
3797 "sendmsg() argument 1 must be an "
3798 "iterable")) == NULL)
3799 goto finally;
3800 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3801 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003802 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803 goto finally;
3804 }
3805 msg.msg_iovlen = ndataparts;
3806 if (ndataparts > 0 &&
3807 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3808 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3809 PyErr_NoMemory();
3810 goto finally;
3811 }
3812 for (; ndatabufs < ndataparts; ndatabufs++) {
3813 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3814 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003815 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003816 &databufs[ndatabufs]))
3817 goto finally;
3818 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3819 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3820 }
3821
3822 if (cmsg_arg == NULL)
3823 ncmsgs = 0;
3824 else {
3825 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3826 "sendmsg() argument 2 must be an "
3827 "iterable")) == NULL)
3828 goto finally;
3829 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3830 }
3831
3832#ifndef CMSG_SPACE
3833 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003834 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003835 "sending multiple control messages is not supported "
3836 "on this system");
3837 goto finally;
3838 }
3839#endif
3840 /* Save level, type and Py_buffer for each control message,
3841 and calculate total size. */
3842 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3843 PyErr_NoMemory();
3844 goto finally;
3845 }
3846 controllen = controllen_last = 0;
3847 while (ncmsgbufs < ncmsgs) {
3848 size_t bufsize, space;
3849
3850 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3851 "(iiy*):[sendmsg() ancillary data items]",
3852 &cmsgs[ncmsgbufs].level,
3853 &cmsgs[ncmsgbufs].type,
3854 &cmsgs[ncmsgbufs].data))
3855 goto finally;
3856 bufsize = cmsgs[ncmsgbufs++].data.len;
3857
3858#ifdef CMSG_SPACE
3859 if (!get_CMSG_SPACE(bufsize, &space)) {
3860#else
3861 if (!get_CMSG_LEN(bufsize, &space)) {
3862#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003863 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864 goto finally;
3865 }
3866 controllen += space;
3867 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003868 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869 goto finally;
3870 }
3871 controllen_last = controllen;
3872 }
3873
3874 /* Construct ancillary data block from control message info. */
3875 if (ncmsgbufs > 0) {
3876 struct cmsghdr *cmsgh = NULL;
3877
3878 if ((msg.msg_control = controlbuf =
3879 PyMem_Malloc(controllen)) == NULL) {
3880 PyErr_NoMemory();
3881 goto finally;
3882 }
3883 msg.msg_controllen = controllen;
3884
3885 /* Need to zero out the buffer as a workaround for glibc's
3886 CMSG_NXTHDR() implementation. After getting the pointer to
3887 the next header, it checks its (uninitialized) cmsg_len
3888 member to see if the "message" fits in the buffer, and
3889 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003890 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003891 memset(controlbuf, 0, controllen);
3892
3893 for (i = 0; i < ncmsgbufs; i++) {
3894 size_t msg_len, data_len = cmsgs[i].data.len;
3895 int enough_space = 0;
3896
3897 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3898 if (cmsgh == NULL) {
3899 PyErr_Format(PyExc_RuntimeError,
3900 "unexpected NULL result from %s()",
3901 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3902 goto finally;
3903 }
3904 if (!get_CMSG_LEN(data_len, &msg_len)) {
3905 PyErr_SetString(PyExc_RuntimeError,
3906 "item size out of range for CMSG_LEN()");
3907 goto finally;
3908 }
3909 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3910 size_t space;
3911
3912 cmsgh->cmsg_len = msg_len;
3913 if (get_cmsg_data_space(&msg, cmsgh, &space))
3914 enough_space = (space >= data_len);
3915 }
3916 if (!enough_space) {
3917 PyErr_SetString(PyExc_RuntimeError,
3918 "ancillary data does not fit in calculated "
3919 "space");
3920 goto finally;
3921 }
3922 cmsgh->cmsg_level = cmsgs[i].level;
3923 cmsgh->cmsg_type = cmsgs[i].type;
3924 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3925 }
3926 }
3927
3928 /* Make the system call. */
3929 if (!IS_SELECTABLE(s)) {
3930 select_error();
3931 goto finally;
3932 }
3933
Victor Stinner31bf2d52015-04-01 21:57:09 +02003934 ctx.msg = &msg;
3935 ctx.flags = flags;
3936 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003937 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003938
3939 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003940
3941finally:
3942 PyMem_Free(controlbuf);
3943 for (i = 0; i < ncmsgbufs; i++)
3944 PyBuffer_Release(&cmsgs[i].data);
3945 PyMem_Free(cmsgs);
3946 Py_XDECREF(cmsg_fast);
3947 for (i = 0; i < ndatabufs; i++)
3948 PyBuffer_Release(&databufs[i]);
3949 PyMem_Free(databufs);
3950 PyMem_Free(iovs);
3951 Py_XDECREF(data_fast);
3952 return retval;
3953}
3954
3955PyDoc_STRVAR(sendmsg_doc,
3956"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3957\n\
3958Send normal and ancillary data to the socket, gathering the\n\
3959non-ancillary data from a series of buffers and concatenating it into\n\
3960a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003961data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003962The ancdata argument specifies the ancillary data (control messages)\n\
3963as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3964cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3965protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003966is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967argument defaults to 0 and has the same meaning as for send(). If\n\
3968address is supplied and not None, it sets a destination address for\n\
3969the message. The return value is the number of bytes of non-ancillary\n\
3970data sent.");
3971#endif /* CMSG_LEN */
3972
3973
Guido van Rossum30a685f1991-06-27 15:51:29 +00003974/* s.shutdown(how) method */
3975
Guido van Rossum73624e91994-10-10 17:59:00 +00003976static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003977sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 int how;
3980 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003981
Serhiy Storchaka78980432013-01-15 01:12:17 +02003982 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 if (how == -1 && PyErr_Occurred())
3984 return NULL;
3985 Py_BEGIN_ALLOW_THREADS
3986 res = shutdown(s->sock_fd, how);
3987 Py_END_ALLOW_THREADS
3988 if (res < 0)
3989 return s->errorhandler();
3990 Py_INCREF(Py_None);
3991 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003992}
3993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003994PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003995"shutdown(flag)\n\
3996\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003997Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3998of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003999
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004000#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004001static PyObject*
4002sock_ioctl(PySocketSockObject *s, PyObject *arg)
4003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 unsigned long cmd = SIO_RCVALL;
4005 PyObject *argO;
4006 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4009 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 switch (cmd) {
4012 case SIO_RCVALL: {
4013 unsigned int option = RCVALL_ON;
4014 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4015 return NULL;
4016 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4017 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4018 return set_error();
4019 }
4020 return PyLong_FromUnsignedLong(recv); }
4021 case SIO_KEEPALIVE_VALS: {
4022 struct tcp_keepalive ka;
4023 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4024 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4025 return NULL;
4026 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4027 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4028 return set_error();
4029 }
4030 return PyLong_FromUnsignedLong(recv); }
4031 default:
4032 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4033 return NULL;
4034 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004035}
4036PyDoc_STRVAR(sock_ioctl_doc,
4037"ioctl(cmd, option) -> long\n\
4038\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004039Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4040SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4041SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004042#endif
4043
4044#if defined(MS_WINDOWS)
4045static PyObject*
4046sock_share(PySocketSockObject *s, PyObject *arg)
4047{
4048 WSAPROTOCOL_INFO info;
4049 DWORD processId;
4050 int result;
4051
4052 if (!PyArg_ParseTuple(arg, "I", &processId))
4053 return NULL;
4054
4055 Py_BEGIN_ALLOW_THREADS
4056 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4057 Py_END_ALLOW_THREADS
4058 if (result == SOCKET_ERROR)
4059 return set_error();
4060 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4061}
4062PyDoc_STRVAR(sock_share_doc,
4063"share(process_id) -> bytes\n\
4064\n\
4065Share the socket with another process. The target process id\n\
4066must be provided and the resulting bytes object passed to the target\n\
4067process. There the shared socket can be instantiated by calling\n\
4068socket.fromshare().");
4069
Christian Heimesfaf2f632008-01-06 16:59:19 +00004070
4071#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004072
4073/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004074
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004075static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4077 accept_doc},
4078 {"bind", (PyCFunction)sock_bind, METH_O,
4079 bind_doc},
4080 {"close", (PyCFunction)sock_close, METH_NOARGS,
4081 close_doc},
4082 {"connect", (PyCFunction)sock_connect, METH_O,
4083 connect_doc},
4084 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4085 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004086 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4087 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4089 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004090#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 {"getpeername", (PyCFunction)sock_getpeername,
4092 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 {"getsockname", (PyCFunction)sock_getsockname,
4095 METH_NOARGS, getsockname_doc},
4096 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4097 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004098#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4100 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004101#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004102#if defined(MS_WINDOWS)
4103 {"share", (PyCFunction)sock_share, METH_VARARGS,
4104 sock_share_doc},
4105#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004106 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004107 listen_doc},
4108 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4109 recv_doc},
4110 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4111 recv_into_doc},
4112 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4113 recvfrom_doc},
4114 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4115 recvfrom_into_doc},
4116 {"send", (PyCFunction)sock_send, METH_VARARGS,
4117 send_doc},
4118 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4119 sendall_doc},
4120 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4121 sendto_doc},
4122 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4123 setblocking_doc},
4124 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4125 settimeout_doc},
4126 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4127 gettimeout_doc},
4128 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4129 setsockopt_doc},
4130 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4131 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004132#ifdef CMSG_LEN
4133 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4134 recvmsg_doc},
4135 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4136 recvmsg_into_doc,},
4137 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4138 sendmsg_doc},
4139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004141};
4142
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004143/* SockObject members */
4144static PyMemberDef sock_memberlist[] = {
4145 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4146 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4147 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004148 {0},
4149};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004150
Victor Stinner71694d52015-03-28 01:18:54 +01004151static PyGetSetDef sock_getsetlist[] = {
4152 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4153 {NULL} /* sentinel */
4154};
4155
Guido van Rossum73624e91994-10-10 17:59:00 +00004156/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004157 First close the file description. */
4158
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004159static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004160sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004161{
Antoine Pitroue033e062010-10-29 10:38:18 +00004162 if (s->sock_fd != -1) {
4163 PyObject *exc, *val, *tb;
4164 Py_ssize_t old_refcount = Py_REFCNT(s);
4165 ++Py_REFCNT(s);
4166 PyErr_Fetch(&exc, &val, &tb);
4167 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4168 "unclosed %R", s))
4169 /* Spurious errors can appear at shutdown */
4170 if (PyErr_ExceptionMatches(PyExc_Warning))
4171 PyErr_WriteUnraisable((PyObject *) s);
4172 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004174 Py_REFCNT(s) = old_refcount;
4175 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004177}
4178
Guido van Rossum30a685f1991-06-27 15:51:29 +00004179
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004180static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004181sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004182{
Victor Stinnere254e532014-07-26 14:36:55 +02004183 long sock_fd;
4184 /* On Windows, this test is needed because SOCKET_T is unsigned */
4185 if (s->sock_fd == INVALID_SOCKET) {
4186 sock_fd = -1;
4187 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004188#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004189 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 /* this can occur on Win64, and actually there is a special
4191 ugly printf formatter for decimal pointer length integer
4192 printing, only bother if necessary*/
4193 PyErr_SetString(PyExc_OverflowError,
4194 "no printf formatter to display "
4195 "the socket descriptor in decimal");
4196 return NULL;
4197 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004198#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004199 else
4200 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 return PyUnicode_FromFormat(
4202 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004203 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 s->sock_type,
4205 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004206}
4207
4208
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004209/* Create a new, uninitialized socket object. */
4210
4211static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004212sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004216 new = type->tp_alloc(type, 0);
4217 if (new != NULL) {
4218 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner9001d802015-04-06 23:06:01 +02004219 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 ((PySocketSockObject *)new)->errorhandler = &set_error;
4221 }
4222 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004223}
4224
4225
4226/* Initialize a new socket object. */
4227
Victor Stinnerdaf45552013-08-28 00:53:59 +02004228#ifdef SOCK_CLOEXEC
4229/* socket() and socketpair() fail with EINVAL on Linux kernel older
4230 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4231static int sock_cloexec_works = -1;
4232#endif
4233
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004234/*ARGSUSED*/
4235static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004236sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 PySocketSockObject *s = (PySocketSockObject *)self;
4239 PyObject *fdobj = NULL;
4240 SOCKET_T fd = INVALID_SOCKET;
4241 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4242 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004243#ifndef MS_WINDOWS
4244#ifdef SOCK_CLOEXEC
4245 int *atomic_flag_works = &sock_cloexec_works;
4246#else
4247 int *atomic_flag_works = NULL;
4248#endif
4249#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4252 "|iiiO:socket", keywords,
4253 &family, &type, &proto, &fdobj))
4254 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004257#ifdef MS_WINDOWS
4258 /* recreate a socket that was duplicated */
4259 if (PyBytes_Check(fdobj)) {
4260 WSAPROTOCOL_INFO info;
4261 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4262 PyErr_Format(PyExc_ValueError,
4263 "socket descriptor string has wrong size, "
4264 "should be %zu bytes.", sizeof(info));
4265 return -1;
4266 }
4267 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4268 Py_BEGIN_ALLOW_THREADS
4269 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4270 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4271 Py_END_ALLOW_THREADS
4272 if (fd == INVALID_SOCKET) {
4273 set_error();
4274 return -1;
4275 }
4276 family = info.iAddressFamily;
4277 type = info.iSocketType;
4278 proto = info.iProtocol;
4279 }
4280 else
4281#endif
4282 {
4283 fd = PyLong_AsSocket_t(fdobj);
4284 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4285 return -1;
4286 if (fd == INVALID_SOCKET) {
4287 PyErr_SetString(PyExc_ValueError,
4288 "can't use invalid socket value");
4289 return -1;
4290 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 }
4292 }
4293 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004294#ifdef MS_WINDOWS
4295 /* Windows implementation */
4296#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4297#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4298#endif
4299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004301 if (support_wsa_no_inherit) {
4302 fd = WSASocket(family, type, proto,
4303 NULL, 0,
4304 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4305 if (fd == INVALID_SOCKET) {
4306 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4307 support_wsa_no_inherit = 0;
4308 fd = socket(family, type, proto);
4309 }
4310 }
4311 else {
4312 fd = socket(family, type, proto);
4313 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 if (fd == INVALID_SOCKET) {
4317 set_error();
4318 return -1;
4319 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004320
4321 if (!support_wsa_no_inherit) {
4322 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4323 closesocket(fd);
4324 PyErr_SetFromWindowsErr(0);
4325 return -1;
4326 }
4327 }
4328#else
4329 /* UNIX */
4330 Py_BEGIN_ALLOW_THREADS
4331#ifdef SOCK_CLOEXEC
4332 if (sock_cloexec_works != 0) {
4333 fd = socket(family, type | SOCK_CLOEXEC, proto);
4334 if (sock_cloexec_works == -1) {
4335 if (fd >= 0) {
4336 sock_cloexec_works = 1;
4337 }
4338 else if (errno == EINVAL) {
4339 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4340 sock_cloexec_works = 0;
4341 fd = socket(family, type, proto);
4342 }
4343 }
4344 }
4345 else
4346#endif
4347 {
4348 fd = socket(family, type, proto);
4349 }
4350 Py_END_ALLOW_THREADS
4351
4352 if (fd == INVALID_SOCKET) {
4353 set_error();
4354 return -1;
4355 }
4356
4357 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4358 SOCKETCLOSE(fd);
4359 return -1;
4360 }
4361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 }
4363 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004366
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004367}
4368
4369
Guido van Rossumb6775db1994-08-01 11:34:53 +00004370/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004371
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004372static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4374 "_socket.socket", /* tp_name */
4375 sizeof(PySocketSockObject), /* tp_basicsize */
4376 0, /* tp_itemsize */
4377 (destructor)sock_dealloc, /* tp_dealloc */
4378 0, /* tp_print */
4379 0, /* tp_getattr */
4380 0, /* tp_setattr */
4381 0, /* tp_reserved */
4382 (reprfunc)sock_repr, /* tp_repr */
4383 0, /* tp_as_number */
4384 0, /* tp_as_sequence */
4385 0, /* tp_as_mapping */
4386 0, /* tp_hash */
4387 0, /* tp_call */
4388 0, /* tp_str */
4389 PyObject_GenericGetAttr, /* tp_getattro */
4390 0, /* tp_setattro */
4391 0, /* tp_as_buffer */
4392 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4393 sock_doc, /* tp_doc */
4394 0, /* tp_traverse */
4395 0, /* tp_clear */
4396 0, /* tp_richcompare */
4397 0, /* tp_weaklistoffset */
4398 0, /* tp_iter */
4399 0, /* tp_iternext */
4400 sock_methods, /* tp_methods */
4401 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004402 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 0, /* tp_base */
4404 0, /* tp_dict */
4405 0, /* tp_descr_get */
4406 0, /* tp_descr_set */
4407 0, /* tp_dictoffset */
4408 sock_initobj, /* tp_init */
4409 PyType_GenericAlloc, /* tp_alloc */
4410 sock_new, /* tp_new */
4411 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004412};
4413
Guido van Rossum30a685f1991-06-27 15:51:29 +00004414
Guido van Rossum81194471991-07-27 21:42:02 +00004415/* Python interface to gethostname(). */
4416
4417/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004418static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004419socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004420{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004421#ifdef MS_WINDOWS
4422 /* Don't use winsock's gethostname, as this returns the ANSI
4423 version of the hostname, whereas we need a Unicode string.
4424 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004425 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004426 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004427 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004428 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004429
4430 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004431 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004432
4433 if (GetLastError() != ERROR_MORE_DATA)
4434 return PyErr_SetFromWindowsErr(0);
4435
4436 if (size == 0)
4437 return PyUnicode_New(0, 0);
4438
4439 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4440 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004441 name = PyMem_New(wchar_t, size);
4442 if (!name) {
4443 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004444 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004445 }
Victor Stinner74168972011-11-17 01:11:36 +01004446 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4447 name,
4448 &size))
4449 {
4450 PyMem_Free(name);
4451 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004452 }
Victor Stinner74168972011-11-17 01:11:36 +01004453
4454 result = PyUnicode_FromWideChar(name, size);
4455 PyMem_Free(name);
4456 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004457#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 char buf[1024];
4459 int res;
4460 Py_BEGIN_ALLOW_THREADS
4461 res = gethostname(buf, (int) sizeof buf - 1);
4462 Py_END_ALLOW_THREADS
4463 if (res < 0)
4464 return set_error();
4465 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004466 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004467#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004468}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004469
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004470PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004471"gethostname() -> string\n\
4472\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004473Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004474
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004475#ifdef HAVE_SETHOSTNAME
4476PyDoc_STRVAR(sethostname_doc,
4477"sethostname(name)\n\n\
4478Sets the hostname to name.");
4479
4480static PyObject *
4481socket_sethostname(PyObject *self, PyObject *args)
4482{
4483 PyObject *hnobj;
4484 Py_buffer buf;
4485 int res, flag = 0;
4486
Christian Heimesd2774c72013-06-19 02:06:29 +02004487#ifdef _AIX
4488/* issue #18259, not declared in any useful header file */
4489extern int sethostname(const char *, size_t);
4490#endif
4491
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004492 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4493 PyErr_Clear();
4494 if (!PyArg_ParseTuple(args, "O&:sethostname",
4495 PyUnicode_FSConverter, &hnobj))
4496 return NULL;
4497 flag = 1;
4498 }
4499 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4500 if (!res) {
4501 res = sethostname(buf.buf, buf.len);
4502 PyBuffer_Release(&buf);
4503 }
4504 if (flag)
4505 Py_DECREF(hnobj);
4506 if (res)
4507 return set_error();
4508 Py_RETURN_NONE;
4509}
4510#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004511
Guido van Rossum30a685f1991-06-27 15:51:29 +00004512/* Python interface to gethostbyname(name). */
4513
4514/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004516socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 char *name;
4519 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004520 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004521
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004522 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 return NULL;
4524 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004525 goto finally;
4526 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4527finally:
4528 PyMem_Free(name);
4529 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004530}
4531
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004532PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004533"gethostbyname(host) -> address\n\
4534\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004535Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004536
4537
Victor Stinner72400302016-01-28 15:41:01 +01004538static PyObject*
4539sock_decode_hostname(const char *name)
4540{
4541#ifdef MS_WINDOWS
4542 /* Issue #26227: gethostbyaddr() returns a string encoded
4543 * to the ANSI code page */
4544 return PyUnicode_DecodeFSDefault(name);
4545#else
4546 /* Decode from UTF-8 */
4547 return PyUnicode_FromString(name);
4548#endif
4549}
4550
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004551/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4552
4553static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004554gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 char **pch;
4557 PyObject *rtn_tuple = (PyObject *)NULL;
4558 PyObject *name_list = (PyObject *)NULL;
4559 PyObject *addr_list = (PyObject *)NULL;
4560 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004561 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 if (h == NULL) {
4564 /* Let's get real error message to return */
4565 set_herror(h_errno);
4566 return NULL;
4567 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 if (h->h_addrtype != af) {
4570 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004571 errno = EAFNOSUPPORT;
4572 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 return NULL;
4574 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 case AF_INET:
4579 if (alen < sizeof(struct sockaddr_in))
4580 return NULL;
4581 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004582
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004583#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 case AF_INET6:
4585 if (alen < sizeof(struct sockaddr_in6))
4586 return NULL;
4587 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004588#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 if ((name_list = PyList_New(0)) == NULL)
4593 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 if ((addr_list = PyList_New(0)) == NULL)
4596 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 /* SF #1511317: h_aliases can be NULL */
4599 if (h->h_aliases) {
4600 for (pch = h->h_aliases; *pch != NULL; pch++) {
4601 int status;
4602 tmp = PyUnicode_FromString(*pch);
4603 if (tmp == NULL)
4604 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 status = PyList_Append(name_list, tmp);
4607 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 if (status)
4610 goto err;
4611 }
4612 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4615 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 case AF_INET:
4620 {
4621 struct sockaddr_in sin;
4622 memset(&sin, 0, sizeof(sin));
4623 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004624#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4628 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 if (pch == h->h_addr_list && alen >= sizeof(sin))
4631 memcpy((char *) addr, &sin, sizeof(sin));
4632 break;
4633 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004634
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004635#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 case AF_INET6:
4637 {
4638 struct sockaddr_in6 sin6;
4639 memset(&sin6, 0, sizeof(sin6));
4640 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004641#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4645 tmp = makeipaddr((struct sockaddr *)&sin6,
4646 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4649 memcpy((char *) addr, &sin6, sizeof(sin6));
4650 break;
4651 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004652#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004655 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 "unsupported address family");
4657 return NULL;
4658 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 if (tmp == NULL)
4661 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 status = PyList_Append(addr_list, tmp);
4664 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 if (status)
4667 goto err;
4668 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004669
Victor Stinner72400302016-01-28 15:41:01 +01004670 name = sock_decode_hostname(h->h_name);
4671 if (name == NULL)
4672 goto err;
4673 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004674
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004675 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 Py_XDECREF(name_list);
4677 Py_XDECREF(addr_list);
4678 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004679}
4680
4681
4682/* Python interface to gethostbyname_ex(name). */
4683
4684/*ARGSUSED*/
4685static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004686socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 char *name;
4689 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004690 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004692 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004693#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004695#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004697#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 char buf[16384];
4699 int buf_len = (sizeof buf) - 1;
4700 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004701#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004702#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004704#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004705#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004706
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004707 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004709 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004710 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004712#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004713#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004714 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004716#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004718#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004719 memset((void *) &data, '\0', sizeof(data));
4720 result = gethostbyname_r(name, &hp_allocated, &data);
4721 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004722#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004723#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004724#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004728#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 Py_END_ALLOW_THREADS
4730 /* Some C libraries would require addr.__ss_family instead of
4731 addr.ss_family.
4732 Therefore, we cast the sockaddr_storage into sockaddr to
4733 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004734 sa = SAS2SA(&addr);
4735 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004737#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004739#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004740finally:
4741 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004743}
4744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004745PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004746"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4747\n\
4748Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004749for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004750
4751
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004752/* Python interface to gethostbyaddr(IP). */
4753
4754/*ARGSUSED*/
4755static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004756socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004757{
Charles-François Natali8b759652011-12-23 16:44:51 +01004758 sock_addr_t addr;
4759 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 char *ip_num;
4761 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004762 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004763#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004765#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 /* glibcs up to 2.10 assume that the buf argument to
4769 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4770 does not ensure. The attribute below instructs the compiler
4771 to maintain this alignment. */
4772 char buf[16384] Py_ALIGNED(8);
4773 int buf_len = (sizeof buf) - 1;
4774 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004775#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004776#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004778#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004779#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 char *ap;
4781 int al;
4782 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004783
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004784 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 return NULL;
4786 af = AF_UNSPEC;
4787 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004788 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 af = sa->sa_family;
4790 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004791 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 switch (af) {
4793 case AF_INET:
4794 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4795 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4796 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004797#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 case AF_INET6:
4799 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4800 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4801 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004804 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004805 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 }
4807 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004808#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004809#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004810 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 &hp_allocated, buf, buf_len,
4812 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004813#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 h = gethostbyaddr_r(ap, al, af,
4815 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004816#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 memset((void *) &data, '\0', sizeof(data));
4818 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4819 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004820#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004821#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004822#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004826#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004828 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004829#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004831#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004832finally:
4833 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004835}
4836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004837PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004838"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4839\n\
4840Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004841for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004842
Guido van Rossum30a685f1991-06-27 15:51:29 +00004843
4844/* Python interface to getservbyname(name).
4845 This only returns the port number, since the other info is already
4846 known or not useful (like the list of aliases). */
4847
4848/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004849static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004850socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 char *name, *proto=NULL;
4853 struct servent *sp;
4854 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4855 return NULL;
4856 Py_BEGIN_ALLOW_THREADS
4857 sp = getservbyname(name, proto);
4858 Py_END_ALLOW_THREADS
4859 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004860 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 return NULL;
4862 }
4863 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004864}
4865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004866PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004867"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004868\n\
4869Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004870The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4871otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004872
Guido van Rossum30a685f1991-06-27 15:51:29 +00004873
Barry Warsaw11b91a02004-06-28 00:50:43 +00004874/* Python interface to getservbyport(port).
4875 This only returns the service name, since the other info is already
4876 known or not useful (like the list of aliases). */
4877
4878/*ARGSUSED*/
4879static PyObject *
4880socket_getservbyport(PyObject *self, PyObject *args)
4881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 int port;
4883 char *proto=NULL;
4884 struct servent *sp;
4885 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4886 return NULL;
4887 if (port < 0 || port > 0xffff) {
4888 PyErr_SetString(
4889 PyExc_OverflowError,
4890 "getservbyport: port must be 0-65535.");
4891 return NULL;
4892 }
4893 Py_BEGIN_ALLOW_THREADS
4894 sp = getservbyport(htons((short)port), proto);
4895 Py_END_ALLOW_THREADS
4896 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004897 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 return NULL;
4899 }
4900 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004901}
4902
4903PyDoc_STRVAR(getservbyport_doc,
4904"getservbyport(port[, protocolname]) -> string\n\
4905\n\
4906Return the service name from a port number and protocol name.\n\
4907The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4908otherwise any protocol will match.");
4909
Guido van Rossum3901d851996-12-19 16:35:04 +00004910/* Python interface to getprotobyname(name).
4911 This only returns the protocol number, since the other info is
4912 already known or not useful (like the list of aliases). */
4913
4914/*ARGSUSED*/
4915static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004916socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 char *name;
4919 struct protoent *sp;
4920 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4921 return NULL;
4922 Py_BEGIN_ALLOW_THREADS
4923 sp = getprotobyname(name);
4924 Py_END_ALLOW_THREADS
4925 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004926 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 return NULL;
4928 }
4929 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004930}
4931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004932PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004933"getprotobyname(name) -> integer\n\
4934\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004935Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004936
Guido van Rossum3901d851996-12-19 16:35:04 +00004937
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004938#ifndef NO_DUP
4939/* dup() function for socket fds */
4940
4941static PyObject *
4942socket_dup(PyObject *self, PyObject *fdobj)
4943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 SOCKET_T fd, newfd;
4945 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004946#ifdef MS_WINDOWS
4947 WSAPROTOCOL_INFO info;
4948#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 fd = PyLong_AsSocket_t(fdobj);
4951 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4952 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004953
Victor Stinnerdaf45552013-08-28 00:53:59 +02004954#ifdef MS_WINDOWS
4955 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4956 return set_error();
4957
4958 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4959 FROM_PROTOCOL_INFO,
4960 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 if (newfd == INVALID_SOCKET)
4962 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004963
Victor Stinnerdaf45552013-08-28 00:53:59 +02004964 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4965 closesocket(newfd);
4966 PyErr_SetFromWindowsErr(0);
4967 return NULL;
4968 }
4969#else
4970 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4971 newfd = _Py_dup(fd);
4972 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004973 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004974#endif
4975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 newfdobj = PyLong_FromSocket_t(newfd);
4977 if (newfdobj == NULL)
4978 SOCKETCLOSE(newfd);
4979 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004980}
4981
4982PyDoc_STRVAR(dup_doc,
4983"dup(integer) -> integer\n\
4984\n\
4985Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4986sockets; on some platforms os.dup() won't work for socket file descriptors.");
4987#endif
4988
4989
Dave Cole331708b2004-08-09 04:51:41 +00004990#ifdef HAVE_SOCKETPAIR
4991/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004992 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004993 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004994
4995/*ARGSUSED*/
4996static PyObject *
4997socket_socketpair(PyObject *self, PyObject *args)
4998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 PySocketSockObject *s0 = NULL, *s1 = NULL;
5000 SOCKET_T sv[2];
5001 int family, type = SOCK_STREAM, proto = 0;
5002 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005003#ifdef SOCK_CLOEXEC
5004 int *atomic_flag_works = &sock_cloexec_works;
5005#else
5006 int *atomic_flag_works = NULL;
5007#endif
5008 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005009
5010#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005012#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5016 &family, &type, &proto))
5017 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005020 Py_BEGIN_ALLOW_THREADS
5021#ifdef SOCK_CLOEXEC
5022 if (sock_cloexec_works != 0) {
5023 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5024 if (sock_cloexec_works == -1) {
5025 if (ret >= 0) {
5026 sock_cloexec_works = 1;
5027 }
5028 else if (errno == EINVAL) {
5029 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5030 sock_cloexec_works = 0;
5031 ret = socketpair(family, type, proto, sv);
5032 }
5033 }
5034 }
5035 else
5036#endif
5037 {
5038 ret = socketpair(family, type, proto, sv);
5039 }
5040 Py_END_ALLOW_THREADS
5041
5042 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005044
5045 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5046 goto finally;
5047 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5048 goto finally;
5049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 s0 = new_sockobject(sv[0], family, type, proto);
5051 if (s0 == NULL)
5052 goto finally;
5053 s1 = new_sockobject(sv[1], family, type, proto);
5054 if (s1 == NULL)
5055 goto finally;
5056 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005057
5058finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 if (res == NULL) {
5060 if (s0 == NULL)
5061 SOCKETCLOSE(sv[0]);
5062 if (s1 == NULL)
5063 SOCKETCLOSE(sv[1]);
5064 }
5065 Py_XDECREF(s0);
5066 Py_XDECREF(s1);
5067 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005068}
5069
5070PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005071"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005072\n\
5073Create a pair of socket objects from the sockets returned by the platform\n\
5074socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005075The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005076AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005077
5078#endif /* HAVE_SOCKETPAIR */
5079
5080
Guido van Rossum006bf911996-06-12 04:04:55 +00005081static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005082socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5087 return NULL;
5088 }
5089 if (x1 < 0) {
5090 PyErr_SetString(PyExc_OverflowError,
5091 "can't convert negative number to unsigned long");
5092 return NULL;
5093 }
5094 x2 = (unsigned int)ntohs((unsigned short)x1);
5095 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005096}
5097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005098PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005099"ntohs(integer) -> integer\n\
5100\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005101Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005102
5103
Guido van Rossum006bf911996-06-12 04:04:55 +00005104static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005105socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 if (PyLong_Check(arg)) {
5110 x = PyLong_AsUnsignedLong(arg);
5111 if (x == (unsigned long) -1 && PyErr_Occurred())
5112 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005113#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 {
5115 unsigned long y;
5116 /* only want the trailing 32 bits */
5117 y = x & 0xFFFFFFFFUL;
5118 if (y ^ x)
5119 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005120 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 x = y;
5122 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 }
5125 else
5126 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005127 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005130}
5131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005132PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005133"ntohl(integer) -> integer\n\
5134\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005135Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005136
5137
Guido van Rossum006bf911996-06-12 04:04:55 +00005138static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005139socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5144 return NULL;
5145 }
5146 if (x1 < 0) {
5147 PyErr_SetString(PyExc_OverflowError,
5148 "can't convert negative number to unsigned long");
5149 return NULL;
5150 }
5151 x2 = (unsigned int)htons((unsigned short)x1);
5152 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005153}
5154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005155PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005156"htons(integer) -> integer\n\
5157\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005158Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005159
5160
Guido van Rossum006bf911996-06-12 04:04:55 +00005161static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005162socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 if (PyLong_Check(arg)) {
5167 x = PyLong_AsUnsignedLong(arg);
5168 if (x == (unsigned long) -1 && PyErr_Occurred())
5169 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005170#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 {
5172 unsigned long y;
5173 /* only want the trailing 32 bits */
5174 y = x & 0xFFFFFFFFUL;
5175 if (y ^ x)
5176 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005177 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 x = y;
5179 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 }
5182 else
5183 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005184 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 Py_TYPE(arg)->tp_name);
5186 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005187}
5188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005189PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005190"htonl(integer) -> integer\n\
5191\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005192Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005193
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005194/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005196PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005197"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005198\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005199Convert 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 +00005200binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005201
5202static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005203socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005204{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005205#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005207#endif
5208
5209#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005210#if (SIZEOF_INT != 4)
5211#error "Not sure if in_addr_t exists and int is not 32-bits."
5212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 /* Have to use inet_addr() instead */
5214 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5219 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005220
Tim Peters1df9fdd2003-02-13 03:13:40 +00005221
5222#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005223
5224#ifdef USE_INET_ATON_WEAKLINK
5225 if (inet_aton != NULL) {
5226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 if (inet_aton(ip_addr, &buf))
5228 return PyBytes_FromStringAndSize((char *)(&buf),
5229 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005230
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005231 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 "illegal IP address string passed to inet_aton");
5233 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005234
Thomas Wouters477c8d52006-05-27 19:21:47 +00005235#ifdef USE_INET_ATON_WEAKLINK
5236 } else {
5237#endif
5238
5239#endif
5240
5241#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 /* special-case this address as inet_addr might return INADDR_NONE
5244 * for this */
5245 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005246 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005252 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 "illegal IP address string passed to inet_aton");
5254 return NULL;
5255 }
5256 }
5257 return PyBytes_FromStringAndSize((char *) &packed_addr,
5258 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005259
5260#ifdef USE_INET_ATON_WEAKLINK
5261 }
5262#endif
5263
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005264#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005265}
5266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005267PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005268"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005269\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005270Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005271
5272static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005273socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005274{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005275 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005277
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005278 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 return NULL;
5280 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005281
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005282 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005283 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005285 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 return NULL;
5287 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005288
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005289 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5290 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005293}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005294
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005295#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005296
5297PyDoc_STRVAR(inet_pton_doc,
5298"inet_pton(af, ip) -> packed IP address string\n\
5299\n\
5300Convert an IP address from string format to a packed string suitable\n\
5301for use with low-level network functions.");
5302
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005303#endif
5304
5305#ifdef HAVE_INET_PTON
5306
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005307static PyObject *
5308socket_inet_pton(PyObject *self, PyObject *args)
5309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 int af;
5311 char* ip;
5312 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005313#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005314 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005315#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5319 return NULL;
5320 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005321
Martin v. Löwis04697e82004-06-02 12:35:29 +00005322#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005324 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 "can't use AF_INET6, IPv6 is disabled");
5326 return NULL;
5327 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005328#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 retval = inet_pton(af, ip, packed);
5331 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005332 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 return NULL;
5334 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005335 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 "illegal IP address string passed to inet_pton");
5337 return NULL;
5338 } else if (af == AF_INET) {
5339 return PyBytes_FromStringAndSize(packed,
5340 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005341#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 } else if (af == AF_INET6) {
5343 return PyBytes_FromStringAndSize(packed,
5344 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005347 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 return NULL;
5349 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005350}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005351#elif defined(MS_WINDOWS)
5352
5353static PyObject *
5354socket_inet_pton(PyObject *self, PyObject *args)
5355{
5356 int af;
5357 char* ip;
5358 struct sockaddr_in6 addr;
5359 INT ret, size;
5360
5361 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5362 return NULL;
5363 }
5364
Victor Stinnere990c6e2013-11-16 00:18:58 +01005365 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005366 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5367
5368 if (ret) {
5369 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5370 return NULL;
5371 } else if(af == AF_INET) {
5372 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005373 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005374 sizeof(addr4->sin_addr));
5375 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005376 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005377 sizeof(addr.sin6_addr));
5378 } else {
5379 PyErr_SetString(PyExc_OSError, "unknown address family");
5380 return NULL;
5381 }
5382}
5383
5384#endif
5385
5386#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005387
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005388PyDoc_STRVAR(inet_ntop_doc,
5389"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5390\n\
5391Convert a packed IP address of the given family to string format.");
5392
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005393#endif
5394
5395
5396#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005397static PyObject *
5398socket_inet_ntop(PyObject *self, PyObject *args)
5399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005401 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005403#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005404 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005405#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005407#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5410 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005411
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005412 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 return NULL;
5414 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005417 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 PyErr_SetString(PyExc_ValueError,
5419 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005420 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 return NULL;
5422 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005423#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005425 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 PyErr_SetString(PyExc_ValueError,
5427 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005428 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 return NULL;
5430 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 } else {
5433 PyErr_Format(PyExc_ValueError,
5434 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005435 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 return NULL;
5437 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005438
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005439 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5440 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005442 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 return NULL;
5444 } else {
5445 return PyUnicode_FromString(retval);
5446 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 /* NOTREACHED */
5449 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5450 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005451}
5452
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005453#elif defined(MS_WINDOWS)
5454
5455static PyObject *
5456socket_inet_ntop(PyObject *self, PyObject *args)
5457{
5458 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005459 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005460 struct sockaddr_in6 addr;
5461 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005462#ifdef ENABLE_IPV6
5463 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5464#else
5465 char ip[INET_ADDRSTRLEN + 1];
5466#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005467
5468 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5469 memset((void *) &ip[0], '\0', sizeof(ip));
5470
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005471 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005472 return NULL;
5473 }
5474
5475 if (af == AF_INET) {
5476 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5477
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005478 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005479 PyErr_SetString(PyExc_ValueError,
5480 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005481 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005482 return NULL;
5483 }
5484 memset(addr4, 0, sizeof(struct sockaddr_in));
5485 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005486 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005487 addrlen = sizeof(struct sockaddr_in);
5488 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005489 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005490 PyErr_SetString(PyExc_ValueError,
5491 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005492 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005493 return NULL;
5494 }
5495
5496 memset(&addr, 0, sizeof(addr));
5497 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005498 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005499 addrlen = sizeof(addr);
5500 } else {
5501 PyErr_Format(PyExc_ValueError,
5502 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005503 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005504 return NULL;
5505 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005506 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005507
5508 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005509 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005510 ip, &retlen);
5511
5512 if (ret) {
5513 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5514 return NULL;
5515 } else {
5516 return PyUnicode_FromString(ip);
5517 }
5518}
5519
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005520#endif /* HAVE_INET_PTON */
5521
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005522/* Python interface to getaddrinfo(host, port). */
5523
5524/*ARGSUSED*/
5525static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005526socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005527{
Victor Stinner77af1722011-05-26 14:05:59 +02005528 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005529 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 struct addrinfo hints, *res;
5531 struct addrinfo *res0 = NULL;
5532 PyObject *hobj = NULL;
5533 PyObject *pobj = (PyObject *)NULL;
5534 char pbuf[30];
5535 char *hptr, *pptr;
5536 int family, socktype, protocol, flags;
5537 int error;
5538 PyObject *all = (PyObject *)NULL;
5539 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005540
Georg Brandl6083a4b2013-10-14 06:51:46 +02005541 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005543 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005544 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 &protocol, &flags)) {
5546 return NULL;
5547 }
5548 if (hobj == Py_None) {
5549 hptr = NULL;
5550 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005551 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 if (!idna)
5553 return NULL;
5554 assert(PyBytes_Check(idna));
5555 hptr = PyBytes_AS_STRING(idna);
5556 } else if (PyBytes_Check(hobj)) {
5557 hptr = PyBytes_AsString(hobj);
5558 } else {
5559 PyErr_SetString(PyExc_TypeError,
5560 "getaddrinfo() argument 1 must be string or None");
5561 return NULL;
5562 }
5563 if (PyLong_CheckExact(pobj)) {
5564 long value = PyLong_AsLong(pobj);
5565 if (value == -1 && PyErr_Occurred())
5566 goto err;
5567 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5568 pptr = pbuf;
5569 } else if (PyUnicode_Check(pobj)) {
5570 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005571 if (pptr == NULL)
5572 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005574 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 } else if (pobj == Py_None) {
5576 pptr = (char *)NULL;
5577 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005578 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 goto err;
5580 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005581#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005582 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5583 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005584 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5585 * This workaround avoids a segfault in libsystem.
5586 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005587 pptr = "00";
5588 }
5589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 memset(&hints, 0, sizeof(hints));
5591 hints.ai_family = family;
5592 hints.ai_socktype = socktype;
5593 hints.ai_protocol = protocol;
5594 hints.ai_flags = flags;
5595 Py_BEGIN_ALLOW_THREADS
5596 ACQUIRE_GETADDRINFO_LOCK
5597 error = getaddrinfo(hptr, pptr, &hints, &res0);
5598 Py_END_ALLOW_THREADS
5599 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5600 if (error) {
5601 set_gaierror(error);
5602 goto err;
5603 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005604
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005605 all = PyList_New(0);
5606 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 goto err;
5608 for (res = res0; res; res = res->ai_next) {
5609 PyObject *single;
5610 PyObject *addr =
5611 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5612 if (addr == NULL)
5613 goto err;
5614 single = Py_BuildValue("iiisO", res->ai_family,
5615 res->ai_socktype, res->ai_protocol,
5616 res->ai_canonname ? res->ai_canonname : "",
5617 addr);
5618 Py_DECREF(addr);
5619 if (single == NULL)
5620 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 if (PyList_Append(all, single))
5623 goto err;
5624 Py_XDECREF(single);
5625 }
5626 Py_XDECREF(idna);
5627 if (res0)
5628 freeaddrinfo(res0);
5629 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005630 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 Py_XDECREF(all);
5632 Py_XDECREF(idna);
5633 if (res0)
5634 freeaddrinfo(res0);
5635 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005636}
5637
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005638PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005639"getaddrinfo(host, port [, family, type, proto, flags])\n\
5640 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005641\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005642Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005643
5644/* Python interface to getnameinfo(sa, flags). */
5645
5646/*ARGSUSED*/
5647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005648socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 PyObject *sa = (PyObject *)NULL;
5651 int flags;
5652 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005653 int port;
5654 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5656 struct addrinfo hints, *res = NULL;
5657 int error;
5658 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005659 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 flags = flowinfo = scope_id = 0;
5662 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5663 return NULL;
5664 if (!PyTuple_Check(sa)) {
5665 PyErr_SetString(PyExc_TypeError,
5666 "getnameinfo() argument 1 must be a tuple");
5667 return NULL;
5668 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005669 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 &hostp, &port, &flowinfo, &scope_id))
5671 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005672 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005673 PyErr_SetString(PyExc_OverflowError,
5674 "getsockaddrarg: flowinfo must be 0-1048575.");
5675 return NULL;
5676 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5678 memset(&hints, 0, sizeof(hints));
5679 hints.ai_family = AF_UNSPEC;
5680 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005681 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 Py_BEGIN_ALLOW_THREADS
5683 ACQUIRE_GETADDRINFO_LOCK
5684 error = getaddrinfo(hostp, pbuf, &hints, &res);
5685 Py_END_ALLOW_THREADS
5686 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5687 if (error) {
5688 set_gaierror(error);
5689 goto fail;
5690 }
5691 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005692 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 "sockaddr resolved to multiple addresses");
5694 goto fail;
5695 }
5696 switch (res->ai_family) {
5697 case AF_INET:
5698 {
5699 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005700 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 "IPv4 sockaddr must be 2 tuple");
5702 goto fail;
5703 }
5704 break;
5705 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005706#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 case AF_INET6:
5708 {
5709 struct sockaddr_in6 *sin6;
5710 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005711 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 sin6->sin6_scope_id = scope_id;
5713 break;
5714 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005717 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5719 if (error) {
5720 set_gaierror(error);
5721 goto fail;
5722 }
Victor Stinner72400302016-01-28 15:41:01 +01005723
5724 name = sock_decode_hostname(hbuf);
5725 if (name == NULL)
5726 goto fail;
5727 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005728
5729fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 if (res)
5731 freeaddrinfo(res);
5732 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005733}
5734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005735PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005736"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005737\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005738Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005739
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005740
5741/* Python API to getting and setting the default timeout value. */
5742
5743static PyObject *
5744socket_getdefaulttimeout(PyObject *self)
5745{
Victor Stinner71694d52015-03-28 01:18:54 +01005746 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 Py_INCREF(Py_None);
5748 return Py_None;
5749 }
Victor Stinner71694d52015-03-28 01:18:54 +01005750 else {
5751 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5752 return PyFloat_FromDouble(seconds);
5753 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005754}
5755
5756PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005757"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005758\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005759Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005760A value of None indicates that new socket objects have no timeout.\n\
5761When the socket module is first imported, the default is None.");
5762
5763static PyObject *
5764socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5765{
Victor Stinner71694d52015-03-28 01:18:54 +01005766 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005767
Victor Stinner71694d52015-03-28 01:18:54 +01005768 if (socket_parse_timeout(&timeout, arg) < 0)
5769 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 Py_INCREF(Py_None);
5774 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005775}
5776
5777PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005778"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005779\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005780Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005781A value of None indicates that new socket objects have no timeout.\n\
5782When the socket module is first imported, the default is None.");
5783
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005784#ifdef HAVE_IF_NAMEINDEX
5785/* Python API for getting interface indices and names */
5786
5787static PyObject *
5788socket_if_nameindex(PyObject *self, PyObject *arg)
5789{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005790 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005791 int i;
5792 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005793
Charles-François Natali60713592011-05-20 16:55:06 +02005794 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005795 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005796 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005797 return NULL;
5798 }
5799
5800 list = PyList_New(0);
5801 if (list == NULL) {
5802 if_freenameindex(ni);
5803 return NULL;
5804 }
5805
Charles-François Natali60713592011-05-20 16:55:06 +02005806 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5807 PyObject *ni_tuple = Py_BuildValue("IO&",
5808 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005809
5810 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5811 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005812 Py_DECREF(list);
5813 if_freenameindex(ni);
5814 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005815 }
5816 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005817 }
5818
5819 if_freenameindex(ni);
5820 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005821}
5822
5823PyDoc_STRVAR(if_nameindex_doc,
5824"if_nameindex()\n\
5825\n\
5826Returns a list of network interface information (index, name) tuples.");
5827
Charles-François Natali60713592011-05-20 16:55:06 +02005828static PyObject *
5829socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005830{
Charles-François Natali60713592011-05-20 16:55:06 +02005831 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005832 unsigned long index;
5833
Charles-François Natali60713592011-05-20 16:55:06 +02005834 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5835 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005836 return NULL;
5837
Charles-François Natali60713592011-05-20 16:55:06 +02005838 index = if_nametoindex(PyBytes_AS_STRING(oname));
5839 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005840 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005841 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005842 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005843 return NULL;
5844 }
5845
5846 return PyLong_FromUnsignedLong(index);
5847}
5848
5849PyDoc_STRVAR(if_nametoindex_doc,
5850"if_nametoindex(if_name)\n\
5851\n\
5852Returns the interface index corresponding to the interface name if_name.");
5853
Charles-François Natali60713592011-05-20 16:55:06 +02005854static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005855socket_if_indextoname(PyObject *self, PyObject *arg)
5856{
Charles-François Natali60713592011-05-20 16:55:06 +02005857 unsigned long index;
5858 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005859
Charles-François Natali60713592011-05-20 16:55:06 +02005860 index = PyLong_AsUnsignedLong(arg);
5861 if (index == (unsigned long) -1)
5862 return NULL;
5863
5864 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005865 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005866 return NULL;
5867 }
5868
Charles-François Natali60713592011-05-20 16:55:06 +02005869 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005870}
5871
5872PyDoc_STRVAR(if_indextoname_doc,
5873"if_indextoname(if_index)\n\
5874\n\
5875Returns the interface name corresponding to the interface index if_index.");
5876
5877#endif /* HAVE_IF_NAMEINDEX */
5878
5879
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005880#ifdef CMSG_LEN
5881/* Python interface to CMSG_LEN(length). */
5882
5883static PyObject *
5884socket_CMSG_LEN(PyObject *self, PyObject *args)
5885{
5886 Py_ssize_t length;
5887 size_t result;
5888
5889 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5890 return NULL;
5891 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5892 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5893 return NULL;
5894 }
5895 return PyLong_FromSize_t(result);
5896}
5897
5898PyDoc_STRVAR(CMSG_LEN_doc,
5899"CMSG_LEN(length) -> control message length\n\
5900\n\
5901Return the total length, without trailing padding, of an ancillary\n\
5902data item with associated data of the given length. This value can\n\
5903often be used as the buffer size for recvmsg() to receive a single\n\
5904item of ancillary data, but RFC 3542 requires portable applications to\n\
5905use CMSG_SPACE() and thus include space for padding, even when the\n\
5906item will be the last in the buffer. Raises OverflowError if length\n\
5907is outside the permissible range of values.");
5908
5909
5910#ifdef CMSG_SPACE
5911/* Python interface to CMSG_SPACE(length). */
5912
5913static PyObject *
5914socket_CMSG_SPACE(PyObject *self, PyObject *args)
5915{
5916 Py_ssize_t length;
5917 size_t result;
5918
5919 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5920 return NULL;
5921 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5922 PyErr_SetString(PyExc_OverflowError,
5923 "CMSG_SPACE() argument out of range");
5924 return NULL;
5925 }
5926 return PyLong_FromSize_t(result);
5927}
5928
5929PyDoc_STRVAR(CMSG_SPACE_doc,
5930"CMSG_SPACE(length) -> buffer size\n\
5931\n\
5932Return the buffer size needed for recvmsg() to receive an ancillary\n\
5933data item with associated data of the given length, along with any\n\
5934trailing padding. The buffer space needed to receive multiple items\n\
5935is the sum of the CMSG_SPACE() values for their associated data\n\
5936lengths. Raises OverflowError if length is outside the permissible\n\
5937range of values.");
5938#endif /* CMSG_SPACE */
5939#endif /* CMSG_LEN */
5940
5941
Guido van Rossum30a685f1991-06-27 15:51:29 +00005942/* List of functions exported by this module. */
5943
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005944static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 {"gethostbyname", socket_gethostbyname,
5946 METH_VARARGS, gethostbyname_doc},
5947 {"gethostbyname_ex", socket_gethostbyname_ex,
5948 METH_VARARGS, ghbn_ex_doc},
5949 {"gethostbyaddr", socket_gethostbyaddr,
5950 METH_VARARGS, gethostbyaddr_doc},
5951 {"gethostname", socket_gethostname,
5952 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005953#ifdef HAVE_SETHOSTNAME
5954 {"sethostname", socket_sethostname,
5955 METH_VARARGS, sethostname_doc},
5956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 {"getservbyname", socket_getservbyname,
5958 METH_VARARGS, getservbyname_doc},
5959 {"getservbyport", socket_getservbyport,
5960 METH_VARARGS, getservbyport_doc},
5961 {"getprotobyname", socket_getprotobyname,
5962 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005963#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 {"dup", socket_dup,
5965 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005966#endif
Dave Cole331708b2004-08-09 04:51:41 +00005967#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 {"socketpair", socket_socketpair,
5969 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 {"ntohs", socket_ntohs,
5972 METH_VARARGS, ntohs_doc},
5973 {"ntohl", socket_ntohl,
5974 METH_O, ntohl_doc},
5975 {"htons", socket_htons,
5976 METH_VARARGS, htons_doc},
5977 {"htonl", socket_htonl,
5978 METH_O, htonl_doc},
5979 {"inet_aton", socket_inet_aton,
5980 METH_VARARGS, inet_aton_doc},
5981 {"inet_ntoa", socket_inet_ntoa,
5982 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005983#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 {"inet_pton", socket_inet_pton,
5985 METH_VARARGS, inet_pton_doc},
5986 {"inet_ntop", socket_inet_ntop,
5987 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005988#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005989 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5990 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 {"getnameinfo", socket_getnameinfo,
5992 METH_VARARGS, getnameinfo_doc},
5993 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5994 METH_NOARGS, getdefaulttimeout_doc},
5995 {"setdefaulttimeout", socket_setdefaulttimeout,
5996 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005997#ifdef HAVE_IF_NAMEINDEX
5998 {"if_nameindex", socket_if_nameindex,
5999 METH_NOARGS, if_nameindex_doc},
6000 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006001 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006002 {"if_indextoname", socket_if_indextoname,
6003 METH_O, if_indextoname_doc},
6004#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006005#ifdef CMSG_LEN
6006 {"CMSG_LEN", socket_CMSG_LEN,
6007 METH_VARARGS, CMSG_LEN_doc},
6008#ifdef CMSG_SPACE
6009 {"CMSG_SPACE", socket_CMSG_SPACE,
6010 METH_VARARGS, CMSG_SPACE_doc},
6011#endif
6012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006014};
6015
Guido van Rossum30a685f1991-06-27 15:51:29 +00006016
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006017#ifdef MS_WINDOWS
6018#define OS_INIT_DEFINED
6019
6020/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006021
6022static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006023os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006026}
6027
6028static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006029os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 WSADATA WSAData;
6032 int ret;
6033 ret = WSAStartup(0x0101, &WSAData);
6034 switch (ret) {
6035 case 0: /* No error */
6036 Py_AtExit(os_cleanup);
6037 return 1; /* Success */
6038 case WSASYSNOTREADY:
6039 PyErr_SetString(PyExc_ImportError,
6040 "WSAStartup failed: network not ready");
6041 break;
6042 case WSAVERNOTSUPPORTED:
6043 case WSAEINVAL:
6044 PyErr_SetString(
6045 PyExc_ImportError,
6046 "WSAStartup failed: requested version not supported");
6047 break;
6048 default:
6049 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6050 break;
6051 }
6052 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006053}
6054
Guido van Rossum8d665e61996-06-26 18:22:49 +00006055#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006056
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006058
6059#ifndef OS_INIT_DEFINED
6060static int
6061os_init(void)
6062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006064}
6065#endif
6066
6067
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006068/* C API table - always add new things to the end for binary
6069 compatibility. */
6070static
6071PySocketModule_APIObject PySocketModuleAPI =
6072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006074 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006076};
6077
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006078
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006079/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006080
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006081 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006082 "socket.py" which implements some additional functionality.
6083 The import of "_socket" may fail with an ImportError exception if
6084 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006085 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006086 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006087*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006089PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006090"Implementation module for socket operations.\n\
6091\n\
6092See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006093
Martin v. Löwis1a214512008-06-11 05:26:20 +00006094static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 PyModuleDef_HEAD_INIT,
6096 PySocket_MODULE_NAME,
6097 socket_doc,
6098 -1,
6099 socket_methods,
6100 NULL,
6101 NULL,
6102 NULL,
6103 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006104};
6105
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006106PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006107PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 if (!os_init())
6112 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006113
Victor Stinnerdaf45552013-08-28 00:53:59 +02006114#ifdef MS_WINDOWS
6115 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006116#if defined(_MSC_VER) && _MSC_VER >= 1800
6117 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6118#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006119 DWORD version = GetVersion();
6120 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6121 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6122 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006123 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6124#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006125 }
6126#endif
6127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 Py_TYPE(&sock_type) = &PyType_Type;
6129 m = PyModule_Create(&socketmodule);
6130 if (m == NULL)
6131 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006132
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006133 Py_INCREF(PyExc_OSError);
6134 PySocketModuleAPI.error = PyExc_OSError;
6135 Py_INCREF(PyExc_OSError);
6136 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006138 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 if (socket_herror == NULL)
6140 return NULL;
6141 Py_INCREF(socket_herror);
6142 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006143 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 NULL);
6145 if (socket_gaierror == NULL)
6146 return NULL;
6147 Py_INCREF(socket_gaierror);
6148 PyModule_AddObject(m, "gaierror", socket_gaierror);
6149 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006150 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 if (socket_timeout == NULL)
6152 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006153 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 Py_INCREF(socket_timeout);
6155 PyModule_AddObject(m, "timeout", socket_timeout);
6156 Py_INCREF((PyObject *)&sock_type);
6157 if (PyModule_AddObject(m, "SocketType",
6158 (PyObject *)&sock_type) != 0)
6159 return NULL;
6160 Py_INCREF((PyObject *)&sock_type);
6161 if (PyModule_AddObject(m, "socket",
6162 (PyObject *)&sock_type) != 0)
6163 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006164
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006165#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006167#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 Py_INCREF(has_ipv6);
6171 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 /* Export C API */
6174 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6175 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6176 ) != 0)
6177 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006180#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006182#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006184#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006186#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006187#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006188 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006189#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006190#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006192 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006193#endif
6194#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006196#endif
6197#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006200#endif
6201#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006204#endif
6205#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006208#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006209#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006212#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006213#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006215 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006216#endif
6217#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006219 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006220#endif
6221#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006223#endif
6224#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006226 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006227#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006228#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006231#endif
6232#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006235#endif
6236#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006239#endif
6240#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006243#endif
6244#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006246 PyModule_AddIntMacro(m, AF_NETLINK);
6247 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006248#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006250#endif
6251#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006253#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006254 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6255 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006256#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006258#endif
6259#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006261#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006262#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006263 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006264#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006265#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006266 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006267#endif
6268#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006269 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006270#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006272#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006274#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006275#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006277#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006278#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006279#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006281 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006282#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006283#ifdef AF_LINK
6284 PyModule_AddIntMacro(m, AF_LINK);
6285#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006286#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006289#endif
6290#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006293#endif
6294#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006297#endif
6298#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006301#endif
6302#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006305#endif
6306#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006308 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006309#endif
6310#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006313#endif
6314#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006317#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006318
Hye-Shik Chang81268602004-02-02 06:05:24 +00006319#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6321 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6322 PyModule_AddIntMacro(m, BTPROTO_HCI);
6323 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006324#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006325 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006326#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006327#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006328#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006330#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006331 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6332 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006333#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006334 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6336 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006337#endif
6338
Charles-François Natali47413c12011-10-06 19:47:44 +02006339#ifdef AF_CAN
6340 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006342#endif
6343#ifdef PF_CAN
6344 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006345 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006346#endif
6347
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006348/* Reliable Datagram Sockets */
6349#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006351#endif
6352#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006354#endif
6355
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006356/* Kernel event messages */
6357#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006358 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006359#endif
6360#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006361 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006362#endif
6363
Antoine Pitroub156a462010-10-27 20:13:57 +00006364#ifdef AF_PACKET
6365 PyModule_AddIntMacro(m, AF_PACKET);
6366#endif
6367#ifdef PF_PACKET
6368 PyModule_AddIntMacro(m, PF_PACKET);
6369#endif
6370#ifdef PACKET_HOST
6371 PyModule_AddIntMacro(m, PACKET_HOST);
6372#endif
6373#ifdef PACKET_BROADCAST
6374 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6375#endif
6376#ifdef PACKET_MULTICAST
6377 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6378#endif
6379#ifdef PACKET_OTHERHOST
6380 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6381#endif
6382#ifdef PACKET_OUTGOING
6383 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6384#endif
6385#ifdef PACKET_LOOPBACK
6386 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6387#endif
6388#ifdef PACKET_FASTROUTE
6389 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006390#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006391
Christian Heimes043d6f62008-01-07 17:19:16 +00006392#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006393 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006396 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6397 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6398 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006399
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6401 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6402 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, SOL_TIPC);
6406 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6407 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6408 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6409 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006410
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6412 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6413 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6414 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006417 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6418 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006419#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006422#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6424 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6425 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6426 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6427 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6428 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006429#endif
6430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, SOCK_STREAM);
6433 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006434/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006435 PyModule_AddIntMacro(m, SOCK_RAW);
6436 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006437#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006439#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006440#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006442#endif
6443#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006444 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006445#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006456#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006458#endif
6459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006461 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006464 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006488 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006494 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006497 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006500 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006503 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006507#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006508#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006509 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006510#endif
6511#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006513#endif
6514#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006515 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006516#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006517#ifdef SO_BINDTODEVICE
6518 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6519#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006520#ifdef SO_PRIORITY
6521 PyModule_AddIntMacro(m, SO_PRIORITY);
6522#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006523#ifdef SO_MARK
6524 PyModule_AddIntMacro(m, SO_MARK);
6525#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 /* Maximum number of connections for "listen" */
6528#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006530#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006532#endif
6533
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006534 /* Ancilliary message types */
6535#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006536 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006537#endif
6538#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006540#endif
6541#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006542 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006543#endif
6544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 /* Flags for send, recv */
6546#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006575#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006576#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006578#endif
6579#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006581#endif
6582#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006584#endif
6585#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006587#endif
6588#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006589 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006590#endif
6591#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006592 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006593#endif
6594#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006595 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006596#endif
6597#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006598 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006599#endif
6600#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006601 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006602#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006603#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006605#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 /* Protocol level and numbers, usable for [gs]etsockopt */
6608#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006613#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006633#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006636#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006638#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006640#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006641#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006643#endif
6644#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6646 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006647#endif
6648#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6650 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6651 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006652
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6654 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6655 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006656#endif
6657#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6659 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6660 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6661 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006662#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04006663#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
6664 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
6665#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006666#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006668 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6669 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6670 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6671 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6672 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6673 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6674 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6675 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6676 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6677 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6678 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6679 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6680#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006681#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006683#endif
6684#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006686#endif
6687#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006689#endif
6690#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006692#endif
6693#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006695#endif
6696#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006698#endif
6699#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006704#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006706#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006707#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006712#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006713 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006718#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006732#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006743#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006744 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006779#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006794#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006797#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006800#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006805#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006806#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006809#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006811#endif
6812/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006815#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006820#endif
6821
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006822#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006824#endif
6825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826 /* Some port configuration */
6827#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006829#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006834#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006835 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006836#endif
6837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838 /* Some reserved IP v.4 addresses */
6839#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006841#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006844#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006846#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006849#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006851#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006856#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef INADDR_ALLHOSTS_GROUP
6860 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6861 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006862#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006867#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006872#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006874#endif
6875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 /* IPv4 [gs]etsockopt options */
6877#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006898#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006901#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006904#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006907#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006924#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006925#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006927#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6930#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006949#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006953#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006955#endif
6956#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006958#endif
6959#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006961#endif
6962#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006964#endif
6965#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006967#endif
6968#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006970#endif
6971#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006973#endif
6974#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006976#endif
6977#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006979#endif
6980#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006982#endif
6983#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006985#endif
6986#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006988#endif
6989#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006991#endif
6992#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006994#endif
6995#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006997#endif
6998#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007000#endif
7001#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007003#endif
7004#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007006#endif
7007#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007009#endif
7010#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007012#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014 /* TCP options */
7015#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007024#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007027#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007045#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007050#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007051#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007053#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055 /* IPX options */
7056#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007058#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007059
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007060/* Reliable Datagram Sockets */
7061#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007063#endif
7064#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007066#endif
7067#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007069#endif
7070#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007072#endif
7073#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007075#endif
7076#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007078#endif
7079#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007081#endif
7082#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007084#endif
7085#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007087#endif
7088#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007090#endif
7091#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007093#endif
7094#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007096#endif
7097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007099#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007101#endif
7102#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007104#endif
7105#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007106 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007107#endif
7108#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007110#endif
7111#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007113#endif
7114#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007116#endif
7117#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007119#endif
7120#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007122#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007123#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007125#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007126#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007128#endif
7129#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007131#endif
7132#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007134#endif
7135#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007137#endif
7138#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007140#endif
7141#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007143#endif
7144#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007146#endif
7147#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007148 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007149#endif
7150#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007151 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007152#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007153#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007155#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007156#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007158#endif
7159#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007161#endif
7162#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007164#endif
7165#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007167#endif
7168#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007170#endif
7171#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007173#endif
7174#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007176#endif
7177#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007179#endif
7180#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007182#endif
7183#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007185#endif
7186#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007188#endif
7189#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007191#endif
7192#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007194#endif
7195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007197#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007199#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007201#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007203#endif
7204#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007206#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007208#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007210#endif
7211#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007213#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007215#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007217#endif
7218
Christian Heimesfaf2f632008-01-06 16:59:19 +00007219#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220 {
7221 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7222 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7223 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007224 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225 PyObject *tmp;
7226 tmp = PyLong_FromUnsignedLong(codes[i]);
7227 if (tmp == NULL)
7228 return NULL;
7229 PyModule_AddObject(m, names[i], tmp);
7230 }
7231 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, RCVALL_OFF);
7233 PyModule_AddIntMacro(m, RCVALL_ON);
7234 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007235#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007237#endif
7238#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007240#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007241#endif /* _MSTCPIP_ */
7242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007244#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007248}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007249
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007250
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007251#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007252#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007253
7254/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007255/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007256
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007257int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007258inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007261#if (SIZEOF_INT != 4)
7262#error "Not sure if in_addr_t exists and int is not 32-bits."
7263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264 unsigned int packed_addr;
7265 packed_addr = inet_addr(src);
7266 if (packed_addr == INADDR_NONE)
7267 return 0;
7268 memcpy(dst, &packed_addr, 4);
7269 return 1;
7270 }
7271 /* Should set errno to EAFNOSUPPORT */
7272 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007273}
7274
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007275const char *
7276inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 if (af == AF_INET) {
7279 struct in_addr packed_addr;
7280 if (size < 16)
7281 /* Should set errno to ENOSPC. */
7282 return NULL;
7283 memcpy(&packed_addr, src, sizeof(packed_addr));
7284 return strncpy(dst, inet_ntoa(packed_addr), size);
7285 }
7286 /* Should set errno to EAFNOSUPPORT */
7287 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007288}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007289
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007290#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007291#endif