blob: 0fd14abe059eb8b80c5e1c0393582b72d6072827 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000100"socket([family[, type[, proto]]]) -> socket object\n\
101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
107\n\
108A socket object represents one endpoint of a network connection.\n\
109\n\
110Methods of socket objects (keyword arguments not allowed):\n\
111\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000112_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113bind(addr) -- bind the socket to a local address\n\
114close() -- close the socket\n\
115connect(addr) -- connect the socket to a remote address\n\
116connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000117_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000118fileno() -- return underlying file descriptor\n\
119getpeername() -- return remote address [*]\n\
120getsockname() -- return local address\n\
121getsockopt(level, optname[, buflen]) -- get socket options\n\
122gettimeout() -- return timeout or None\n\
123listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000125recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000126recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000127recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000128 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000129sendall(data[, flags]) -- send all data\n\
130send(data[, flags]) -- send data, may not send all of it\n\
131sendto(data[, flags], addr) -- send data to a given address\n\
132setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
133setsockopt(level, optname, value) -- set socket options\n\
134settimeout(None | float) -- set or clear the timeout\n\
135shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700136if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700137if_nametoindex(name) -- return the corresponding interface index\n\
138if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000139\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000140 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000142/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000143 I hope some day someone can clean this up please... */
144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
146 script doesn't get this right, so we hardcode some platform checks below.
147 On the other hand, not all Linux versions agree, so there the settings
148 computed by the configure script are needed! */
149
150#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151# undef HAVE_GETHOSTBYNAME_R_3_ARG
152# undef HAVE_GETHOSTBYNAME_R_5_ARG
153# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000154#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000155
Victor Stinner710d27e2011-08-23 10:57:32 +0200156#if defined(__OpenBSD__)
157# include <sys/uio.h>
158#endif
159
Guido van Rossum7a122991999-04-13 04:07:32 +0000160#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000162#endif
163
Guido van Rossume7de2061999-03-24 17:24:33 +0000164#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100165# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# define HAVE_GETHOSTBYNAME_R_3_ARG
167# elif defined(__sun) || defined(__sgi)
168# define HAVE_GETHOSTBYNAME_R_5_ARG
169# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000170/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# else
172# undef HAVE_GETHOSTBYNAME_R
173# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#endif
175
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000176#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
177 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000179#endif
180
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000181/* To use __FreeBSD_version */
182#ifdef HAVE_SYS_PARAM_H
183#include <sys/param.h>
184#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000185/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000186 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000187#if defined(WITH_THREAD) && (defined(__APPLE__) || \
188 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000189 defined(__OpenBSD__) || defined(__NetBSD__) || \
190 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000191#define USE_GETADDRINFO_LOCK
192#endif
193
194#ifdef USE_GETADDRINFO_LOCK
195#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
196#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
197#else
198#define ACQUIRE_GETADDRINFO_LOCK
199#define RELEASE_GETADDRINFO_LOCK
200#endif
201
202#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000204#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000205
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000206#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000207# include <types.h>
208# include <io.h>
209# include <sys/ioctl.h>
210# include <utils.h>
211# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000212#endif
213
Martin v. Löwis9e437302002-12-06 12:57:26 +0000214#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000215# include <ioctl.h>
216#endif
217
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100218#ifdef __APPLE__
219# include <sys/ioctl.h>
220#endif
221
222
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000223#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000224/* make sure that the reentrant (gethostbyaddr_r etc)
225 functions are declared correctly if compiling with
226 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000227
Thomas Wouters477c8d52006-05-27 19:21:47 +0000228/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000231#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000232
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000233#undef _XOPEN_SOURCE
234#include <sys/socket.h>
235#include <sys/types.h>
236#include <netinet/in.h>
237#ifdef _SS_ALIGNSIZE
238#define HAVE_GETADDRINFO 1
239#define HAVE_GETNAMEINFO 1
240#endif
241
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242#define HAVE_INET_PTON
243#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000244#endif
245
Thomas Wouters477c8d52006-05-27 19:21:47 +0000246/* Irix 6.5 fails to define this variable at all. This is needed
247 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000248 are just busted. Same thing for Solaris. */
249#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000250#define INET_ADDRSTRLEN 16
251#endif
252
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000254#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000256#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000257
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700258#ifdef HAVE_SYS_SOCKET_H
259#include <sys/socket.h>
260#endif
261
262#ifdef HAVE_NET_IF_H
263#include <net/if.h>
264#endif
265
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000266/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000268#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000269
270/* Addressing includes */
271
Guido van Rossum6f489d91996-06-28 20:15:15 +0000272#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273
274/* Non-MS WINDOWS includes */
275# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000276# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Guido van Rossum9376b741999-09-15 22:01:40 +0000278/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000280
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000281# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000283#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000284
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000286# ifdef HAVE_FCNTL_H
287# include <fcntl.h>
288# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000289
Jeremy Hylton22308652001-02-02 03:23:09 +0000290#endif
291
Skip Montanaro7befb992004-02-10 16:50:21 +0000292#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000293
294#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000296#endif
297
Neal Norwitz39d22e52002-11-02 19:55:21 +0000298#ifndef O_NONBLOCK
299# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000300#endif
301
Trent Micka708d6e2004-09-07 17:48:26 +0000302/* include Python's addrinfo.h unless it causes trouble */
303#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
304 /* Do not include addinfo.h on some newer IRIX versions.
305 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
306 * for example, but not by 6.5.10.
307 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000308#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000309 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
310 * EAI_* constants are defined in (the already included) ws2tcpip.h.
311 */
312#else
313# include "addrinfo.h"
314#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000315
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000316#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000317#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000318int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000319const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000321#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000322
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000323#ifdef __APPLE__
324/* On OS X, getaddrinfo returns no error indication of lookup
325 failure, so we must use the emulation instead of the libinfo
326 implementation. Unfortunately, performing an autoconf test
327 for this bug would require DNS access for the machine performing
328 the configuration, which is not acceptable. Therefore, we
329 determine the bug just by checking for __APPLE__. If this bug
330 gets ever fixed, perhaps checking for sys/version.h would be
331 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000332#ifndef HAVE_GETNAMEINFO
333/* This bug seems to be fixed in Jaguar. Ths easiest way I could
334 Find to check for Jaguar is that it has getnameinfo(), which
335 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000336#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000338
339#ifdef HAVE_INET_ATON
340#define USE_INET_ATON_WEAKLINK
341#endif
342
Jack Jansen84262fb2002-07-02 14:40:42 +0000343#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000345/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000347/* avoid clashes with the C library definition of the symbol. */
348#define getaddrinfo fake_getaddrinfo
349#define gai_strerror fake_gai_strerror
350#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000351#include "getaddrinfo.c"
352#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000353#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000354#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355#include "getnameinfo.c"
356#endif
357
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000358#ifdef MS_WINDOWS
359/* On Windows a socket is really a handle not an fd */
360static SOCKET
361dup_socket(SOCKET handle)
362{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000363 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000364
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000365 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000367
368 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Antoine Pitrou9a54a262012-04-01 01:14:39 +0200369 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000370}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000371#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000372#else
373/* On Unix we can use dup to duplicate the file descriptor of a socket*/
374#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000375#endif
376
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000377#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000378#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000379#define EAFNOSUPPORT WSAEAFNOSUPPORT
380#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000381#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000382
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000383#ifndef SOCKETCLOSE
384#define SOCKETCLOSE close
385#endif
386
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000387#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000388#define USE_BLUETOOTH 1
389#if defined(__FreeBSD__)
390#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
391#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000392#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000393#define SOL_HCI SOL_HCI_RAW
394#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#define sockaddr_l2 sockaddr_l2cap
396#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000397#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000398#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
399#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000400#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000401#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000402#define sockaddr_l2 sockaddr_bt
403#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000404#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000405#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000406#define SOL_HCI BTPROTO_HCI
407#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000408#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
409#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000410#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000411#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000413#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
414#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000415#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000416#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
417#endif
418#endif
419
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000420#ifdef __VMS
421/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
422#define SEGMENT_SIZE (32 * 1024 -1)
423#endif
424
Charles-François Natali8b759652011-12-23 16:44:51 +0100425/* Convert "sock_addr_t *" to "struct sockaddr *". */
426#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427
Martin v. Löwise9416172003-05-03 10:12:45 +0000428/*
429 * Constants for getnameinfo()
430 */
431#if !defined(NI_MAXHOST)
432#define NI_MAXHOST 1025
433#endif
434#if !defined(NI_MAXSERV)
435#define NI_MAXSERV 32
436#endif
437
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000438#ifndef INVALID_SOCKET /* MS defines this */
439#define INVALID_SOCKET (-1)
440#endif
441
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000442/* XXX There's a problem here: *static* functions are not supposed to have
443 a Py prefix (or use CapitalizedWords). Later... */
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445/* Global variable holding the exception type for errors detected
446 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000447static PyObject *socket_herror;
448static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000449static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000450
Tim Peters643a7fc2002-02-17 04:13:21 +0000451/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000452 The sock_type variable contains pointers to various functions,
453 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000454 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000455static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000456
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457#if defined(HAVE_POLL_H)
458#include <poll.h>
459#elif defined(HAVE_SYS_POLL_H)
460#include <sys/poll.h>
461#endif
462
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000463/* Largest value to try to store in a socklen_t (used when handling
464 ancillary data). POSIX requires socklen_t to hold at least
465 (2**31)-1 and recommends against storing larger values, but
466 socklen_t was originally int in the BSD interface, so to be on the
467 safe side we use the smaller of (2**31)-1 and INT_MAX. */
468#if INT_MAX > 0x7fffffff
469#define SOCKLEN_T_LIMIT 0x7fffffff
470#else
471#define SOCKLEN_T_LIMIT INT_MAX
472#endif
473
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200474#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000475/* Instead of select(), we'll use poll() since poll() works on any fd. */
476#define IS_SELECTABLE(s) 1
477/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000478#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200479/* If there's no timeout left, we don't have to call select, so it's a safe,
480 * little white lie. */
481#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000482#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000483
484static PyObject*
485select_error(void)
486{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200487 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000489}
490
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000491#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000492#ifndef WSAEAGAIN
493#define WSAEAGAIN WSAEWOULDBLOCK
494#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000495#define CHECK_ERRNO(expected) \
496 (WSAGetLastError() == WSA ## expected)
497#else
498#define CHECK_ERRNO(expected) \
499 (errno == expected)
500#endif
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502/* Convenience function to raise an error according to errno
503 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504
Guido van Rossum73624e91994-10-10 17:59:00 +0000505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000508#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 int err_no = WSAGetLastError();
510 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
511 recognizes the error codes used by both GetLastError() and
512 WSAGetLastError */
513 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200514 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000515#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000516
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200517 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518}
519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000525
526#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (v != NULL) {
532 PyErr_SetObject(socket_herror, v);
533 Py_DECREF(v);
534 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537}
538
539
540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544
Martin v. Löwis272cb402002-03-01 08:31:07 +0000545#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* EAI_SYSTEM is not available on Windows XP. */
547 if (error == EAI_SYSTEM)
548 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000549#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000551#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000553#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (v != NULL) {
557 PyErr_SetObject(socket_gaierror, v);
558 Py_DECREF(v);
559 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562}
563
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000564#ifdef __VMS
565/* Function to send in segments */
566static int
567sendsegmented(int sock_fd, char *buf, int len, int flags)
568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 int n = 0;
570 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 while (remaining > 0) {
573 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
576 n = send(sock_fd, buf, segment, flags);
577 if (n < 0) {
578 return n;
579 }
580 remaining -= segment;
581 buf += segment;
582 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000585}
586#endif
587
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000588/* Function to perform the setting of socket blocking mode
589 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000590static int
591internal_setblocking(PySocketSockObject *s, int block)
592{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000593#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000595#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000596#ifdef SOCK_NONBLOCK
597 if (block)
598 s->sock_type &= (~SOCK_NONBLOCK);
599 else
600 s->sock_type |= SOCK_NONBLOCK;
601#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604#ifndef MS_WINDOWS
Jesus Cea14c81ab2012-10-05 02:11:36 +0200605#if defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 block = !block;
607 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200608#else /* !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
610 if (block)
611 delay_flag &= (~O_NONBLOCK);
612 else
613 delay_flag |= O_NONBLOCK;
614 fcntl(s->sock_fd, F_SETFL, delay_flag);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200615#endif /* !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000616#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 block = !block;
618 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000619#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 /* Since these don't return anything */
623 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624}
625
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000626/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000627 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000628 This does not raise an exception; we'll let our caller do that
629 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000630 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000631static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000632internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 /* Nothing to do unless we're in timeout mode (not non-blocking) */
637 if (s->sock_timeout <= 0.0)
638 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 /* Guard against closed socket */
641 if (s->sock_fd < 0)
642 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000643
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000644 /* Handling this condition here simplifies the select loops */
645 if (interval < 0.0)
646 return 1;
647
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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 {
652 struct pollfd pollfd;
653 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 pollfd.fd = s->sock_fd;
656 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000659 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 n = poll(&pollfd, 1, timeout);
661 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000662#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 {
664 /* Construct the arguments to select */
665 fd_set fds;
666 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000667 tv.tv_sec = (int)interval;
668 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 FD_ZERO(&fds);
670 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 /* See if the socket is ready */
673 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000674 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
675 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000677 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
678 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000680#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (n < 0)
683 return -1;
684 if (n == 0)
685 return 1;
686 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687}
688
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000689static int
690internal_select(PySocketSockObject *s, int writing)
691{
692 return internal_select_ex(s, writing, s->sock_timeout);
693}
694
695/*
696 Two macros for automatic retry of select() in case of false positives
697 (for example, select() could indicate a socket is ready for reading
698 but the data then discarded by the OS because of a wrong checksum).
699 Here is an example of use:
700
701 BEGIN_SELECT_LOOP(s)
702 Py_BEGIN_ALLOW_THREADS
703 timeout = internal_select_ex(s, 0, interval);
704 if (!timeout)
705 outlen = recv(s->sock_fd, cbuf, len, flags);
706 Py_END_ALLOW_THREADS
707 if (timeout == 1) {
708 PyErr_SetString(socket_timeout, "timed out");
709 return -1;
710 }
711 END_SELECT_LOOP(s)
712*/
713
714#define BEGIN_SELECT_LOOP(s) \
715 { \
716 _PyTime_timeval now, deadline = {0, 0}; \
717 double interval = s->sock_timeout; \
718 int has_timeout = s->sock_timeout > 0.0; \
719 if (has_timeout) { \
720 _PyTime_gettimeofday(&now); \
721 deadline = now; \
722 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
723 } \
724 while (1) { \
725 errno = 0; \
726
727#define END_SELECT_LOOP(s) \
728 if (!has_timeout || \
729 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
730 break; \
731 _PyTime_gettimeofday(&now); \
732 interval = _PyTime_INTERVAL(now, deadline); \
733 } \
734 } \
735
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000736/* Initialize a new socket object. */
737
Tim Petersa12b4cf2002-07-18 22:38:44 +0000738static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000739
Martin v. Löwis1a214512008-06-11 05:26:20 +0000740static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000741init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 s->sock_fd = fd;
745 s->sock_family = family;
746 s->sock_type = type;
747 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000750#ifdef SOCK_NONBLOCK
751 if (type & SOCK_NONBLOCK)
752 s->sock_timeout = 0.0;
753 else
754#endif
755 {
756 s->sock_timeout = defaulttimeout;
757 if (defaulttimeout >= 0.0)
758 internal_setblocking(s, 0);
759 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000760
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000761}
762
763
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764/* Create a new socket object.
765 This just creates the object and initializes it.
766 If the creation fails, return NULL and set an exception (implicit
767 in NEWOBJ()). */
768
Guido van Rossum73624e91994-10-10 17:59:00 +0000769static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000770new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 PySocketSockObject *s;
773 s = (PySocketSockObject *)
774 PyType_GenericNew(&sock_type, NULL, NULL);
775 if (s != NULL)
776 init_sockobject(s, fd, family, type, proto);
777 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778}
779
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780
Guido van Rossum48a680c2001-03-02 06:34:14 +0000781/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000782 thread to be in gethostbyname or getaddrinfo */
783#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200784static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000785#endif
786
787
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788/* Convert a string specifying a host name or one of a few symbolic
789 names to a numeric IP address. This usually calls gethostbyname()
790 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792 an error occurred; then an exception is raised. */
793
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000795setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 struct addrinfo hints, *res;
798 int error;
799 int d1, d2, d3, d4;
800 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
803 if (name[0] == '\0') {
804 int siz;
805 memset(&hints, 0, sizeof(hints));
806 hints.ai_family = af;
807 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
808 hints.ai_flags = AI_PASSIVE;
809 Py_BEGIN_ALLOW_THREADS
810 ACQUIRE_GETADDRINFO_LOCK
811 error = getaddrinfo(NULL, "0", &hints, &res);
812 Py_END_ALLOW_THREADS
813 /* We assume that those thread-unsafe getaddrinfo() versions
814 *are* safe regarding their return value, ie. that a
815 subsequent call to getaddrinfo() does not destroy the
816 outcome of the first call. */
817 RELEASE_GETADDRINFO_LOCK
818 if (error) {
819 set_gaierror(error);
820 return -1;
821 }
822 switch (res->ai_family) {
823 case AF_INET:
824 siz = 4;
825 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000826#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 case AF_INET6:
828 siz = 16;
829 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 default:
832 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200833 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 "unsupported address family");
835 return -1;
836 }
837 if (res->ai_next) {
838 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200839 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 "wildcard resolved to multiple address");
841 return -1;
842 }
843 if (res->ai_addrlen < addr_ret_size)
844 addr_ret_size = res->ai_addrlen;
845 memcpy(addr_ret, res->ai_addr, addr_ret_size);
846 freeaddrinfo(res);
847 return siz;
848 }
849 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
850 struct sockaddr_in *sin;
851 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200852 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 "address family mismatched");
854 return -1;
855 }
856 sin = (struct sockaddr_in *)addr_ret;
857 memset((void *) sin, '\0', sizeof(*sin));
858 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000859#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 sin->sin_addr.s_addr = INADDR_BROADCAST;
863 return sizeof(sin->sin_addr);
864 }
865 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
866 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
867 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
868 struct sockaddr_in *sin;
869 sin = (struct sockaddr_in *)addr_ret;
870 sin->sin_addr.s_addr = htonl(
871 ((long) d1 << 24) | ((long) d2 << 16) |
872 ((long) d3 << 8) | ((long) d4 << 0));
873 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000874#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 return 4;
878 }
879 memset(&hints, 0, sizeof(hints));
880 hints.ai_family = af;
881 Py_BEGIN_ALLOW_THREADS
882 ACQUIRE_GETADDRINFO_LOCK
883 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000884#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 if (error == EAI_NONAME && af == AF_UNSPEC) {
886 /* On Tru64 V5.1, numeric-to-addr conversion fails
887 if no address family is given. Assume IPv4 for now.*/
888 hints.ai_family = AF_INET;
889 error = getaddrinfo(name, NULL, &hints, &res);
890 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 Py_END_ALLOW_THREADS
893 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
894 if (error) {
895 set_gaierror(error);
896 return -1;
897 }
898 if (res->ai_addrlen < addr_ret_size)
899 addr_ret_size = res->ai_addrlen;
900 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
901 freeaddrinfo(res);
902 switch (addr_ret->sa_family) {
903 case AF_INET:
904 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000905#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 case AF_INET6:
907 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200910 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 return -1;
912 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913}
914
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915
Guido van Rossum30a685f1991-06-27 15:51:29 +0000916/* Create a string object representing an IP address.
917 This is always a string of the form 'dd.dd.dd.dd' (with variable
918 size numbers). */
919
Guido van Rossum73624e91994-10-10 17:59:00 +0000920static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000921makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 char buf[NI_MAXHOST];
924 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
927 NI_NUMERICHOST);
928 if (error) {
929 set_gaierror(error);
930 return NULL;
931 }
932 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933}
934
935
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000936#ifdef USE_BLUETOOTH
937/* Convert a string representation of a Bluetooth address into a numeric
938 address. Returns the length (6), or raises an exception and returns -1 if
939 an error occurred. */
940
941static int
942setbdaddr(char *name, bdaddr_t *bdaddr)
943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 unsigned int b0, b1, b2, b3, b4, b5;
945 char ch;
946 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
949 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
950 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
951 bdaddr->b[0] = b0;
952 bdaddr->b[1] = b1;
953 bdaddr->b[2] = b2;
954 bdaddr->b[3] = b3;
955 bdaddr->b[4] = b4;
956 bdaddr->b[5] = b5;
957 return 6;
958 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200959 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 return -1;
961 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000962}
963
964/* Create a string representation of the Bluetooth address. This is always a
965 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
966 value (zero padded if necessary). */
967
968static PyObject *
969makebdaddr(bdaddr_t *bdaddr)
970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
974 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
975 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
976 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000977}
978#endif
979
980
Guido van Rossum30a685f1991-06-27 15:51:29 +0000981/* Create an object representing the given socket address,
982 suitable for passing it back to bind(), connect() etc.
983 The family field of the sockaddr structure is inspected
984 to determine what kind of address it really is. */
985
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000987static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000988makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 if (addrlen == 0) {
991 /* No address -- may be recvfrom() from known socket */
992 Py_INCREF(Py_None);
993 return Py_None;
994 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 case AF_INET:
999 {
1000 struct sockaddr_in *a;
1001 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1002 PyObject *ret = NULL;
1003 if (addrobj) {
1004 a = (struct sockaddr_in *)addr;
1005 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1006 Py_DECREF(addrobj);
1007 }
1008 return ret;
1009 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001011#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 case AF_UNIX:
1013 {
1014 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001015#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1017 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001018 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 }
1020 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001021#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 {
1023 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001024 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 }
1026 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001027#endif /* AF_UNIX */
1028
Martin v. Löwis11017b12006-01-14 18:12:57 +00001029#if defined(AF_NETLINK)
1030 case AF_NETLINK:
1031 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1033 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001034 }
1035#endif /* AF_NETLINK */
1036
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001037#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 case AF_INET6:
1039 {
1040 struct sockaddr_in6 *a;
1041 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1042 PyObject *ret = NULL;
1043 if (addrobj) {
1044 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001045 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 addrobj,
1047 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001048 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 a->sin6_scope_id);
1050 Py_DECREF(addrobj);
1051 }
1052 return ret;
1053 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001054#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001055
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001056#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case AF_BLUETOOTH:
1058 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 case BTPROTO_L2CAP:
1061 {
1062 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1063 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1064 PyObject *ret = NULL;
1065 if (addrobj) {
1066 ret = Py_BuildValue("Oi",
1067 addrobj,
1068 _BT_L2_MEMB(a, psm));
1069 Py_DECREF(addrobj);
1070 }
1071 return ret;
1072 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 case BTPROTO_RFCOMM:
1075 {
1076 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1077 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1078 PyObject *ret = NULL;
1079 if (addrobj) {
1080 ret = Py_BuildValue("Oi",
1081 addrobj,
1082 _BT_RC_MEMB(a, channel));
1083 Py_DECREF(addrobj);
1084 }
1085 return ret;
1086 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case BTPROTO_HCI:
1089 {
1090 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001091#if defined(__NetBSD__) || defined(__DragonFly__)
1092 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1093#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 PyObject *ret = NULL;
1095 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1096 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001099
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 case BTPROTO_SCO:
1102 {
1103 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1104 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1105 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001106#endif
1107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 default:
1109 PyErr_SetString(PyExc_ValueError,
1110 "Unknown Bluetooth protocol");
1111 return NULL;
1112 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001113#endif
1114
Antoine Pitroub156a462010-10-27 20:13:57 +00001115#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 case AF_PACKET:
1117 {
1118 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1119 char *ifname = "";
1120 struct ifreq ifr;
1121 /* need to look up interface name give index */
1122 if (a->sll_ifindex) {
1123 ifr.ifr_ifindex = a->sll_ifindex;
1124 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1125 ifname = ifr.ifr_name;
1126 }
1127 return Py_BuildValue("shbhy#",
1128 ifname,
1129 ntohs(a->sll_protocol),
1130 a->sll_pkttype,
1131 a->sll_hatype,
1132 a->sll_addr,
1133 a->sll_halen);
1134 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001135#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001136
Christian Heimes043d6f62008-01-07 17:19:16 +00001137#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 case AF_TIPC:
1139 {
1140 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1141 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1142 return Py_BuildValue("IIIII",
1143 a->addrtype,
1144 a->addr.nameseq.type,
1145 a->addr.nameseq.lower,
1146 a->addr.nameseq.upper,
1147 a->scope);
1148 } else if (a->addrtype == TIPC_ADDR_NAME) {
1149 return Py_BuildValue("IIIII",
1150 a->addrtype,
1151 a->addr.name.name.type,
1152 a->addr.name.name.instance,
1153 a->addr.name.name.instance,
1154 a->scope);
1155 } else if (a->addrtype == TIPC_ADDR_ID) {
1156 return Py_BuildValue("IIIII",
1157 a->addrtype,
1158 a->addr.id.node,
1159 a->addr.id.ref,
1160 0,
1161 a->scope);
1162 } else {
1163 PyErr_SetString(PyExc_ValueError,
1164 "Invalid address type");
1165 return NULL;
1166 }
1167 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001168#endif
1169
Charles-François Natali30589c92011-10-07 22:47:08 +02001170#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001171 case AF_CAN:
1172 {
1173 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1174 char *ifname = "";
1175 struct ifreq ifr;
1176 /* need to look up interface name given index */
1177 if (a->can_ifindex) {
1178 ifr.ifr_ifindex = a->can_ifindex;
1179 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1180 ifname = ifr.ifr_name;
1181 }
1182
1183 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1184 ifname,
1185 a->can_family);
1186 }
1187#endif
1188
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001189#ifdef PF_SYSTEM
1190 case PF_SYSTEM:
1191 switch(proto) {
1192#ifdef SYSPROTO_CONTROL
1193 case SYSPROTO_CONTROL:
1194 {
1195 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1196 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1197 }
1198#endif
1199 default:
1200 PyErr_SetString(PyExc_ValueError,
1201 "Invalid address type");
1202 return 0;
1203 }
1204#endif
1205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 default:
1209 /* If we don't know the address family, don't raise an
1210 exception -- return it as an (int, bytes) tuple. */
1211 return Py_BuildValue("iy#",
1212 addr->sa_family,
1213 addr->sa_data,
1214 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217}
1218
Guido van Rossum30a685f1991-06-27 15:51:29 +00001219
1220/* Parse a socket address argument according to the socket object's
1221 address family. Return 1 if the address was in the proper format,
1222 0 of not. The address is returned through addr_ret, its length
1223 through len_ret. */
1224
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001226getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001231#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 case AF_UNIX:
1233 {
1234 struct sockaddr_un* addr;
1235 char *path;
1236 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001237 int retval = 0;
1238
1239 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1240 allow embedded nulls on Linux. */
1241 if (PyUnicode_Check(args)) {
1242 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1243 return 0;
1244 }
1245 else
1246 Py_INCREF(args);
1247 if (!PyArg_Parse(args, "y#", &path, &len))
1248 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001251#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 if (len > 0 && path[0] == 0) {
1253 /* Linux abstract namespace extension */
1254 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001255 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001257 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 }
1259 }
1260 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001261#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 {
1263 /* regular NULL-terminated string */
1264 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001265 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001267 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 }
1269 addr->sun_path[len] = 0;
1270 }
1271 addr->sun_family = s->sock_family;
1272 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001274 retval = 1;
1275 unix_out:
1276 Py_DECREF(args);
1277 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001279#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001280
Martin v. Löwis11017b12006-01-14 18:12:57 +00001281#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 case AF_NETLINK:
1283 {
1284 struct sockaddr_nl* addr;
1285 int pid, groups;
1286 addr = (struct sockaddr_nl *)addr_ret;
1287 if (!PyTuple_Check(args)) {
1288 PyErr_Format(
1289 PyExc_TypeError,
1290 "getsockaddrarg: "
1291 "AF_NETLINK address must be tuple, not %.500s",
1292 Py_TYPE(args)->tp_name);
1293 return 0;
1294 }
1295 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1296 return 0;
1297 addr->nl_family = AF_NETLINK;
1298 addr->nl_pid = pid;
1299 addr->nl_groups = groups;
1300 *len_ret = sizeof(*addr);
1301 return 1;
1302 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001303#endif
1304
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001305#ifdef AF_RDS
1306 case AF_RDS:
1307 /* RDS sockets use sockaddr_in: fall-through */
1308#endif
1309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 case AF_INET:
1311 {
1312 struct sockaddr_in* addr;
1313 char *host;
1314 int port, result;
1315 if (!PyTuple_Check(args)) {
1316 PyErr_Format(
1317 PyExc_TypeError,
1318 "getsockaddrarg: "
1319 "AF_INET address must be tuple, not %.500s",
1320 Py_TYPE(args)->tp_name);
1321 return 0;
1322 }
1323 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1324 "idna", &host, &port))
1325 return 0;
1326 addr=(struct sockaddr_in*)addr_ret;
1327 result = setipaddr(host, (struct sockaddr *)addr,
1328 sizeof(*addr), AF_INET);
1329 PyMem_Free(host);
1330 if (result < 0)
1331 return 0;
1332 if (port < 0 || port > 0xffff) {
1333 PyErr_SetString(
1334 PyExc_OverflowError,
1335 "getsockaddrarg: port must be 0-65535.");
1336 return 0;
1337 }
1338 addr->sin_family = AF_INET;
1339 addr->sin_port = htons((short)port);
1340 *len_ret = sizeof *addr;
1341 return 1;
1342 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001344#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 case AF_INET6:
1346 {
1347 struct sockaddr_in6* addr;
1348 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001349 int port, result;
1350 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 flowinfo = scope_id = 0;
1352 if (!PyTuple_Check(args)) {
1353 PyErr_Format(
1354 PyExc_TypeError,
1355 "getsockaddrarg: "
1356 "AF_INET6 address must be tuple, not %.500s",
1357 Py_TYPE(args)->tp_name);
1358 return 0;
1359 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001360 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 "idna", &host, &port, &flowinfo,
1362 &scope_id)) {
1363 return 0;
1364 }
1365 addr = (struct sockaddr_in6*)addr_ret;
1366 result = setipaddr(host, (struct sockaddr *)addr,
1367 sizeof(*addr), AF_INET6);
1368 PyMem_Free(host);
1369 if (result < 0)
1370 return 0;
1371 if (port < 0 || port > 0xffff) {
1372 PyErr_SetString(
1373 PyExc_OverflowError,
1374 "getsockaddrarg: port must be 0-65535.");
1375 return 0;
1376 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001377 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001378 PyErr_SetString(
1379 PyExc_OverflowError,
1380 "getsockaddrarg: flowinfo must be 0-1048575.");
1381 return 0;
1382 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 addr->sin6_family = s->sock_family;
1384 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001385 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 addr->sin6_scope_id = scope_id;
1387 *len_ret = sizeof *addr;
1388 return 1;
1389 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001390#endif
1391
Hye-Shik Chang81268602004-02-02 06:05:24 +00001392#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 case AF_BLUETOOTH:
1394 {
1395 switch (s->sock_proto) {
1396 case BTPROTO_L2CAP:
1397 {
1398 struct sockaddr_l2 *addr;
1399 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 addr = (struct sockaddr_l2 *)addr_ret;
1402 memset(addr, 0, sizeof(struct sockaddr_l2));
1403 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1404 if (!PyArg_ParseTuple(args, "si", &straddr,
1405 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001406 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 "wrong format");
1408 return 0;
1409 }
1410 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1411 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 *len_ret = sizeof *addr;
1414 return 1;
1415 }
1416 case BTPROTO_RFCOMM:
1417 {
1418 struct sockaddr_rc *addr;
1419 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 addr = (struct sockaddr_rc *)addr_ret;
1422 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1423 if (!PyArg_ParseTuple(args, "si", &straddr,
1424 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001425 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 "wrong format");
1427 return 0;
1428 }
1429 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1430 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 *len_ret = sizeof *addr;
1433 return 1;
1434 }
1435 case BTPROTO_HCI:
1436 {
1437 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001438#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001439 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001440
Alexander Belopolskye239d232010-12-08 23:31:48 +00001441 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001442 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001443 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001444 "wrong format");
1445 return 0;
1446 }
1447 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1448 return 0;
1449#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1451 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001452 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 "wrong format");
1454 return 0;
1455 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 *len_ret = sizeof *addr;
1458 return 1;
1459 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001460#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 case BTPROTO_SCO:
1462 {
1463 struct sockaddr_sco *addr;
1464 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 addr = (struct sockaddr_sco *)addr_ret;
1467 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1468 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001469 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 "wrong format");
1471 return 0;
1472 }
1473 straddr = PyBytes_AS_STRING(args);
1474 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1475 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 *len_ret = sizeof *addr;
1478 return 1;
1479 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001482 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 return 0;
1484 }
1485 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001486#endif
1487
Antoine Pitroub156a462010-10-27 20:13:57 +00001488#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 case AF_PACKET:
1490 {
1491 struct sockaddr_ll* addr;
1492 struct ifreq ifr;
1493 char *interfaceName;
1494 int protoNumber;
1495 int hatype = 0;
1496 int pkttype = 0;
1497 char *haddr = NULL;
1498 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (!PyTuple_Check(args)) {
1501 PyErr_Format(
1502 PyExc_TypeError,
1503 "getsockaddrarg: "
1504 "AF_PACKET address must be tuple, not %.500s",
1505 Py_TYPE(args)->tp_name);
1506 return 0;
1507 }
1508 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1509 &protoNumber, &pkttype, &hatype,
1510 &haddr, &halen))
1511 return 0;
1512 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1513 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1514 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1515 s->errorhandler();
1516 return 0;
1517 }
1518 if (halen > 8) {
1519 PyErr_SetString(PyExc_ValueError,
1520 "Hardware address must be 8 bytes or less");
1521 return 0;
1522 }
1523 if (protoNumber < 0 || protoNumber > 0xffff) {
1524 PyErr_SetString(
1525 PyExc_OverflowError,
1526 "getsockaddrarg: protoNumber must be 0-65535.");
1527 return 0;
1528 }
1529 addr = (struct sockaddr_ll*)addr_ret;
1530 addr->sll_family = AF_PACKET;
1531 addr->sll_protocol = htons((short)protoNumber);
1532 addr->sll_ifindex = ifr.ifr_ifindex;
1533 addr->sll_pkttype = pkttype;
1534 addr->sll_hatype = hatype;
1535 if (halen != 0) {
1536 memcpy(&addr->sll_addr, haddr, halen);
1537 }
1538 addr->sll_halen = halen;
1539 *len_ret = sizeof *addr;
1540 return 1;
1541 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001542#endif
1543
Christian Heimes043d6f62008-01-07 17:19:16 +00001544#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 case AF_TIPC:
1546 {
1547 unsigned int atype, v1, v2, v3;
1548 unsigned int scope = TIPC_CLUSTER_SCOPE;
1549 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 if (!PyTuple_Check(args)) {
1552 PyErr_Format(
1553 PyExc_TypeError,
1554 "getsockaddrarg: "
1555 "AF_TIPC address must be tuple, not %.500s",
1556 Py_TYPE(args)->tp_name);
1557 return 0;
1558 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 if (!PyArg_ParseTuple(args,
1561 "IIII|I;Invalid TIPC address format",
1562 &atype, &v1, &v2, &v3, &scope))
1563 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 addr = (struct sockaddr_tipc *) addr_ret;
1566 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 addr->family = AF_TIPC;
1569 addr->scope = scope;
1570 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 if (atype == TIPC_ADDR_NAMESEQ) {
1573 addr->addr.nameseq.type = v1;
1574 addr->addr.nameseq.lower = v2;
1575 addr->addr.nameseq.upper = v3;
1576 } else if (atype == TIPC_ADDR_NAME) {
1577 addr->addr.name.name.type = v1;
1578 addr->addr.name.name.instance = v2;
1579 } else if (atype == TIPC_ADDR_ID) {
1580 addr->addr.id.node = v1;
1581 addr->addr.id.ref = v2;
1582 } else {
1583 /* Shouldn't happen */
1584 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1585 return 0;
1586 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 return 1;
1591 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001592#endif
1593
Charles-François Natali30589c92011-10-07 22:47:08 +02001594#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001595 case AF_CAN:
1596 switch (s->sock_proto) {
1597 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001598 /* fall-through */
1599 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001600 {
1601 struct sockaddr_can *addr;
1602 PyObject *interfaceName;
1603 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001604 Py_ssize_t len;
1605
Benjamin Peterson18b71912013-05-16 15:29:44 -05001606 addr = (struct sockaddr_can *)addr_ret;
1607
Charles-François Natali47413c12011-10-06 19:47:44 +02001608 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1609 &interfaceName))
1610 return 0;
1611
1612 len = PyBytes_GET_SIZE(interfaceName);
1613
1614 if (len == 0) {
1615 ifr.ifr_ifindex = 0;
1616 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001617 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1618 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001619 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1620 s->errorhandler();
1621 Py_DECREF(interfaceName);
1622 return 0;
1623 }
1624 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001625 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001626 "AF_CAN interface name too long");
1627 Py_DECREF(interfaceName);
1628 return 0;
1629 }
1630
1631 addr->can_family = AF_CAN;
1632 addr->can_ifindex = ifr.ifr_ifindex;
1633
1634 *len_ret = sizeof(*addr);
1635 Py_DECREF(interfaceName);
1636 return 1;
1637 }
1638 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001639 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001640 "getsockaddrarg: unsupported CAN protocol");
1641 return 0;
1642 }
1643#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001644
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001645#ifdef PF_SYSTEM
1646 case PF_SYSTEM:
1647 switch (s->sock_proto) {
1648#ifdef SYSPROTO_CONTROL
1649 case SYSPROTO_CONTROL:
1650 {
1651 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001652
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001653 addr = (struct sockaddr_ctl *)addr_ret;
1654 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001655 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001656
1657 if (PyUnicode_Check(args)) {
1658 struct ctl_info info;
1659 PyObject *ctl_name;
1660
1661 if (!PyArg_Parse(args, "O&",
1662 PyUnicode_FSConverter, &ctl_name)) {
1663 return 0;
1664 }
1665
1666 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1667 PyErr_SetString(PyExc_ValueError,
1668 "provided string is too long");
1669 Py_DECREF(ctl_name);
1670 return 0;
1671 }
1672 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1673 sizeof(info.ctl_name));
1674 Py_DECREF(ctl_name);
1675
1676 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1677 PyErr_SetString(PyExc_OSError,
1678 "cannot find kernel control with provided name");
1679 return 0;
1680 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001681
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001682 addr->sc_id = info.ctl_id;
1683 addr->sc_unit = 0;
1684 } else if (!PyArg_ParseTuple(args, "II",
1685 &(addr->sc_id), &(addr->sc_unit))) {
1686 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1687 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001688
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001689 return 0;
1690 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001691
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001692 *len_ret = sizeof(*addr);
1693 return 1;
1694 }
1695#endif
1696 default:
1697 PyErr_SetString(PyExc_OSError,
1698 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1699 return 0;
1700 }
1701#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001706 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001710}
1711
Guido van Rossum30a685f1991-06-27 15:51:29 +00001712
Guido van Rossum48a680c2001-03-02 06:34:14 +00001713/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001714 Return 1 if the family is known, 0 otherwise. The length is returned
1715 through len_ret. */
1716
1717static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001718getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001721
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001722#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 case AF_UNIX:
1724 {
1725 *len_ret = sizeof (struct sockaddr_un);
1726 return 1;
1727 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001728#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001729#if defined(AF_NETLINK)
1730 case AF_NETLINK:
1731 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 *len_ret = sizeof (struct sockaddr_nl);
1733 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001734 }
1735#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001736
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001737#ifdef AF_RDS
1738 case AF_RDS:
1739 /* RDS sockets use sockaddr_in: fall-through */
1740#endif
1741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 case AF_INET:
1743 {
1744 *len_ret = sizeof (struct sockaddr_in);
1745 return 1;
1746 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001747
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001748#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 case AF_INET6:
1750 {
1751 *len_ret = sizeof (struct sockaddr_in6);
1752 return 1;
1753 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001754#endif
1755
Hye-Shik Chang81268602004-02-02 06:05:24 +00001756#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 case AF_BLUETOOTH:
1758 {
1759 switch(s->sock_proto)
1760 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 case BTPROTO_L2CAP:
1763 *len_ret = sizeof (struct sockaddr_l2);
1764 return 1;
1765 case BTPROTO_RFCOMM:
1766 *len_ret = sizeof (struct sockaddr_rc);
1767 return 1;
1768 case BTPROTO_HCI:
1769 *len_ret = sizeof (struct sockaddr_hci);
1770 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001771#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 case BTPROTO_SCO:
1773 *len_ret = sizeof (struct sockaddr_sco);
1774 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001777 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 "unknown BT protocol");
1779 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 }
1782 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001783#endif
1784
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001785#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 case AF_PACKET:
1787 {
1788 *len_ret = sizeof (struct sockaddr_ll);
1789 return 1;
1790 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001791#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001792
Christian Heimes043d6f62008-01-07 17:19:16 +00001793#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 case AF_TIPC:
1795 {
1796 *len_ret = sizeof (struct sockaddr_tipc);
1797 return 1;
1798 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001799#endif
1800
Charles-François Natali30589c92011-10-07 22:47:08 +02001801#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001802 case AF_CAN:
1803 {
1804 *len_ret = sizeof (struct sockaddr_can);
1805 return 1;
1806 }
1807#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001808
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001809#ifdef PF_SYSTEM
1810 case PF_SYSTEM:
1811 switch(s->sock_proto) {
1812#ifdef SYSPROTO_CONTROL
1813 case SYSPROTO_CONTROL:
1814 *len_ret = sizeof (struct sockaddr_ctl);
1815 return 1;
1816#endif
1817 default:
1818 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1819 "unknown PF_SYSTEM protocol");
1820 return 0;
1821 }
1822#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001827 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001831}
1832
1833
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001834/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1835 Currently, these methods are only compiled if the RFC 2292/3542
1836 CMSG_LEN() macro is available. Older systems seem to have used
1837 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1838 it may be possible to define CMSG_LEN() that way if it's not
1839 provided. Some architectures might need extra padding after the
1840 cmsghdr, however, and CMSG_LEN() would have to take account of
1841 this. */
1842#ifdef CMSG_LEN
1843/* If length is in range, set *result to CMSG_LEN(length) and return
1844 true; otherwise, return false. */
1845static int
1846get_CMSG_LEN(size_t length, size_t *result)
1847{
1848 size_t tmp;
1849
1850 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1851 return 0;
1852 tmp = CMSG_LEN(length);
1853 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1854 return 0;
1855 *result = tmp;
1856 return 1;
1857}
1858
1859#ifdef CMSG_SPACE
1860/* If length is in range, set *result to CMSG_SPACE(length) and return
1861 true; otherwise, return false. */
1862static int
1863get_CMSG_SPACE(size_t length, size_t *result)
1864{
1865 size_t tmp;
1866
1867 /* Use CMSG_SPACE(1) here in order to take account of the padding
1868 necessary before *and* after the data. */
1869 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1870 return 0;
1871 tmp = CMSG_SPACE(length);
1872 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1873 return 0;
1874 *result = tmp;
1875 return 1;
1876}
1877#endif
1878
1879/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1880 pointer in msg->msg_control with at least "space" bytes after it,
1881 and its cmsg_len member inside the buffer. */
1882static int
1883cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1884{
1885 size_t cmsg_offset;
1886 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1887 sizeof(cmsgh->cmsg_len));
1888
Charles-François Natali466517d2011-08-28 18:23:43 +02001889 /* Note that POSIX allows msg_controllen to be of signed type. */
1890 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001891 return 0;
1892 if (space < cmsg_len_end)
1893 space = cmsg_len_end;
1894 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1895 return (cmsg_offset <= (size_t)-1 - space &&
1896 cmsg_offset + space <= msg->msg_controllen);
1897}
1898
1899/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1900 *space to number of bytes following it in the buffer and return
1901 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1902 msg->msg_controllen are valid. */
1903static int
1904get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1905{
1906 size_t data_offset;
1907 char *data_ptr;
1908
1909 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1910 return 0;
1911 data_offset = data_ptr - (char *)msg->msg_control;
1912 if (data_offset > msg->msg_controllen)
1913 return 0;
1914 *space = msg->msg_controllen - data_offset;
1915 return 1;
1916}
1917
1918/* If cmsgh is invalid or not contained in the buffer pointed to by
1919 msg->msg_control, return -1. If cmsgh is valid and its associated
1920 data is entirely contained in the buffer, set *data_len to the
1921 length of the associated data and return 0. If only part of the
1922 associated data is contained in the buffer but cmsgh is otherwise
1923 valid, set *data_len to the length contained in the buffer and
1924 return 1. */
1925static int
1926get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1927{
1928 size_t space, cmsg_data_len;
1929
1930 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1931 cmsgh->cmsg_len < CMSG_LEN(0))
1932 return -1;
1933 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1934 if (!get_cmsg_data_space(msg, cmsgh, &space))
1935 return -1;
1936 if (space >= cmsg_data_len) {
1937 *data_len = cmsg_data_len;
1938 return 0;
1939 }
1940 *data_len = space;
1941 return 1;
1942}
1943#endif /* CMSG_LEN */
1944
1945
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001946/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001947
Guido van Rossum73624e91994-10-10 17:59:00 +00001948static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001949sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 sock_addr_t addrbuf;
1952 SOCKET_T newfd = INVALID_SOCKET;
1953 socklen_t addrlen;
1954 PyObject *sock = NULL;
1955 PyObject *addr = NULL;
1956 PyObject *res = NULL;
1957 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 if (!getsockaddrlen(s, &addrlen))
1959 return NULL;
1960 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 if (!IS_SELECTABLE(s))
1963 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001964
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001965 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001967 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001968 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001970 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 if (timeout == 1) {
1974 PyErr_SetString(socket_timeout, "timed out");
1975 return NULL;
1976 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001977 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 if (newfd == INVALID_SOCKET)
1980 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 sock = PyLong_FromSocket_t(newfd);
1983 if (sock == NULL) {
1984 SOCKETCLOSE(newfd);
1985 goto finally;
1986 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1989 addrlen, s->sock_proto);
1990 if (addr == NULL)
1991 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001994
Guido van Rossum67f7a382002-06-06 21:08:16 +00001995finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 Py_XDECREF(sock);
1997 Py_XDECREF(addr);
1998 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001999}
2000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002001PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002002"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002003\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002004Wait for an incoming connection. Return a new socket file descriptor\n\
2005representing the connection, and the address of the client.\n\
2006For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002007
Guido van Rossum11ba0942002-06-13 15:07:44 +00002008/* s.setblocking(flag) method. Argument:
2009 False -- non-blocking mode; same as settimeout(0)
2010 True -- blocking mode; same as settimeout(None)
2011*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002012
Guido van Rossum73624e91994-10-10 17:59:00 +00002013static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002014sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002015{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002016 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 block = PyLong_AsLong(arg);
2019 if (block == -1 && PyErr_Occurred())
2020 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 s->sock_timeout = block ? -1.0 : 0.0;
2023 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 Py_INCREF(Py_None);
2026 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002027}
Guido van Rossume4485b01994-09-07 14:32:49 +00002028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002029PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002030"setblocking(flag)\n\
2031\n\
2032Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002033setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002034setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002035
Guido van Rossum11ba0942002-06-13 15:07:44 +00002036/* s.settimeout(timeout) method. Argument:
2037 None -- no timeout, blocking mode; same as setblocking(True)
2038 0.0 -- non-blocking mode; same as setblocking(False)
2039 > 0 -- timeout mode; operations time out after timeout seconds
2040 < 0 -- illegal; raises an exception
2041*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002042static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002043sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 if (arg == Py_None)
2048 timeout = -1.0;
2049 else {
2050 timeout = PyFloat_AsDouble(arg);
2051 if (timeout < 0.0) {
2052 if (!PyErr_Occurred())
2053 PyErr_SetString(PyExc_ValueError,
2054 "Timeout value out of range");
2055 return NULL;
2056 }
2057 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 s->sock_timeout = timeout;
2060 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 Py_INCREF(Py_None);
2063 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002064}
2065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002066PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002067"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002068\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002069Set a timeout on socket operations. 'timeout' can be a float,\n\
2070giving in seconds, or None. Setting a timeout of None disables\n\
2071the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002072Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002074/* s.gettimeout() method.
2075 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002077sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002078{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 if (s->sock_timeout < 0.0) {
2080 Py_INCREF(Py_None);
2081 return Py_None;
2082 }
2083 else
2084 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002085}
2086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002087PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002088"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002089\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002090Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002092operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002093
Guido van Rossumaee08791992-09-08 09:05:33 +00002094/* s.setsockopt() method.
2095 With an integer third argument, sets an integer option.
2096 With a string third argument, sets an option from a buffer;
2097 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002098
Guido van Rossum73624e91994-10-10 17:59:00 +00002099static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002100sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 int level;
2103 int optname;
2104 int res;
2105 char *buf;
2106 int buflen;
2107 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 if (PyArg_ParseTuple(args, "iii:setsockopt",
2110 &level, &optname, &flag)) {
2111 buf = (char *) &flag;
2112 buflen = sizeof flag;
2113 }
2114 else {
2115 PyErr_Clear();
2116 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2117 &level, &optname, &buf, &buflen))
2118 return NULL;
2119 }
2120 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2121 if (res < 0)
2122 return s->errorhandler();
2123 Py_INCREF(Py_None);
2124 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002125}
2126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002127PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002128"setsockopt(level, option, value)\n\
2129\n\
2130Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002131The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002132
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002133
Guido van Rossumaee08791992-09-08 09:05:33 +00002134/* s.getsockopt() method.
2135 With two arguments, retrieves an integer option.
2136 With a third integer argument, retrieves a string buffer of that size;
2137 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002138
Guido van Rossum73624e91994-10-10 17:59:00 +00002139static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002140sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 int level;
2143 int optname;
2144 int res;
2145 PyObject *buf;
2146 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2149 &level, &optname, &buflen))
2150 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 if (buflen == 0) {
2153 int flag = 0;
2154 socklen_t flagsize = sizeof flag;
2155 res = getsockopt(s->sock_fd, level, optname,
2156 (void *)&flag, &flagsize);
2157 if (res < 0)
2158 return s->errorhandler();
2159 return PyLong_FromLong(flag);
2160 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002161#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 /* socklen_t is unsigned so no negative test is needed,
2163 test buflen == 0 is previously done */
2164 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002165#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002167#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002168 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 "getsockopt buflen out of range");
2170 return NULL;
2171 }
2172 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2173 if (buf == NULL)
2174 return NULL;
2175 res = getsockopt(s->sock_fd, level, optname,
2176 (void *)PyBytes_AS_STRING(buf), &buflen);
2177 if (res < 0) {
2178 Py_DECREF(buf);
2179 return s->errorhandler();
2180 }
2181 _PyBytes_Resize(&buf, buflen);
2182 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002183}
2184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186"getsockopt(level, option[, buffersize]) -> value\n\
2187\n\
2188Get a socket option. See the Unix manual for level and option.\n\
2189If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002190string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002191
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002192
Fred Drake728819a2000-07-01 03:40:12 +00002193/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002194
Guido van Rossum73624e91994-10-10 17:59:00 +00002195static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002196sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 sock_addr_t addrbuf;
2199 int addrlen;
2200 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2203 return NULL;
2204 Py_BEGIN_ALLOW_THREADS
2205 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2206 Py_END_ALLOW_THREADS
2207 if (res < 0)
2208 return s->errorhandler();
2209 Py_INCREF(Py_None);
2210 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002211}
2212
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002213PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002214"bind(address)\n\
2215\n\
2216Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002217pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002218sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002219
Guido van Rossum30a685f1991-06-27 15:51:29 +00002220
2221/* s.close() method.
2222 Set the file descriptor to -1 so operations tried subsequently
2223 will surely fail. */
2224
Guido van Rossum73624e91994-10-10 17:59:00 +00002225static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002226sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 if ((fd = s->sock_fd) != -1) {
2231 s->sock_fd = -1;
2232 Py_BEGIN_ALLOW_THREADS
2233 (void) SOCKETCLOSE(fd);
2234 Py_END_ALLOW_THREADS
2235 }
2236 Py_INCREF(Py_None);
2237 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002238}
2239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002240PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002241"close()\n\
2242\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002245static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002246sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002247{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002248 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002249 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002250 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002251}
2252
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002253PyDoc_STRVAR(detach_doc,
2254"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002255\n\
2256Close the socket object without closing the underlying file descriptor.\
2257The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002258can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002259
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002260static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002261internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 timeout = 0;
2267 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002268
2269#ifdef MS_WINDOWS
2270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 if (s->sock_timeout > 0.0) {
2272 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2273 IS_SELECTABLE(s)) {
2274 /* This is a mess. Best solution: trust select */
2275 fd_set fds;
2276 fd_set fds_exc;
2277 struct timeval tv;
2278 tv.tv_sec = (int)s->sock_timeout;
2279 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2280 FD_ZERO(&fds);
2281 FD_SET(s->sock_fd, &fds);
2282 FD_ZERO(&fds_exc);
2283 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002284 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2285 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 if (res == 0) {
2287 res = WSAEWOULDBLOCK;
2288 timeout = 1;
2289 } else if (res > 0) {
2290 if (FD_ISSET(s->sock_fd, &fds))
2291 /* The socket is in the writable set - this
2292 means connected */
2293 res = 0;
2294 else {
2295 /* As per MS docs, we need to call getsockopt()
2296 to get the underlying error */
2297 int res_size = sizeof res;
2298 /* It must be in the exception set */
2299 assert(FD_ISSET(s->sock_fd, &fds_exc));
2300 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2301 (char *)&res, &res_size))
2302 /* getsockopt also clears WSAGetLastError,
2303 so reset it back. */
2304 WSASetLastError(res);
2305 else
2306 res = WSAGetLastError();
2307 }
2308 }
2309 /* else if (res < 0) an error occurred */
2310 }
2311 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 if (res < 0)
2314 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002315
2316#else
2317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 if (s->sock_timeout > 0.0) {
2319 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2320 timeout = internal_select(s, 1);
2321 if (timeout == 0) {
2322 /* Bug #1019808: in case of an EINPROGRESS,
2323 use getsockopt(SO_ERROR) to get the real
2324 error. */
2325 socklen_t res_size = sizeof res;
2326 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2327 SO_ERROR, &res, &res_size);
2328 if (res == EISCONN)
2329 res = 0;
2330 errno = res;
2331 }
2332 else if (timeout == -1) {
2333 res = errno; /* had error */
2334 }
2335 else
2336 res = EWOULDBLOCK; /* timed out */
2337 }
2338 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 if (res < 0)
2341 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002342
2343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002347}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002348
Fred Drake728819a2000-07-01 03:40:12 +00002349/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002350
Guido van Rossum73624e91994-10-10 17:59:00 +00002351static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002352sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 sock_addr_t addrbuf;
2355 int addrlen;
2356 int res;
2357 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2360 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 Py_BEGIN_ALLOW_THREADS
2363 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2364 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 if (timeout == 1) {
2367 PyErr_SetString(socket_timeout, "timed out");
2368 return NULL;
2369 }
2370 if (res != 0)
2371 return s->errorhandler();
2372 Py_INCREF(Py_None);
2373 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002374}
2375
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002376PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002377"connect(address)\n\
2378\n\
2379Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002380is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002381
Guido van Rossum30a685f1991-06-27 15:51:29 +00002382
Fred Drake728819a2000-07-01 03:40:12 +00002383/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002384
2385static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002386sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 sock_addr_t addrbuf;
2389 int addrlen;
2390 int res;
2391 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2394 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 Py_BEGIN_ALLOW_THREADS
2397 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2398 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 /* Signals are not errors (though they may raise exceptions). Adapted
2401 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002402#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 if (res == EINTR && PyErr_CheckSignals())
2404 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002405#endif
2406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002408}
2409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002410PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002411"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002412\n\
2413This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002414instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002415
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002416
Guido van Rossumed233a51992-06-23 09:07:03 +00002417/* s.fileno() method */
2418
Guido van Rossum73624e91994-10-10 17:59:00 +00002419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002420sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002423}
2424
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002425PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002426"fileno() -> integer\n\
2427\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002428Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002429
Guido van Rossumed233a51992-06-23 09:07:03 +00002430
Guido van Rossumc89705d1992-11-26 08:54:07 +00002431/* s.getsockname() method */
2432
Guido van Rossum73624e91994-10-10 17:59:00 +00002433static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002434sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 sock_addr_t addrbuf;
2437 int res;
2438 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 if (!getsockaddrlen(s, &addrlen))
2441 return NULL;
2442 memset(&addrbuf, 0, addrlen);
2443 Py_BEGIN_ALLOW_THREADS
2444 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2445 Py_END_ALLOW_THREADS
2446 if (res < 0)
2447 return s->errorhandler();
2448 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2449 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002450}
2451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002452PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002453"getsockname() -> address info\n\
2454\n\
2455Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002456info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002457
Guido van Rossumc89705d1992-11-26 08:54:07 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002460/* s.getpeername() method */
2461
Guido van Rossum73624e91994-10-10 17:59:00 +00002462static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002463sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 sock_addr_t addrbuf;
2466 int res;
2467 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 if (!getsockaddrlen(s, &addrlen))
2470 return NULL;
2471 memset(&addrbuf, 0, addrlen);
2472 Py_BEGIN_ALLOW_THREADS
2473 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2474 Py_END_ALLOW_THREADS
2475 if (res < 0)
2476 return s->errorhandler();
2477 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2478 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002479}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002481PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482"getpeername() -> address info\n\
2483\n\
2484Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002485info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002486
Guido van Rossumb6775db1994-08-01 11:34:53 +00002487#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002488
2489
Guido van Rossum30a685f1991-06-27 15:51:29 +00002490/* s.listen(n) method */
2491
Guido van Rossum73624e91994-10-10 17:59:00 +00002492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002493sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 int backlog;
2496 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002497
Serhiy Storchaka78980432013-01-15 01:12:17 +02002498 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 if (backlog == -1 && PyErr_Occurred())
2500 return NULL;
2501 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002502 /* To avoid problems on systems that don't allow a negative backlog
2503 * (which doesn't make sense anyway) we force a minimum value of 0. */
2504 if (backlog < 0)
2505 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 res = listen(s->sock_fd, backlog);
2507 Py_END_ALLOW_THREADS
2508 if (res < 0)
2509 return s->errorhandler();
2510 Py_INCREF(Py_None);
2511 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002512}
2513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515"listen(backlog)\n\
2516\n\
2517Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002518least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2519unaccepted connections that the system will allow before refusing new\n\
2520connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002521
2522
Thomas Wouters477c8d52006-05-27 19:21:47 +00002523/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002524 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002525 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002527 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002528 * also possible that we return a number of bytes smaller than the request
2529 * bytes.
2530 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002531
Antoine Pitrou19467d22010-08-17 19:33:30 +00002532static Py_ssize_t
2533sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002534{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002535 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002537#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 int remaining;
2539 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002540#endif
2541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (!IS_SELECTABLE(s)) {
2543 select_error();
2544 return -1;
2545 }
2546 if (len == 0) {
2547 /* If 0 bytes were requested, do nothing. */
2548 return 0;
2549 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002550
2551#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002552 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002554 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002555 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002556#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002557 if (len > INT_MAX)
2558 len = INT_MAX;
2559 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2560#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002562#endif
2563 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 if (timeout == 1) {
2567 PyErr_SetString(socket_timeout, "timed out");
2568 return -1;
2569 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002570 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 if (outlen < 0) {
2572 /* Note: the call to errorhandler() ALWAYS indirectly returned
2573 NULL, so ignore its return value */
2574 s->errorhandler();
2575 return -1;
2576 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 read_buf = cbuf;
2579 remaining = len;
2580 while (remaining != 0) {
2581 unsigned int segment;
2582 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 segment = remaining /SEGMENT_SIZE;
2585 if (segment != 0) {
2586 segment = SEGMENT_SIZE;
2587 }
2588 else {
2589 segment = remaining;
2590 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002591
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002592 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002594 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 if (!timeout)
2596 nread = recv(s->sock_fd, read_buf, segment, flags);
2597 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 if (timeout == 1) {
2599 PyErr_SetString(socket_timeout, "timed out");
2600 return -1;
2601 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002602 END_SELECT_LOOP(s)
2603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 if (nread < 0) {
2605 s->errorhandler();
2606 return -1;
2607 }
2608 if (nread != remaining) {
2609 read_buf += nread;
2610 break;
2611 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 remaining -= segment;
2614 read_buf += segment;
2615 }
2616 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002617#endif /* !__VMS */
2618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002620}
2621
Guido van Rossum48a680c2001-03-02 06:34:14 +00002622
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002623/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002624
Guido van Rossum73624e91994-10-10 17:59:00 +00002625static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002626sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002627{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002628 Py_ssize_t recvlen, outlen;
2629 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002631
Antoine Pitrou19467d22010-08-17 19:33:30 +00002632 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 if (recvlen < 0) {
2636 PyErr_SetString(PyExc_ValueError,
2637 "negative buffersize in recv");
2638 return NULL;
2639 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 /* Allocate a new string. */
2642 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2643 if (buf == NULL)
2644 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 /* Call the guts */
2647 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2648 if (outlen < 0) {
2649 /* An error occurred, release the string and return an
2650 error. */
2651 Py_DECREF(buf);
2652 return NULL;
2653 }
2654 if (outlen != recvlen) {
2655 /* We did not read as many bytes as we anticipated, resize the
2656 string if possible and be successful. */
2657 _PyBytes_Resize(&buf, outlen);
2658 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002661}
2662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002663PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002664"recv(buffersize[, flags]) -> data\n\
2665\n\
2666Receive up to buffersize bytes from the socket. For the optional flags\n\
2667argument, see the Unix manual. When no data is available, block until\n\
2668at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002669the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002670
Guido van Rossum30a685f1991-06-27 15:51:29 +00002671
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002672/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002673
Thomas Wouters477c8d52006-05-27 19:21:47 +00002674static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002675sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002678
Antoine Pitrou19467d22010-08-17 19:33:30 +00002679 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 Py_buffer pbuf;
2681 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002682 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002685 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 &pbuf, &recvlen, &flags))
2687 return NULL;
2688 buf = pbuf.buf;
2689 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 if (recvlen < 0) {
2692 PyBuffer_Release(&pbuf);
2693 PyErr_SetString(PyExc_ValueError,
2694 "negative buffersize in recv_into");
2695 return NULL;
2696 }
2697 if (recvlen == 0) {
2698 /* If nbytes was not specified, use the buffer's length */
2699 recvlen = buflen;
2700 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 /* Check if the buffer is large enough */
2703 if (buflen < recvlen) {
2704 PyBuffer_Release(&pbuf);
2705 PyErr_SetString(PyExc_ValueError,
2706 "buffer too small for requested bytes");
2707 return NULL;
2708 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 /* Call the guts */
2711 readlen = sock_recv_guts(s, buf, recvlen, flags);
2712 if (readlen < 0) {
2713 /* Return an error. */
2714 PyBuffer_Release(&pbuf);
2715 return NULL;
2716 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 PyBuffer_Release(&pbuf);
2719 /* Return the number of bytes read. Note that we do not do anything
2720 special here in the case that readlen < recvlen. */
2721 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002722}
2723
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002724PyDoc_STRVAR(recv_into_doc,
2725"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002726\n\
2727A version of recv() that stores its data into a buffer rather than creating \n\
2728a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2729is not specified (or 0), receive up to the size available in the given buffer.\n\
2730\n\
2731See recv() for documentation about the flags.");
2732
2733
2734/*
Christian Heimes99170a52007-12-19 02:07:34 +00002735 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2736 * into a char buffer. If you have any inc/def ref to do to the objects that
2737 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002738 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002739 * that it is also possible that we return a number of bytes smaller than the
2740 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002741 *
2742 * 'addr' is a return value for the address object. Note that you must decref
2743 * it yourself.
2744 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002745static Py_ssize_t
2746sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 sock_addr_t addrbuf;
2750 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002751 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 if (!getsockaddrlen(s, &addrlen))
2757 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 if (!IS_SELECTABLE(s)) {
2760 select_error();
2761 return -1;
2762 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002763
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002764 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 Py_BEGIN_ALLOW_THREADS
2766 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002767 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002769#ifndef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002770 if (len > INT_MAX)
2771 len = INT_MAX;
2772 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002774#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 n = recvfrom(s->sock_fd, cbuf, len, flags,
2776 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 }
2779 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 if (timeout == 1) {
2782 PyErr_SetString(socket_timeout, "timed out");
2783 return -1;
2784 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002785 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 if (n < 0) {
2787 s->errorhandler();
2788 return -1;
2789 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2792 addrlen, s->sock_proto)))
2793 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002796}
2797
2798/* s.recvfrom(nbytes [,flags]) method */
2799
2800static PyObject *
2801sock_recvfrom(PySocketSockObject *s, PyObject *args)
2802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 PyObject *buf = NULL;
2804 PyObject *addr = NULL;
2805 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002806 int flags = 0;
2807 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808
Antoine Pitrou19467d22010-08-17 19:33:30 +00002809 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 if (recvlen < 0) {
2813 PyErr_SetString(PyExc_ValueError,
2814 "negative buffersize in recvfrom");
2815 return NULL;
2816 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2819 if (buf == NULL)
2820 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2823 recvlen, flags, &addr);
2824 if (outlen < 0) {
2825 goto finally;
2826 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 if (outlen != recvlen) {
2829 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002830 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002832 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 goto finally;
2834 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002837
2838finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 Py_XDECREF(buf);
2840 Py_XDECREF(addr);
2841 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002842}
2843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002844PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002845"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2846\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002847Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002848
Thomas Wouters477c8d52006-05-27 19:21:47 +00002849
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002850/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851
2852static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002853sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002856
Antoine Pitrou19467d22010-08-17 19:33:30 +00002857 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 Py_buffer pbuf;
2859 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002860 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002863
Antoine Pitrou19467d22010-08-17 19:33:30 +00002864 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 kwlist, &pbuf,
2866 &recvlen, &flags))
2867 return NULL;
2868 buf = pbuf.buf;
2869 buflen = pbuf.len;
2870 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 if (recvlen < 0) {
2873 PyBuffer_Release(&pbuf);
2874 PyErr_SetString(PyExc_ValueError,
2875 "negative buffersize in recvfrom_into");
2876 return NULL;
2877 }
2878 if (recvlen == 0) {
2879 /* If nbytes was not specified, use the buffer's length */
2880 recvlen = buflen;
2881 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2884 if (readlen < 0) {
2885 PyBuffer_Release(&pbuf);
2886 /* Return an error */
2887 Py_XDECREF(addr);
2888 return NULL;
2889 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 PyBuffer_Release(&pbuf);
2892 /* Return the number of bytes read and the address. Note that we do
2893 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002894 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002895}
2896
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002897PyDoc_STRVAR(recvfrom_into_doc,
2898"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002899\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002900Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002901
2902
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002903/* The sendmsg() and recvmsg[_into]() methods require a working
2904 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2905#ifdef CMSG_LEN
2906/*
2907 * Call recvmsg() with the supplied iovec structures, flags, and
2908 * ancillary data buffer size (controllen). Returns the tuple return
2909 * value for recvmsg() or recvmsg_into(), with the first item provided
2910 * by the supplied makeval() function. makeval() will be called with
2911 * the length read and makeval_data as arguments, and must return a
2912 * new reference (which will be decrefed if there is a subsequent
2913 * error). On error, closes any file descriptors received via
2914 * SCM_RIGHTS.
2915 */
2916static PyObject *
2917sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2918 int flags, Py_ssize_t controllen,
2919 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2920{
2921 ssize_t bytes_received = -1;
2922 int timeout;
2923 sock_addr_t addrbuf;
2924 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002925 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002926 PyObject *cmsg_list = NULL, *retval = NULL;
2927 void *controlbuf = NULL;
2928 struct cmsghdr *cmsgh;
2929 size_t cmsgdatalen = 0;
2930 int cmsg_status;
2931
2932 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2933 ignored" when the socket is connected (Linux fills them in
2934 anyway for AF_UNIX sockets at least). Normally msg_namelen
2935 seems to be set to 0 if there's no address, but try to
2936 initialize msg_name to something that won't be mistaken for a
2937 real address if that doesn't happen. */
2938 if (!getsockaddrlen(s, &addrbuflen))
2939 return NULL;
2940 memset(&addrbuf, 0, addrbuflen);
2941 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2942
2943 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2944 PyErr_SetString(PyExc_ValueError,
2945 "invalid ancillary data buffer length");
2946 return NULL;
2947 }
2948 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2949 return PyErr_NoMemory();
2950
2951 /* Make the system call. */
2952 if (!IS_SELECTABLE(s)) {
2953 select_error();
2954 goto finally;
2955 }
2956
2957 BEGIN_SELECT_LOOP(s)
2958 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002959 msg.msg_name = SAS2SA(&addrbuf);
2960 msg.msg_namelen = addrbuflen;
2961 msg.msg_iov = iov;
2962 msg.msg_iovlen = iovlen;
2963 msg.msg_control = controlbuf;
2964 msg.msg_controllen = controllen;
2965 timeout = internal_select_ex(s, 0, interval);
2966 if (!timeout)
2967 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2968 Py_END_ALLOW_THREADS;
2969 if (timeout == 1) {
2970 PyErr_SetString(socket_timeout, "timed out");
2971 goto finally;
2972 }
2973 END_SELECT_LOOP(s)
2974
2975 if (bytes_received < 0) {
2976 s->errorhandler();
2977 goto finally;
2978 }
2979
2980 /* Make list of (level, type, data) tuples from control messages. */
2981 if ((cmsg_list = PyList_New(0)) == NULL)
2982 goto err_closefds;
2983 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2984 implementations didn't do so. */
2985 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2986 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2987 PyObject *bytes, *tuple;
2988 int tmp;
2989
2990 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2991 if (cmsg_status != 0) {
2992 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2993 "received malformed or improperly-truncated "
2994 "ancillary data", 1) == -1)
2995 goto err_closefds;
2996 }
2997 if (cmsg_status < 0)
2998 break;
2999 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003000 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003001 goto err_closefds;
3002 }
3003
3004 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3005 cmsgdatalen);
3006 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3007 (int)cmsgh->cmsg_type, bytes);
3008 if (tuple == NULL)
3009 goto err_closefds;
3010 tmp = PyList_Append(cmsg_list, tuple);
3011 Py_DECREF(tuple);
3012 if (tmp != 0)
3013 goto err_closefds;
3014
3015 if (cmsg_status != 0)
3016 break;
3017 }
3018
3019 retval = Py_BuildValue("NOiN",
3020 (*makeval)(bytes_received, makeval_data),
3021 cmsg_list,
3022 (int)msg.msg_flags,
3023 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3024 ((msg.msg_namelen > addrbuflen) ?
3025 addrbuflen : msg.msg_namelen),
3026 s->sock_proto));
3027 if (retval == NULL)
3028 goto err_closefds;
3029
3030finally:
3031 Py_XDECREF(cmsg_list);
3032 PyMem_Free(controlbuf);
3033 return retval;
3034
3035err_closefds:
3036#ifdef SCM_RIGHTS
3037 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3038 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3039 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3040 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3041 if (cmsg_status < 0)
3042 break;
3043 if (cmsgh->cmsg_level == SOL_SOCKET &&
3044 cmsgh->cmsg_type == SCM_RIGHTS) {
3045 size_t numfds;
3046 int *fdp;
3047
3048 numfds = cmsgdatalen / sizeof(int);
3049 fdp = (int *)CMSG_DATA(cmsgh);
3050 while (numfds-- > 0)
3051 close(*fdp++);
3052 }
3053 if (cmsg_status != 0)
3054 break;
3055 }
3056#endif /* SCM_RIGHTS */
3057 goto finally;
3058}
3059
3060
3061static PyObject *
3062makeval_recvmsg(ssize_t received, void *data)
3063{
3064 PyObject **buf = data;
3065
3066 if (received < PyBytes_GET_SIZE(*buf))
3067 _PyBytes_Resize(buf, received);
3068 Py_XINCREF(*buf);
3069 return *buf;
3070}
3071
3072/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3073
3074static PyObject *
3075sock_recvmsg(PySocketSockObject *s, PyObject *args)
3076{
3077 Py_ssize_t bufsize, ancbufsize = 0;
3078 int flags = 0;
3079 struct iovec iov;
3080 PyObject *buf = NULL, *retval = NULL;
3081
3082 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3083 return NULL;
3084
3085 if (bufsize < 0) {
3086 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3087 return NULL;
3088 }
3089 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3090 return NULL;
3091 iov.iov_base = PyBytes_AS_STRING(buf);
3092 iov.iov_len = bufsize;
3093
3094 /* Note that we're passing a pointer to *our pointer* to the bytes
3095 object here (&buf); makeval_recvmsg() may incref the object, or
3096 deallocate it and set our pointer to NULL. */
3097 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3098 &makeval_recvmsg, &buf);
3099 Py_XDECREF(buf);
3100 return retval;
3101}
3102
3103PyDoc_STRVAR(recvmsg_doc,
3104"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3105\n\
3106Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3107socket. The ancbufsize argument sets the size in bytes of the\n\
3108internal buffer used to receive the ancillary data; it defaults to 0,\n\
3109meaning that no ancillary data will be received. Appropriate buffer\n\
3110sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3111CMSG_LEN(), and items which do not fit into the buffer might be\n\
3112truncated or discarded. The flags argument defaults to 0 and has the\n\
3113same meaning as for recv().\n\
3114\n\
3115The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3116The data item is a bytes object holding the non-ancillary data\n\
3117received. The ancdata item is a list of zero or more tuples\n\
3118(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3119(control messages) received: cmsg_level and cmsg_type are integers\n\
3120specifying the protocol level and protocol-specific type respectively,\n\
3121and cmsg_data is a bytes object holding the associated data. The\n\
3122msg_flags item is the bitwise OR of various flags indicating\n\
3123conditions on the received message; see your system documentation for\n\
3124details. If the receiving socket is unconnected, address is the\n\
3125address of the sending socket, if available; otherwise, its value is\n\
3126unspecified.\n\
3127\n\
3128If recvmsg() raises an exception after the system call returns, it\n\
3129will first attempt to close any file descriptors received via the\n\
3130SCM_RIGHTS mechanism.");
3131
3132
3133static PyObject *
3134makeval_recvmsg_into(ssize_t received, void *data)
3135{
3136 return PyLong_FromSsize_t(received);
3137}
3138
3139/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3140
3141static PyObject *
3142sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3143{
3144 Py_ssize_t ancbufsize = 0;
3145 int flags = 0;
3146 struct iovec *iovs = NULL;
3147 Py_ssize_t i, nitems, nbufs = 0;
3148 Py_buffer *bufs = NULL;
3149 PyObject *buffers_arg, *fast, *retval = NULL;
3150
3151 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3152 &buffers_arg, &ancbufsize, &flags))
3153 return NULL;
3154
3155 if ((fast = PySequence_Fast(buffers_arg,
3156 "recvmsg_into() argument 1 must be an "
3157 "iterable")) == NULL)
3158 return NULL;
3159 nitems = PySequence_Fast_GET_SIZE(fast);
3160 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003161 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003162 goto finally;
3163 }
3164
3165 /* Fill in an iovec for each item, and save the Py_buffer
3166 structs to release afterwards. */
3167 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3168 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3169 PyErr_NoMemory();
3170 goto finally;
3171 }
3172 for (; nbufs < nitems; nbufs++) {
3173 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3174 "w*;recvmsg_into() argument 1 must be an iterable "
3175 "of single-segment read-write buffers",
3176 &bufs[nbufs]))
3177 goto finally;
3178 iovs[nbufs].iov_base = bufs[nbufs].buf;
3179 iovs[nbufs].iov_len = bufs[nbufs].len;
3180 }
3181
3182 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3183 &makeval_recvmsg_into, NULL);
3184finally:
3185 for (i = 0; i < nbufs; i++)
3186 PyBuffer_Release(&bufs[i]);
3187 PyMem_Free(bufs);
3188 PyMem_Free(iovs);
3189 Py_DECREF(fast);
3190 return retval;
3191}
3192
3193PyDoc_STRVAR(recvmsg_into_doc,
3194"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3195\n\
3196Receive normal data and ancillary data from the socket, scattering the\n\
3197non-ancillary data into a series of buffers. The buffers argument\n\
3198must be an iterable of objects that export writable buffers\n\
3199(e.g. bytearray objects); these will be filled with successive chunks\n\
3200of the non-ancillary data until it has all been written or there are\n\
3201no more buffers. The ancbufsize argument sets the size in bytes of\n\
3202the internal buffer used to receive the ancillary data; it defaults to\n\
32030, meaning that no ancillary data will be received. Appropriate\n\
3204buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3205or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3206truncated or discarded. The flags argument defaults to 0 and has the\n\
3207same meaning as for recv().\n\
3208\n\
3209The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3210The nbytes item is the total number of bytes of non-ancillary data\n\
3211written into the buffers. The ancdata item is a list of zero or more\n\
3212tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3213data (control messages) received: cmsg_level and cmsg_type are\n\
3214integers specifying the protocol level and protocol-specific type\n\
3215respectively, and cmsg_data is a bytes object holding the associated\n\
3216data. The msg_flags item is the bitwise OR of various flags\n\
3217indicating conditions on the received message; see your system\n\
3218documentation for details. If the receiving socket is unconnected,\n\
3219address is the address of the sending socket, if available; otherwise,\n\
3220its value is unspecified.\n\
3221\n\
3222If recvmsg_into() raises an exception after the system call returns,\n\
3223it will first attempt to close any file descriptors received via the\n\
3224SCM_RIGHTS mechanism.");
3225#endif /* CMSG_LEN */
3226
3227
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003228/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003229
Guido van Rossum73624e91994-10-10 17:59:00 +00003230static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003231sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003234 Py_ssize_t len, n = -1;
3235 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3239 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (!IS_SELECTABLE(s)) {
3242 PyBuffer_Release(&pbuf);
3243 return select_error();
3244 }
3245 buf = pbuf.buf;
3246 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003247
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003248 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003250 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003251 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003252#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003254#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003255 if (len > INT_MAX)
3256 len = INT_MAX;
3257 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003258#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003260#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003264 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 PyErr_SetString(socket_timeout, "timed out");
3266 return NULL;
3267 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003268 END_SELECT_LOOP(s)
3269
3270 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 if (n < 0)
3272 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003273 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003274}
3275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003276PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003277"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003278\n\
3279Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003280argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003281sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003282
3283
3284/* s.sendall(data [,flags]) method */
3285
3286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003287sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003290 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003291 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3295 return NULL;
3296 buf = pbuf.buf;
3297 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 if (!IS_SELECTABLE(s)) {
3300 PyBuffer_Release(&pbuf);
3301 return select_error();
3302 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003305 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 timeout = internal_select(s, 1);
3307 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003308 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003309#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003310 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003311#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003312 if (len > INT_MAX)
3313 len = INT_MAX;
3314 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003316 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003317#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003318 }
3319 Py_END_ALLOW_THREADS
3320 if (timeout == 1) {
3321 PyBuffer_Release(&pbuf);
3322 PyErr_SetString(socket_timeout, "timed out");
3323 return NULL;
3324 }
3325 /* PyErr_CheckSignals() might change errno */
3326 saved_errno = errno;
3327 /* We must run our signal handlers before looping again.
3328 send() can return a successful partial write when it is
3329 interrupted, so we can't restrict ourselves to EINTR. */
3330 if (PyErr_CheckSignals()) {
3331 PyBuffer_Release(&pbuf);
3332 return NULL;
3333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003335 /* If interrupted, try again */
3336 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003338 else
3339 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 }
3341 buf += n;
3342 len -= n;
3343 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 if (n < 0)
3347 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 Py_INCREF(Py_None);
3350 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003351}
3352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003353PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003354"sendall(data[, flags])\n\
3355\n\
3356Send a data string to the socket. For the optional flags\n\
3357argument, see the Unix manual. This calls send() repeatedly\n\
3358until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003359to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003360
Guido van Rossum30a685f1991-06-27 15:51:29 +00003361
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003362/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003363
Guido van Rossum73624e91994-10-10 17:59:00 +00003364static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003365sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 Py_buffer pbuf;
3368 PyObject *addro;
3369 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003370 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 sock_addr_t addrbuf;
3372 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003375 arglen = PyTuple_Size(args);
3376 switch (arglen) {
3377 case 2:
3378 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3379 break;
3380 case 3:
3381 PyArg_ParseTuple(args, "y*iO:sendto",
3382 &pbuf, &flags, &addro);
3383 break;
3384 default:
3385 PyErr_Format(PyExc_TypeError,
3386 "sendto() takes 2 or 3 arguments (%d given)",
3387 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003388 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003390 if (PyErr_Occurred())
3391 return NULL;
3392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 buf = pbuf.buf;
3394 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 if (!IS_SELECTABLE(s)) {
3397 PyBuffer_Release(&pbuf);
3398 return select_error();
3399 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3402 PyBuffer_Release(&pbuf);
3403 return NULL;
3404 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003405
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003406 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003408 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003409 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003410#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003411 if (len > INT_MAX)
3412 len = INT_MAX;
3413 n = sendto(s->sock_fd, buf, (int)len, flags,
3414 SAS2SA(&addrbuf), addrlen);
3415#else
3416 n = sendto(s->sock_fd, buf, len, flags,
3417 SAS2SA(&addrbuf), addrlen);
3418#endif
3419 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003423 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 PyErr_SetString(socket_timeout, "timed out");
3425 return NULL;
3426 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003427 END_SELECT_LOOP(s)
3428 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003429 if (n < 0)
3430 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003431 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003432}
3433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003434PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003435"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003436\n\
3437Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003438For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003439
Guido van Rossum30a685f1991-06-27 15:51:29 +00003440
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003441/* The sendmsg() and recvmsg[_into]() methods require a working
3442 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3443#ifdef CMSG_LEN
3444/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3445
3446static PyObject *
3447sock_sendmsg(PySocketSockObject *s, PyObject *args)
3448{
3449 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3450 Py_buffer *databufs = NULL;
3451 struct iovec *iovs = NULL;
3452 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003453 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003454 struct cmsginfo {
3455 int level;
3456 int type;
3457 Py_buffer data;
3458 } *cmsgs = NULL;
3459 void *controlbuf = NULL;
3460 size_t controllen, controllen_last;
3461 ssize_t bytes_sent = -1;
3462 int addrlen, timeout, flags = 0;
3463 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3464 *cmsg_fast = NULL, *retval = NULL;
3465
3466 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3467 &data_arg, &cmsg_arg, &flags, &addr_arg))
3468 return NULL;
3469
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003470 /* Parse destination address. */
3471 if (addr_arg != NULL && addr_arg != Py_None) {
3472 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3473 goto finally;
3474 msg.msg_name = &addrbuf;
3475 msg.msg_namelen = addrlen;
3476 }
3477
3478 /* Fill in an iovec for each message part, and save the Py_buffer
3479 structs to release afterwards. */
3480 if ((data_fast = PySequence_Fast(data_arg,
3481 "sendmsg() argument 1 must be an "
3482 "iterable")) == NULL)
3483 goto finally;
3484 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3485 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003486 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003487 goto finally;
3488 }
3489 msg.msg_iovlen = ndataparts;
3490 if (ndataparts > 0 &&
3491 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3492 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3493 PyErr_NoMemory();
3494 goto finally;
3495 }
3496 for (; ndatabufs < ndataparts; ndatabufs++) {
3497 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3498 "y*;sendmsg() argument 1 must be an iterable of "
3499 "buffer-compatible objects",
3500 &databufs[ndatabufs]))
3501 goto finally;
3502 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3503 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3504 }
3505
3506 if (cmsg_arg == NULL)
3507 ncmsgs = 0;
3508 else {
3509 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3510 "sendmsg() argument 2 must be an "
3511 "iterable")) == NULL)
3512 goto finally;
3513 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3514 }
3515
3516#ifndef CMSG_SPACE
3517 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003518 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003519 "sending multiple control messages is not supported "
3520 "on this system");
3521 goto finally;
3522 }
3523#endif
3524 /* Save level, type and Py_buffer for each control message,
3525 and calculate total size. */
3526 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3527 PyErr_NoMemory();
3528 goto finally;
3529 }
3530 controllen = controllen_last = 0;
3531 while (ncmsgbufs < ncmsgs) {
3532 size_t bufsize, space;
3533
3534 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3535 "(iiy*):[sendmsg() ancillary data items]",
3536 &cmsgs[ncmsgbufs].level,
3537 &cmsgs[ncmsgbufs].type,
3538 &cmsgs[ncmsgbufs].data))
3539 goto finally;
3540 bufsize = cmsgs[ncmsgbufs++].data.len;
3541
3542#ifdef CMSG_SPACE
3543 if (!get_CMSG_SPACE(bufsize, &space)) {
3544#else
3545 if (!get_CMSG_LEN(bufsize, &space)) {
3546#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003547 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003548 goto finally;
3549 }
3550 controllen += space;
3551 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003552 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003553 goto finally;
3554 }
3555 controllen_last = controllen;
3556 }
3557
3558 /* Construct ancillary data block from control message info. */
3559 if (ncmsgbufs > 0) {
3560 struct cmsghdr *cmsgh = NULL;
3561
3562 if ((msg.msg_control = controlbuf =
3563 PyMem_Malloc(controllen)) == NULL) {
3564 PyErr_NoMemory();
3565 goto finally;
3566 }
3567 msg.msg_controllen = controllen;
3568
3569 /* Need to zero out the buffer as a workaround for glibc's
3570 CMSG_NXTHDR() implementation. After getting the pointer to
3571 the next header, it checks its (uninitialized) cmsg_len
3572 member to see if the "message" fits in the buffer, and
3573 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003574 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575 memset(controlbuf, 0, controllen);
3576
3577 for (i = 0; i < ncmsgbufs; i++) {
3578 size_t msg_len, data_len = cmsgs[i].data.len;
3579 int enough_space = 0;
3580
3581 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3582 if (cmsgh == NULL) {
3583 PyErr_Format(PyExc_RuntimeError,
3584 "unexpected NULL result from %s()",
3585 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3586 goto finally;
3587 }
3588 if (!get_CMSG_LEN(data_len, &msg_len)) {
3589 PyErr_SetString(PyExc_RuntimeError,
3590 "item size out of range for CMSG_LEN()");
3591 goto finally;
3592 }
3593 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3594 size_t space;
3595
3596 cmsgh->cmsg_len = msg_len;
3597 if (get_cmsg_data_space(&msg, cmsgh, &space))
3598 enough_space = (space >= data_len);
3599 }
3600 if (!enough_space) {
3601 PyErr_SetString(PyExc_RuntimeError,
3602 "ancillary data does not fit in calculated "
3603 "space");
3604 goto finally;
3605 }
3606 cmsgh->cmsg_level = cmsgs[i].level;
3607 cmsgh->cmsg_type = cmsgs[i].type;
3608 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3609 }
3610 }
3611
3612 /* Make the system call. */
3613 if (!IS_SELECTABLE(s)) {
3614 select_error();
3615 goto finally;
3616 }
3617
3618 BEGIN_SELECT_LOOP(s)
3619 Py_BEGIN_ALLOW_THREADS;
3620 timeout = internal_select_ex(s, 1, interval);
3621 if (!timeout)
3622 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3623 Py_END_ALLOW_THREADS;
3624 if (timeout == 1) {
3625 PyErr_SetString(socket_timeout, "timed out");
3626 goto finally;
3627 }
3628 END_SELECT_LOOP(s)
3629
3630 if (bytes_sent < 0) {
3631 s->errorhandler();
3632 goto finally;
3633 }
3634 retval = PyLong_FromSsize_t(bytes_sent);
3635
3636finally:
3637 PyMem_Free(controlbuf);
3638 for (i = 0; i < ncmsgbufs; i++)
3639 PyBuffer_Release(&cmsgs[i].data);
3640 PyMem_Free(cmsgs);
3641 Py_XDECREF(cmsg_fast);
3642 for (i = 0; i < ndatabufs; i++)
3643 PyBuffer_Release(&databufs[i]);
3644 PyMem_Free(databufs);
3645 PyMem_Free(iovs);
3646 Py_XDECREF(data_fast);
3647 return retval;
3648}
3649
3650PyDoc_STRVAR(sendmsg_doc,
3651"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3652\n\
3653Send normal and ancillary data to the socket, gathering the\n\
3654non-ancillary data from a series of buffers and concatenating it into\n\
3655a single message. The buffers argument specifies the non-ancillary\n\
3656data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3657The ancdata argument specifies the ancillary data (control messages)\n\
3658as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3659cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3660protocol level and protocol-specific type respectively, and cmsg_data\n\
3661is a buffer-compatible object holding the associated data. The flags\n\
3662argument defaults to 0 and has the same meaning as for send(). If\n\
3663address is supplied and not None, it sets a destination address for\n\
3664the message. The return value is the number of bytes of non-ancillary\n\
3665data sent.");
3666#endif /* CMSG_LEN */
3667
3668
Guido van Rossum30a685f1991-06-27 15:51:29 +00003669/* s.shutdown(how) method */
3670
Guido van Rossum73624e91994-10-10 17:59:00 +00003671static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003672sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674 int how;
3675 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003676
Serhiy Storchaka78980432013-01-15 01:12:17 +02003677 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 if (how == -1 && PyErr_Occurred())
3679 return NULL;
3680 Py_BEGIN_ALLOW_THREADS
3681 res = shutdown(s->sock_fd, how);
3682 Py_END_ALLOW_THREADS
3683 if (res < 0)
3684 return s->errorhandler();
3685 Py_INCREF(Py_None);
3686 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003687}
3688
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003689PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003690"shutdown(flag)\n\
3691\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003692Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3693of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003694
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003695#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003696static PyObject*
3697sock_ioctl(PySocketSockObject *s, PyObject *arg)
3698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 unsigned long cmd = SIO_RCVALL;
3700 PyObject *argO;
3701 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3704 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 switch (cmd) {
3707 case SIO_RCVALL: {
3708 unsigned int option = RCVALL_ON;
3709 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3710 return NULL;
3711 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3712 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3713 return set_error();
3714 }
3715 return PyLong_FromUnsignedLong(recv); }
3716 case SIO_KEEPALIVE_VALS: {
3717 struct tcp_keepalive ka;
3718 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3719 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3720 return NULL;
3721 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3722 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3723 return set_error();
3724 }
3725 return PyLong_FromUnsignedLong(recv); }
3726 default:
3727 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3728 return NULL;
3729 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003730}
3731PyDoc_STRVAR(sock_ioctl_doc,
3732"ioctl(cmd, option) -> long\n\
3733\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003734Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3735SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3736SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003737#endif
3738
3739#if defined(MS_WINDOWS)
3740static PyObject*
3741sock_share(PySocketSockObject *s, PyObject *arg)
3742{
3743 WSAPROTOCOL_INFO info;
3744 DWORD processId;
3745 int result;
3746
3747 if (!PyArg_ParseTuple(arg, "I", &processId))
3748 return NULL;
3749
3750 Py_BEGIN_ALLOW_THREADS
3751 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3752 Py_END_ALLOW_THREADS
3753 if (result == SOCKET_ERROR)
3754 return set_error();
3755 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3756}
3757PyDoc_STRVAR(sock_share_doc,
3758"share(process_id) -> bytes\n\
3759\n\
3760Share the socket with another process. The target process id\n\
3761must be provided and the resulting bytes object passed to the target\n\
3762process. There the shared socket can be instantiated by calling\n\
3763socket.fromshare().");
3764
Christian Heimesfaf2f632008-01-06 16:59:19 +00003765
3766#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003767
3768/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003769
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003770static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3772 accept_doc},
3773 {"bind", (PyCFunction)sock_bind, METH_O,
3774 bind_doc},
3775 {"close", (PyCFunction)sock_close, METH_NOARGS,
3776 close_doc},
3777 {"connect", (PyCFunction)sock_connect, METH_O,
3778 connect_doc},
3779 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3780 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003781 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3782 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3784 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003785#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 {"getpeername", (PyCFunction)sock_getpeername,
3787 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003789 {"getsockname", (PyCFunction)sock_getsockname,
3790 METH_NOARGS, getsockname_doc},
3791 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3792 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003793#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3795 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003796#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003797#if defined(MS_WINDOWS)
3798 {"share", (PyCFunction)sock_share, METH_VARARGS,
3799 sock_share_doc},
3800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 {"listen", (PyCFunction)sock_listen, METH_O,
3802 listen_doc},
3803 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3804 recv_doc},
3805 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3806 recv_into_doc},
3807 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3808 recvfrom_doc},
3809 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3810 recvfrom_into_doc},
3811 {"send", (PyCFunction)sock_send, METH_VARARGS,
3812 send_doc},
3813 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3814 sendall_doc},
3815 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3816 sendto_doc},
3817 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3818 setblocking_doc},
3819 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3820 settimeout_doc},
3821 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3822 gettimeout_doc},
3823 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3824 setsockopt_doc},
3825 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3826 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003827#ifdef CMSG_LEN
3828 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3829 recvmsg_doc},
3830 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3831 recvmsg_into_doc,},
3832 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3833 sendmsg_doc},
3834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003836};
3837
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003838/* SockObject members */
3839static PyMemberDef sock_memberlist[] = {
3840 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3841 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3842 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3843 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3844 {0},
3845};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003846
Guido van Rossum73624e91994-10-10 17:59:00 +00003847/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003848 First close the file description. */
3849
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003850static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003851sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003852{
Antoine Pitroue033e062010-10-29 10:38:18 +00003853 if (s->sock_fd != -1) {
3854 PyObject *exc, *val, *tb;
3855 Py_ssize_t old_refcount = Py_REFCNT(s);
3856 ++Py_REFCNT(s);
3857 PyErr_Fetch(&exc, &val, &tb);
3858 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3859 "unclosed %R", s))
3860 /* Spurious errors can appear at shutdown */
3861 if (PyErr_ExceptionMatches(PyExc_Warning))
3862 PyErr_WriteUnraisable((PyObject *) s);
3863 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003865 Py_REFCNT(s) = old_refcount;
3866 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003868}
3869
Guido van Rossum30a685f1991-06-27 15:51:29 +00003870
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003871static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003872sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003873{
Fred Drakea04eaad2000-06-30 02:46:07 +00003874#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003875 if (s->sock_fd > LONG_MAX) {
3876 /* this can occur on Win64, and actually there is a special
3877 ugly printf formatter for decimal pointer length integer
3878 printing, only bother if necessary*/
3879 PyErr_SetString(PyExc_OverflowError,
3880 "no printf formatter to display "
3881 "the socket descriptor in decimal");
3882 return NULL;
3883 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003885 return PyUnicode_FromFormat(
3886 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3887 (long)s->sock_fd, s->sock_family,
3888 s->sock_type,
3889 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003890}
3891
3892
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003893/* Create a new, uninitialized socket object. */
3894
3895static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003896sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003898 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003900 new = type->tp_alloc(type, 0);
3901 if (new != NULL) {
3902 ((PySocketSockObject *)new)->sock_fd = -1;
3903 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3904 ((PySocketSockObject *)new)->errorhandler = &set_error;
3905 }
3906 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003907}
3908
3909
3910/* Initialize a new socket object. */
3911
3912/*ARGSUSED*/
3913static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003914sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003916 PySocketSockObject *s = (PySocketSockObject *)self;
3917 PyObject *fdobj = NULL;
3918 SOCKET_T fd = INVALID_SOCKET;
3919 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3920 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3923 "|iiiO:socket", keywords,
3924 &family, &type, &proto, &fdobj))
3925 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003928#ifdef MS_WINDOWS
3929 /* recreate a socket that was duplicated */
3930 if (PyBytes_Check(fdobj)) {
3931 WSAPROTOCOL_INFO info;
3932 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3933 PyErr_Format(PyExc_ValueError,
3934 "socket descriptor string has wrong size, "
3935 "should be %zu bytes.", sizeof(info));
3936 return -1;
3937 }
3938 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3939 Py_BEGIN_ALLOW_THREADS
3940 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3941 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3942 Py_END_ALLOW_THREADS
3943 if (fd == INVALID_SOCKET) {
3944 set_error();
3945 return -1;
3946 }
3947 family = info.iAddressFamily;
3948 type = info.iSocketType;
3949 proto = info.iProtocol;
3950 }
3951 else
3952#endif
3953 {
3954 fd = PyLong_AsSocket_t(fdobj);
3955 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3956 return -1;
3957 if (fd == INVALID_SOCKET) {
3958 PyErr_SetString(PyExc_ValueError,
3959 "can't use invalid socket value");
3960 return -1;
3961 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 }
3963 }
3964 else {
3965 Py_BEGIN_ALLOW_THREADS
3966 fd = socket(family, type, proto);
3967 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 if (fd == INVALID_SOCKET) {
3970 set_error();
3971 return -1;
3972 }
3973 }
3974 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003977
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003978}
3979
3980
Guido van Rossumb6775db1994-08-01 11:34:53 +00003981/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003982
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003983static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003984 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3985 "_socket.socket", /* tp_name */
3986 sizeof(PySocketSockObject), /* tp_basicsize */
3987 0, /* tp_itemsize */
3988 (destructor)sock_dealloc, /* tp_dealloc */
3989 0, /* tp_print */
3990 0, /* tp_getattr */
3991 0, /* tp_setattr */
3992 0, /* tp_reserved */
3993 (reprfunc)sock_repr, /* tp_repr */
3994 0, /* tp_as_number */
3995 0, /* tp_as_sequence */
3996 0, /* tp_as_mapping */
3997 0, /* tp_hash */
3998 0, /* tp_call */
3999 0, /* tp_str */
4000 PyObject_GenericGetAttr, /* tp_getattro */
4001 0, /* tp_setattro */
4002 0, /* tp_as_buffer */
4003 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4004 sock_doc, /* tp_doc */
4005 0, /* tp_traverse */
4006 0, /* tp_clear */
4007 0, /* tp_richcompare */
4008 0, /* tp_weaklistoffset */
4009 0, /* tp_iter */
4010 0, /* tp_iternext */
4011 sock_methods, /* tp_methods */
4012 sock_memberlist, /* tp_members */
4013 0, /* tp_getset */
4014 0, /* tp_base */
4015 0, /* tp_dict */
4016 0, /* tp_descr_get */
4017 0, /* tp_descr_set */
4018 0, /* tp_dictoffset */
4019 sock_initobj, /* tp_init */
4020 PyType_GenericAlloc, /* tp_alloc */
4021 sock_new, /* tp_new */
4022 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004023};
4024
Guido van Rossum30a685f1991-06-27 15:51:29 +00004025
Guido van Rossum81194471991-07-27 21:42:02 +00004026/* Python interface to gethostname(). */
4027
4028/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004029static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004030socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004031{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004032#ifdef MS_WINDOWS
4033 /* Don't use winsock's gethostname, as this returns the ANSI
4034 version of the hostname, whereas we need a Unicode string.
4035 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004036 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004037 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004038 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004039 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004040
4041 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004042 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004043
4044 if (GetLastError() != ERROR_MORE_DATA)
4045 return PyErr_SetFromWindowsErr(0);
4046
4047 if (size == 0)
4048 return PyUnicode_New(0, 0);
4049
4050 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4051 names */
4052 name = PyMem_Malloc(size * sizeof(wchar_t));
4053 if (!name)
4054 return NULL;
4055 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4056 name,
4057 &size))
4058 {
4059 PyMem_Free(name);
4060 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004061 }
Victor Stinner74168972011-11-17 01:11:36 +01004062
4063 result = PyUnicode_FromWideChar(name, size);
4064 PyMem_Free(name);
4065 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004066#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 char buf[1024];
4068 int res;
4069 Py_BEGIN_ALLOW_THREADS
4070 res = gethostname(buf, (int) sizeof buf - 1);
4071 Py_END_ALLOW_THREADS
4072 if (res < 0)
4073 return set_error();
4074 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004075 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004076#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004077}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004079PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004080"gethostname() -> string\n\
4081\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004082Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004083
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004084#ifdef HAVE_SETHOSTNAME
4085PyDoc_STRVAR(sethostname_doc,
4086"sethostname(name)\n\n\
4087Sets the hostname to name.");
4088
4089static PyObject *
4090socket_sethostname(PyObject *self, PyObject *args)
4091{
4092 PyObject *hnobj;
4093 Py_buffer buf;
4094 int res, flag = 0;
4095
Christian Heimesd2774c72013-06-19 02:06:29 +02004096#ifdef _AIX
4097/* issue #18259, not declared in any useful header file */
4098extern int sethostname(const char *, size_t);
4099#endif
4100
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004101 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4102 PyErr_Clear();
4103 if (!PyArg_ParseTuple(args, "O&:sethostname",
4104 PyUnicode_FSConverter, &hnobj))
4105 return NULL;
4106 flag = 1;
4107 }
4108 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4109 if (!res) {
4110 res = sethostname(buf.buf, buf.len);
4111 PyBuffer_Release(&buf);
4112 }
4113 if (flag)
4114 Py_DECREF(hnobj);
4115 if (res)
4116 return set_error();
4117 Py_RETURN_NONE;
4118}
4119#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004120
Guido van Rossum30a685f1991-06-27 15:51:29 +00004121/* Python interface to gethostbyname(name). */
4122
4123/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004124static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004125socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 char *name;
4128 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004129 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004130
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004131 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 return NULL;
4133 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004134 goto finally;
4135 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4136finally:
4137 PyMem_Free(name);
4138 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004139}
4140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004141PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004142"gethostbyname(host) -> address\n\
4143\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004144Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004145
4146
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004147/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4148
4149static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004150gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 char **pch;
4153 PyObject *rtn_tuple = (PyObject *)NULL;
4154 PyObject *name_list = (PyObject *)NULL;
4155 PyObject *addr_list = (PyObject *)NULL;
4156 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 if (h == NULL) {
4159 /* Let's get real error message to return */
4160 set_herror(h_errno);
4161 return NULL;
4162 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 if (h->h_addrtype != af) {
4165 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004166 errno = EAFNOSUPPORT;
4167 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 return NULL;
4169 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 case AF_INET:
4174 if (alen < sizeof(struct sockaddr_in))
4175 return NULL;
4176 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004177
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004178#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 case AF_INET6:
4180 if (alen < sizeof(struct sockaddr_in6))
4181 return NULL;
4182 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004183#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 if ((name_list = PyList_New(0)) == NULL)
4188 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 if ((addr_list = PyList_New(0)) == NULL)
4191 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 /* SF #1511317: h_aliases can be NULL */
4194 if (h->h_aliases) {
4195 for (pch = h->h_aliases; *pch != NULL; pch++) {
4196 int status;
4197 tmp = PyUnicode_FromString(*pch);
4198 if (tmp == NULL)
4199 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 status = PyList_Append(name_list, tmp);
4202 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 if (status)
4205 goto err;
4206 }
4207 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4210 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 case AF_INET:
4215 {
4216 struct sockaddr_in sin;
4217 memset(&sin, 0, sizeof(sin));
4218 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004219#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4223 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 if (pch == h->h_addr_list && alen >= sizeof(sin))
4226 memcpy((char *) addr, &sin, sizeof(sin));
4227 break;
4228 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004229
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004230#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004231 case AF_INET6:
4232 {
4233 struct sockaddr_in6 sin6;
4234 memset(&sin6, 0, sizeof(sin6));
4235 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004236#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4240 tmp = makeipaddr((struct sockaddr *)&sin6,
4241 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4244 memcpy((char *) addr, &sin6, sizeof(sin6));
4245 break;
4246 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004247#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004250 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 "unsupported address family");
4252 return NULL;
4253 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 if (tmp == NULL)
4256 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 status = PyList_Append(addr_list, tmp);
4259 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 if (status)
4262 goto err;
4263 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004266
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004267 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 Py_XDECREF(name_list);
4269 Py_XDECREF(addr_list);
4270 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004271}
4272
4273
4274/* Python interface to gethostbyname_ex(name). */
4275
4276/*ARGSUSED*/
4277static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004278socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 char *name;
4281 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004282 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004284 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004285#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004286 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004287#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004289#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 char buf[16384];
4291 int buf_len = (sizeof buf) - 1;
4292 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004293#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004294#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004296#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004297#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004298
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004299 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004301 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004302 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004304#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004305#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004306 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004307 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004308#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004309 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004310#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 memset((void *) &data, '\0', sizeof(data));
4312 result = gethostbyname_r(name, &hp_allocated, &data);
4313 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004314#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004315#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004316#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004320#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 Py_END_ALLOW_THREADS
4322 /* Some C libraries would require addr.__ss_family instead of
4323 addr.ss_family.
4324 Therefore, we cast the sockaddr_storage into sockaddr to
4325 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004326 sa = SAS2SA(&addr);
4327 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004329#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004331#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004332finally:
4333 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004335}
4336
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004337PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004338"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4339\n\
4340Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004341for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004342
4343
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004344/* Python interface to gethostbyaddr(IP). */
4345
4346/*ARGSUSED*/
4347static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004348socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004349{
Charles-François Natali8b759652011-12-23 16:44:51 +01004350 sock_addr_t addr;
4351 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 char *ip_num;
4353 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004354 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004355#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004357#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004359#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 /* glibcs up to 2.10 assume that the buf argument to
4361 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4362 does not ensure. The attribute below instructs the compiler
4363 to maintain this alignment. */
4364 char buf[16384] Py_ALIGNED(8);
4365 int buf_len = (sizeof buf) - 1;
4366 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004367#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004368#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004370#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004371#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 char *ap;
4373 int al;
4374 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004375
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004376 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 return NULL;
4378 af = AF_UNSPEC;
4379 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004380 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 af = sa->sa_family;
4382 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004383 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 switch (af) {
4385 case AF_INET:
4386 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4387 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4388 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004389#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 case AF_INET6:
4391 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4392 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4393 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004396 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004397 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 }
4399 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004400#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004401#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004402 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 &hp_allocated, buf, buf_len,
4404 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004405#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004406 h = gethostbyaddr_r(ap, al, af,
4407 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004408#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 memset((void *) &data, '\0', sizeof(data));
4410 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4411 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004412#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004413#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004414#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004418#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004420 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004421#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004423#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004424finally:
4425 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004427}
4428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004429PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004430"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4431\n\
4432Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004433for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004434
Guido van Rossum30a685f1991-06-27 15:51:29 +00004435
4436/* Python interface to getservbyname(name).
4437 This only returns the port number, since the other info is already
4438 known or not useful (like the list of aliases). */
4439
4440/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004441static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004442socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 char *name, *proto=NULL;
4445 struct servent *sp;
4446 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4447 return NULL;
4448 Py_BEGIN_ALLOW_THREADS
4449 sp = getservbyname(name, proto);
4450 Py_END_ALLOW_THREADS
4451 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004452 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 return NULL;
4454 }
4455 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004456}
4457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004458PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004459"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004460\n\
4461Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004462The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4463otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004464
Guido van Rossum30a685f1991-06-27 15:51:29 +00004465
Barry Warsaw11b91a02004-06-28 00:50:43 +00004466/* Python interface to getservbyport(port).
4467 This only returns the service name, since the other info is already
4468 known or not useful (like the list of aliases). */
4469
4470/*ARGSUSED*/
4471static PyObject *
4472socket_getservbyport(PyObject *self, PyObject *args)
4473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 int port;
4475 char *proto=NULL;
4476 struct servent *sp;
4477 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4478 return NULL;
4479 if (port < 0 || port > 0xffff) {
4480 PyErr_SetString(
4481 PyExc_OverflowError,
4482 "getservbyport: port must be 0-65535.");
4483 return NULL;
4484 }
4485 Py_BEGIN_ALLOW_THREADS
4486 sp = getservbyport(htons((short)port), proto);
4487 Py_END_ALLOW_THREADS
4488 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004489 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 return NULL;
4491 }
4492 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004493}
4494
4495PyDoc_STRVAR(getservbyport_doc,
4496"getservbyport(port[, protocolname]) -> string\n\
4497\n\
4498Return the service name from a port number and protocol name.\n\
4499The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4500otherwise any protocol will match.");
4501
Guido van Rossum3901d851996-12-19 16:35:04 +00004502/* Python interface to getprotobyname(name).
4503 This only returns the protocol number, since the other info is
4504 already known or not useful (like the list of aliases). */
4505
4506/*ARGSUSED*/
4507static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004508socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 char *name;
4511 struct protoent *sp;
4512 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4513 return NULL;
4514 Py_BEGIN_ALLOW_THREADS
4515 sp = getprotobyname(name);
4516 Py_END_ALLOW_THREADS
4517 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004518 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 return NULL;
4520 }
4521 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004522}
4523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004524PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004525"getprotobyname(name) -> integer\n\
4526\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004527Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004528
Guido van Rossum3901d851996-12-19 16:35:04 +00004529
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004530#ifndef NO_DUP
4531/* dup() function for socket fds */
4532
4533static PyObject *
4534socket_dup(PyObject *self, PyObject *fdobj)
4535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004536 SOCKET_T fd, newfd;
4537 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004538
4539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 fd = PyLong_AsSocket_t(fdobj);
4541 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4542 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004544 newfd = dup_socket(fd);
4545 if (newfd == INVALID_SOCKET)
4546 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 newfdobj = PyLong_FromSocket_t(newfd);
4549 if (newfdobj == NULL)
4550 SOCKETCLOSE(newfd);
4551 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004552}
4553
4554PyDoc_STRVAR(dup_doc,
4555"dup(integer) -> integer\n\
4556\n\
4557Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4558sockets; on some platforms os.dup() won't work for socket file descriptors.");
4559#endif
4560
4561
Dave Cole331708b2004-08-09 04:51:41 +00004562#ifdef HAVE_SOCKETPAIR
4563/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004564 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004565 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004566
4567/*ARGSUSED*/
4568static PyObject *
4569socket_socketpair(PyObject *self, PyObject *args)
4570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 PySocketSockObject *s0 = NULL, *s1 = NULL;
4572 SOCKET_T sv[2];
4573 int family, type = SOCK_STREAM, proto = 0;
4574 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004575
4576#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4582 &family, &type, &proto))
4583 return NULL;
4584 /* Create a pair of socket fds */
4585 if (socketpair(family, type, proto, sv) < 0)
4586 return set_error();
4587 s0 = new_sockobject(sv[0], family, type, proto);
4588 if (s0 == NULL)
4589 goto finally;
4590 s1 = new_sockobject(sv[1], family, type, proto);
4591 if (s1 == NULL)
4592 goto finally;
4593 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004594
4595finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 if (res == NULL) {
4597 if (s0 == NULL)
4598 SOCKETCLOSE(sv[0]);
4599 if (s1 == NULL)
4600 SOCKETCLOSE(sv[1]);
4601 }
4602 Py_XDECREF(s0);
4603 Py_XDECREF(s1);
4604 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004605}
4606
4607PyDoc_STRVAR(socketpair_doc,
4608"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4609\n\
4610Create a pair of socket objects from the sockets returned by the platform\n\
4611socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004612The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004613AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004614
4615#endif /* HAVE_SOCKETPAIR */
4616
4617
Guido van Rossum006bf911996-06-12 04:04:55 +00004618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004619socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4624 return NULL;
4625 }
4626 if (x1 < 0) {
4627 PyErr_SetString(PyExc_OverflowError,
4628 "can't convert negative number to unsigned long");
4629 return NULL;
4630 }
4631 x2 = (unsigned int)ntohs((unsigned short)x1);
4632 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004633}
4634
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004635PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004636"ntohs(integer) -> integer\n\
4637\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004638Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004639
4640
Guido van Rossum006bf911996-06-12 04:04:55 +00004641static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004642socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 if (PyLong_Check(arg)) {
4647 x = PyLong_AsUnsignedLong(arg);
4648 if (x == (unsigned long) -1 && PyErr_Occurred())
4649 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004650#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 {
4652 unsigned long y;
4653 /* only want the trailing 32 bits */
4654 y = x & 0xFFFFFFFFUL;
4655 if (y ^ x)
4656 return PyErr_Format(PyExc_OverflowError,
4657 "long int larger than 32 bits");
4658 x = y;
4659 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 }
4662 else
4663 return PyErr_Format(PyExc_TypeError,
4664 "expected int/long, %s found",
4665 Py_TYPE(arg)->tp_name);
4666 if (x == (unsigned long) -1 && PyErr_Occurred())
4667 return NULL;
4668 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004669}
4670
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004671PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004672"ntohl(integer) -> integer\n\
4673\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004674Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004675
4676
Guido van Rossum006bf911996-06-12 04:04:55 +00004677static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004678socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4683 return NULL;
4684 }
4685 if (x1 < 0) {
4686 PyErr_SetString(PyExc_OverflowError,
4687 "can't convert negative number to unsigned long");
4688 return NULL;
4689 }
4690 x2 = (unsigned int)htons((unsigned short)x1);
4691 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004692}
4693
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004694PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004695"htons(integer) -> integer\n\
4696\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004697Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004698
4699
Guido van Rossum006bf911996-06-12 04:04:55 +00004700static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004701socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 if (PyLong_Check(arg)) {
4706 x = PyLong_AsUnsignedLong(arg);
4707 if (x == (unsigned long) -1 && PyErr_Occurred())
4708 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004709#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 {
4711 unsigned long y;
4712 /* only want the trailing 32 bits */
4713 y = x & 0xFFFFFFFFUL;
4714 if (y ^ x)
4715 return PyErr_Format(PyExc_OverflowError,
4716 "long int larger than 32 bits");
4717 x = y;
4718 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 }
4721 else
4722 return PyErr_Format(PyExc_TypeError,
4723 "expected int/long, %s found",
4724 Py_TYPE(arg)->tp_name);
4725 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004726}
4727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004728PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004729"htonl(integer) -> integer\n\
4730\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004731Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004732
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004733/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004735PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004736"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004737\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004738Convert 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 +00004739binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004740
4741static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004742socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004743{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004744#ifndef INADDR_NONE
4745#define INADDR_NONE (-1)
4746#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004747#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004749#endif
4750
4751#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004752#if (SIZEOF_INT != 4)
4753#error "Not sure if in_addr_t exists and int is not 32-bits."
4754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 /* Have to use inet_addr() instead */
4756 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4761 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004762
Tim Peters1df9fdd2003-02-13 03:13:40 +00004763
4764#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004765
4766#ifdef USE_INET_ATON_WEAKLINK
4767 if (inet_aton != NULL) {
4768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 if (inet_aton(ip_addr, &buf))
4770 return PyBytes_FromStringAndSize((char *)(&buf),
4771 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004772
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004773 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 "illegal IP address string passed to inet_aton");
4775 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004776
Thomas Wouters477c8d52006-05-27 19:21:47 +00004777#ifdef USE_INET_ATON_WEAKLINK
4778 } else {
4779#endif
4780
4781#endif
4782
4783#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 /* special-case this address as inet_addr might return INADDR_NONE
4786 * for this */
4787 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4788 packed_addr = 0xFFFFFFFF;
4789 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004794 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 "illegal IP address string passed to inet_aton");
4796 return NULL;
4797 }
4798 }
4799 return PyBytes_FromStringAndSize((char *) &packed_addr,
4800 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004801
4802#ifdef USE_INET_ATON_WEAKLINK
4803 }
4804#endif
4805
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004806#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004807}
4808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004809PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004810"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004811\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004812Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004813
4814static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004815socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 char *packed_str;
4818 int addr_len;
4819 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4822 return NULL;
4823 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004826 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 "packed IP wrong length for inet_ntoa");
4828 return NULL;
4829 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004834}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004835
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004836#ifdef HAVE_INET_PTON
4837
4838PyDoc_STRVAR(inet_pton_doc,
4839"inet_pton(af, ip) -> packed IP address string\n\
4840\n\
4841Convert an IP address from string format to a packed string suitable\n\
4842for use with low-level network functions.");
4843
4844static PyObject *
4845socket_inet_pton(PyObject *self, PyObject *args)
4846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 int af;
4848 char* ip;
4849 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004850#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02004851 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004852#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4856 return NULL;
4857 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004858
Martin v. Löwis04697e82004-06-02 12:35:29 +00004859#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004861 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 "can't use AF_INET6, IPv6 is disabled");
4863 return NULL;
4864 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004865#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 retval = inet_pton(af, ip, packed);
4868 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004869 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 return NULL;
4871 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004872 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 "illegal IP address string passed to inet_pton");
4874 return NULL;
4875 } else if (af == AF_INET) {
4876 return PyBytes_FromStringAndSize(packed,
4877 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004878#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 } else if (af == AF_INET6) {
4880 return PyBytes_FromStringAndSize(packed,
4881 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004884 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 return NULL;
4886 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004887}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004888
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004889PyDoc_STRVAR(inet_ntop_doc,
4890"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4891\n\
4892Convert a packed IP address of the given family to string format.");
4893
4894static PyObject *
4895socket_inet_ntop(PyObject *self, PyObject *args)
4896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 int af;
4898 char* packed;
4899 int len;
4900 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004901#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02004902 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004905#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4908 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4911 return NULL;
4912 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 if (af == AF_INET) {
4915 if (len != sizeof(struct in_addr)) {
4916 PyErr_SetString(PyExc_ValueError,
4917 "invalid length of packed IP address string");
4918 return NULL;
4919 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004920#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 } else if (af == AF_INET6) {
4922 if (len != sizeof(struct in6_addr)) {
4923 PyErr_SetString(PyExc_ValueError,
4924 "invalid length of packed IP address string");
4925 return NULL;
4926 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 } else {
4929 PyErr_Format(PyExc_ValueError,
4930 "unknown address family %d", af);
4931 return NULL;
4932 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 retval = inet_ntop(af, packed, ip, sizeof(ip));
4935 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004936 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 return NULL;
4938 } else {
4939 return PyUnicode_FromString(retval);
4940 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 /* NOTREACHED */
4943 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4944 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004945}
4946
4947#endif /* HAVE_INET_PTON */
4948
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004949/* Python interface to getaddrinfo(host, port). */
4950
4951/*ARGSUSED*/
4952static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004953socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004954{
Victor Stinner77af1722011-05-26 14:05:59 +02004955 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004956 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 struct addrinfo hints, *res;
4958 struct addrinfo *res0 = NULL;
4959 PyObject *hobj = NULL;
4960 PyObject *pobj = (PyObject *)NULL;
4961 char pbuf[30];
4962 char *hptr, *pptr;
4963 int family, socktype, protocol, flags;
4964 int error;
4965 PyObject *all = (PyObject *)NULL;
4966 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 family = socktype = protocol = flags = 0;
4969 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004970 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004971 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 &protocol, &flags)) {
4973 return NULL;
4974 }
4975 if (hobj == Py_None) {
4976 hptr = NULL;
4977 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004978 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004979
4980 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 if (!idna)
4982 return NULL;
4983 assert(PyBytes_Check(idna));
4984 hptr = PyBytes_AS_STRING(idna);
4985 } else if (PyBytes_Check(hobj)) {
4986 hptr = PyBytes_AsString(hobj);
4987 } else {
4988 PyErr_SetString(PyExc_TypeError,
4989 "getaddrinfo() argument 1 must be string or None");
4990 return NULL;
4991 }
4992 if (PyLong_CheckExact(pobj)) {
4993 long value = PyLong_AsLong(pobj);
4994 if (value == -1 && PyErr_Occurred())
4995 goto err;
4996 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4997 pptr = pbuf;
4998 } else if (PyUnicode_Check(pobj)) {
4999 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005000 if (pptr == NULL)
5001 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005003 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 } else if (pobj == Py_None) {
5005 pptr = (char *)NULL;
5006 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005007 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 goto err;
5009 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005010#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005011 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5012 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
5013 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5014 * This workaround avoids a segfault in libsystem.
5015 */
5016 pptr = "00";
5017 }
5018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 memset(&hints, 0, sizeof(hints));
5020 hints.ai_family = family;
5021 hints.ai_socktype = socktype;
5022 hints.ai_protocol = protocol;
5023 hints.ai_flags = flags;
5024 Py_BEGIN_ALLOW_THREADS
5025 ACQUIRE_GETADDRINFO_LOCK
5026 error = getaddrinfo(hptr, pptr, &hints, &res0);
5027 Py_END_ALLOW_THREADS
5028 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5029 if (error) {
5030 set_gaierror(error);
5031 goto err;
5032 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 if ((all = PyList_New(0)) == NULL)
5035 goto err;
5036 for (res = res0; res; res = res->ai_next) {
5037 PyObject *single;
5038 PyObject *addr =
5039 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5040 if (addr == NULL)
5041 goto err;
5042 single = Py_BuildValue("iiisO", res->ai_family,
5043 res->ai_socktype, res->ai_protocol,
5044 res->ai_canonname ? res->ai_canonname : "",
5045 addr);
5046 Py_DECREF(addr);
5047 if (single == NULL)
5048 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 if (PyList_Append(all, single))
5051 goto err;
5052 Py_XDECREF(single);
5053 }
5054 Py_XDECREF(idna);
5055 if (res0)
5056 freeaddrinfo(res0);
5057 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005058 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 Py_XDECREF(all);
5060 Py_XDECREF(idna);
5061 if (res0)
5062 freeaddrinfo(res0);
5063 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005064}
5065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005066PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005067"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5068 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005069\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005070Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005071
5072/* Python interface to getnameinfo(sa, flags). */
5073
5074/*ARGSUSED*/
5075static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005076socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 PyObject *sa = (PyObject *)NULL;
5079 int flags;
5080 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005081 int port;
5082 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5084 struct addrinfo hints, *res = NULL;
5085 int error;
5086 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 flags = flowinfo = scope_id = 0;
5089 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5090 return NULL;
5091 if (!PyTuple_Check(sa)) {
5092 PyErr_SetString(PyExc_TypeError,
5093 "getnameinfo() argument 1 must be a tuple");
5094 return NULL;
5095 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005096 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 &hostp, &port, &flowinfo, &scope_id))
5098 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005099 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005100 PyErr_SetString(PyExc_OverflowError,
5101 "getsockaddrarg: flowinfo must be 0-1048575.");
5102 return NULL;
5103 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5105 memset(&hints, 0, sizeof(hints));
5106 hints.ai_family = AF_UNSPEC;
5107 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005108 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 Py_BEGIN_ALLOW_THREADS
5110 ACQUIRE_GETADDRINFO_LOCK
5111 error = getaddrinfo(hostp, pbuf, &hints, &res);
5112 Py_END_ALLOW_THREADS
5113 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5114 if (error) {
5115 set_gaierror(error);
5116 goto fail;
5117 }
5118 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005119 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 "sockaddr resolved to multiple addresses");
5121 goto fail;
5122 }
5123 switch (res->ai_family) {
5124 case AF_INET:
5125 {
5126 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005127 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 "IPv4 sockaddr must be 2 tuple");
5129 goto fail;
5130 }
5131 break;
5132 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005133#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 case AF_INET6:
5135 {
5136 struct sockaddr_in6 *sin6;
5137 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005138 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 sin6->sin6_scope_id = scope_id;
5140 break;
5141 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005144 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5146 if (error) {
5147 set_gaierror(error);
5148 goto fail;
5149 }
5150 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005151
5152fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 if (res)
5154 freeaddrinfo(res);
5155 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005156}
5157
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005158PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005159"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005160\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005161Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005162
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005163
5164/* Python API to getting and setting the default timeout value. */
5165
5166static PyObject *
5167socket_getdefaulttimeout(PyObject *self)
5168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 if (defaulttimeout < 0.0) {
5170 Py_INCREF(Py_None);
5171 return Py_None;
5172 }
5173 else
5174 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005175}
5176
5177PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005178"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005179\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005180Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005181A value of None indicates that new socket objects have no timeout.\n\
5182When the socket module is first imported, the default is None.");
5183
5184static PyObject *
5185socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 if (arg == Py_None)
5190 timeout = -1.0;
5191 else {
5192 timeout = PyFloat_AsDouble(arg);
5193 if (timeout < 0.0) {
5194 if (!PyErr_Occurred())
5195 PyErr_SetString(PyExc_ValueError,
5196 "Timeout value out of range");
5197 return NULL;
5198 }
5199 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 Py_INCREF(Py_None);
5204 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005205}
5206
5207PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005208"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005209\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005210Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005211A value of None indicates that new socket objects have no timeout.\n\
5212When the socket module is first imported, the default is None.");
5213
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005214#ifdef HAVE_IF_NAMEINDEX
5215/* Python API for getting interface indices and names */
5216
5217static PyObject *
5218socket_if_nameindex(PyObject *self, PyObject *arg)
5219{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005220 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005221 int i;
5222 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005223
Charles-François Natali60713592011-05-20 16:55:06 +02005224 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005225 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005226 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005227 return NULL;
5228 }
5229
5230 list = PyList_New(0);
5231 if (list == NULL) {
5232 if_freenameindex(ni);
5233 return NULL;
5234 }
5235
Charles-François Natali60713592011-05-20 16:55:06 +02005236 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5237 PyObject *ni_tuple = Py_BuildValue("IO&",
5238 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005239
5240 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5241 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005242 Py_DECREF(list);
5243 if_freenameindex(ni);
5244 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005245 }
5246 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005247 }
5248
5249 if_freenameindex(ni);
5250 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005251}
5252
5253PyDoc_STRVAR(if_nameindex_doc,
5254"if_nameindex()\n\
5255\n\
5256Returns a list of network interface information (index, name) tuples.");
5257
Charles-François Natali60713592011-05-20 16:55:06 +02005258static PyObject *
5259socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005260{
Charles-François Natali60713592011-05-20 16:55:06 +02005261 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005262 unsigned long index;
5263
Charles-François Natali60713592011-05-20 16:55:06 +02005264 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5265 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005266 return NULL;
5267
Charles-François Natali60713592011-05-20 16:55:06 +02005268 index = if_nametoindex(PyBytes_AS_STRING(oname));
5269 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005270 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005271 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005272 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005273 return NULL;
5274 }
5275
5276 return PyLong_FromUnsignedLong(index);
5277}
5278
5279PyDoc_STRVAR(if_nametoindex_doc,
5280"if_nametoindex(if_name)\n\
5281\n\
5282Returns the interface index corresponding to the interface name if_name.");
5283
Charles-François Natali60713592011-05-20 16:55:06 +02005284static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005285socket_if_indextoname(PyObject *self, PyObject *arg)
5286{
Charles-François Natali60713592011-05-20 16:55:06 +02005287 unsigned long index;
5288 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005289
Charles-François Natali60713592011-05-20 16:55:06 +02005290 index = PyLong_AsUnsignedLong(arg);
5291 if (index == (unsigned long) -1)
5292 return NULL;
5293
5294 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005295 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005296 return NULL;
5297 }
5298
Charles-François Natali60713592011-05-20 16:55:06 +02005299 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005300}
5301
5302PyDoc_STRVAR(if_indextoname_doc,
5303"if_indextoname(if_index)\n\
5304\n\
5305Returns the interface name corresponding to the interface index if_index.");
5306
5307#endif /* HAVE_IF_NAMEINDEX */
5308
5309
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005310#ifdef CMSG_LEN
5311/* Python interface to CMSG_LEN(length). */
5312
5313static PyObject *
5314socket_CMSG_LEN(PyObject *self, PyObject *args)
5315{
5316 Py_ssize_t length;
5317 size_t result;
5318
5319 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5320 return NULL;
5321 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5322 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5323 return NULL;
5324 }
5325 return PyLong_FromSize_t(result);
5326}
5327
5328PyDoc_STRVAR(CMSG_LEN_doc,
5329"CMSG_LEN(length) -> control message length\n\
5330\n\
5331Return the total length, without trailing padding, of an ancillary\n\
5332data item with associated data of the given length. This value can\n\
5333often be used as the buffer size for recvmsg() to receive a single\n\
5334item of ancillary data, but RFC 3542 requires portable applications to\n\
5335use CMSG_SPACE() and thus include space for padding, even when the\n\
5336item will be the last in the buffer. Raises OverflowError if length\n\
5337is outside the permissible range of values.");
5338
5339
5340#ifdef CMSG_SPACE
5341/* Python interface to CMSG_SPACE(length). */
5342
5343static PyObject *
5344socket_CMSG_SPACE(PyObject *self, PyObject *args)
5345{
5346 Py_ssize_t length;
5347 size_t result;
5348
5349 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5350 return NULL;
5351 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5352 PyErr_SetString(PyExc_OverflowError,
5353 "CMSG_SPACE() argument out of range");
5354 return NULL;
5355 }
5356 return PyLong_FromSize_t(result);
5357}
5358
5359PyDoc_STRVAR(CMSG_SPACE_doc,
5360"CMSG_SPACE(length) -> buffer size\n\
5361\n\
5362Return the buffer size needed for recvmsg() to receive an ancillary\n\
5363data item with associated data of the given length, along with any\n\
5364trailing padding. The buffer space needed to receive multiple items\n\
5365is the sum of the CMSG_SPACE() values for their associated data\n\
5366lengths. Raises OverflowError if length is outside the permissible\n\
5367range of values.");
5368#endif /* CMSG_SPACE */
5369#endif /* CMSG_LEN */
5370
5371
Guido van Rossum30a685f1991-06-27 15:51:29 +00005372/* List of functions exported by this module. */
5373
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005374static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 {"gethostbyname", socket_gethostbyname,
5376 METH_VARARGS, gethostbyname_doc},
5377 {"gethostbyname_ex", socket_gethostbyname_ex,
5378 METH_VARARGS, ghbn_ex_doc},
5379 {"gethostbyaddr", socket_gethostbyaddr,
5380 METH_VARARGS, gethostbyaddr_doc},
5381 {"gethostname", socket_gethostname,
5382 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005383#ifdef HAVE_SETHOSTNAME
5384 {"sethostname", socket_sethostname,
5385 METH_VARARGS, sethostname_doc},
5386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 {"getservbyname", socket_getservbyname,
5388 METH_VARARGS, getservbyname_doc},
5389 {"getservbyport", socket_getservbyport,
5390 METH_VARARGS, getservbyport_doc},
5391 {"getprotobyname", socket_getprotobyname,
5392 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005393#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 {"dup", socket_dup,
5395 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005396#endif
Dave Cole331708b2004-08-09 04:51:41 +00005397#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 {"socketpair", socket_socketpair,
5399 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 {"ntohs", socket_ntohs,
5402 METH_VARARGS, ntohs_doc},
5403 {"ntohl", socket_ntohl,
5404 METH_O, ntohl_doc},
5405 {"htons", socket_htons,
5406 METH_VARARGS, htons_doc},
5407 {"htonl", socket_htonl,
5408 METH_O, htonl_doc},
5409 {"inet_aton", socket_inet_aton,
5410 METH_VARARGS, inet_aton_doc},
5411 {"inet_ntoa", socket_inet_ntoa,
5412 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005413#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 {"inet_pton", socket_inet_pton,
5415 METH_VARARGS, inet_pton_doc},
5416 {"inet_ntop", socket_inet_ntop,
5417 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005418#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005419 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5420 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 {"getnameinfo", socket_getnameinfo,
5422 METH_VARARGS, getnameinfo_doc},
5423 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5424 METH_NOARGS, getdefaulttimeout_doc},
5425 {"setdefaulttimeout", socket_setdefaulttimeout,
5426 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005427#ifdef HAVE_IF_NAMEINDEX
5428 {"if_nameindex", socket_if_nameindex,
5429 METH_NOARGS, if_nameindex_doc},
5430 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005431 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005432 {"if_indextoname", socket_if_indextoname,
5433 METH_O, if_indextoname_doc},
5434#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005435#ifdef CMSG_LEN
5436 {"CMSG_LEN", socket_CMSG_LEN,
5437 METH_VARARGS, CMSG_LEN_doc},
5438#ifdef CMSG_SPACE
5439 {"CMSG_SPACE", socket_CMSG_SPACE,
5440 METH_VARARGS, CMSG_SPACE_doc},
5441#endif
5442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005444};
5445
Guido van Rossum30a685f1991-06-27 15:51:29 +00005446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005447#ifdef MS_WINDOWS
5448#define OS_INIT_DEFINED
5449
5450/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005451
5452static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005453os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005456}
5457
5458static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005459os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 WSADATA WSAData;
5462 int ret;
5463 ret = WSAStartup(0x0101, &WSAData);
5464 switch (ret) {
5465 case 0: /* No error */
5466 Py_AtExit(os_cleanup);
5467 return 1; /* Success */
5468 case WSASYSNOTREADY:
5469 PyErr_SetString(PyExc_ImportError,
5470 "WSAStartup failed: network not ready");
5471 break;
5472 case WSAVERNOTSUPPORTED:
5473 case WSAEINVAL:
5474 PyErr_SetString(
5475 PyExc_ImportError,
5476 "WSAStartup failed: requested version not supported");
5477 break;
5478 default:
5479 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5480 break;
5481 }
5482 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005483}
5484
Guido van Rossum8d665e61996-06-26 18:22:49 +00005485#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005486
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005487
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005488
5489#ifndef OS_INIT_DEFINED
5490static int
5491os_init(void)
5492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005494}
5495#endif
5496
5497
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005498/* C API table - always add new things to the end for binary
5499 compatibility. */
5500static
5501PySocketModule_APIObject PySocketModuleAPI =
5502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005504 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005506};
5507
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005508
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005509/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005511 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005512 "socket.py" which implements some additional functionality.
5513 The import of "_socket" may fail with an ImportError exception if
5514 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005515 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005516 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005517*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005519PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005520"Implementation module for socket operations.\n\
5521\n\
5522See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005523
Martin v. Löwis1a214512008-06-11 05:26:20 +00005524static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 PyModuleDef_HEAD_INIT,
5526 PySocket_MODULE_NAME,
5527 socket_doc,
5528 -1,
5529 socket_methods,
5530 NULL,
5531 NULL,
5532 NULL,
5533 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005534};
5535
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005536PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005537PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 if (!os_init())
5542 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 Py_TYPE(&sock_type) = &PyType_Type;
5545 m = PyModule_Create(&socketmodule);
5546 if (m == NULL)
5547 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005548
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005549 Py_INCREF(PyExc_OSError);
5550 PySocketModuleAPI.error = PyExc_OSError;
5551 Py_INCREF(PyExc_OSError);
5552 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005554 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 if (socket_herror == NULL)
5556 return NULL;
5557 Py_INCREF(socket_herror);
5558 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005559 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 NULL);
5561 if (socket_gaierror == NULL)
5562 return NULL;
5563 Py_INCREF(socket_gaierror);
5564 PyModule_AddObject(m, "gaierror", socket_gaierror);
5565 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005566 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 if (socket_timeout == NULL)
5568 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005569 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 Py_INCREF(socket_timeout);
5571 PyModule_AddObject(m, "timeout", socket_timeout);
5572 Py_INCREF((PyObject *)&sock_type);
5573 if (PyModule_AddObject(m, "SocketType",
5574 (PyObject *)&sock_type) != 0)
5575 return NULL;
5576 Py_INCREF((PyObject *)&sock_type);
5577 if (PyModule_AddObject(m, "socket",
5578 (PyObject *)&sock_type) != 0)
5579 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005580
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005581#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005583#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 Py_INCREF(has_ipv6);
5587 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 /* Export C API */
5590 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5591 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5592 ) != 0)
5593 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005596#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005597 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005598#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005599 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005600#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005601 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005602#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005603#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005604 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005605#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005606#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005608 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005609#endif
5610#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005611 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005612#endif
5613#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005615 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005616#endif
5617#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005619 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005620#endif
5621#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005623 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005624#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005625#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005627 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005628#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005629#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005631 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005632#endif
5633#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005635 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005636#endif
5637#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005638 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005639#endif
5640#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005642 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005643#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005644#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005646 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005647#endif
5648#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005650 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005651#endif
5652#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005654 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005655#endif
5656#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005658 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005659#endif
5660#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005662 PyModule_AddIntMacro(m, AF_NETLINK);
5663 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005664#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005665 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005666#endif
5667#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005668 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005669#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005670 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5671 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005672#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005673 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005674#endif
5675#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005676 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005677#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005678#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005679 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005680#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005681#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005682 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005683#endif
5684#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005685 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005686#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005687 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005688#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005689 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005690#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005691#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005692 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005693#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005694#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005695#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005697 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005698#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02005699#ifdef AF_LINK
5700 PyModule_AddIntMacro(m, AF_LINK);
5701#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005702#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005704 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005705#endif
5706#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005708 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005709#endif
5710#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005712 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005713#endif
5714#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005716 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005717#endif
5718#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005720 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005721#endif
5722#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005724 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005725#endif
5726#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005728 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005729#endif
5730#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005732 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005733#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005734
Hye-Shik Chang81268602004-02-02 06:05:24 +00005735#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005736 PyModule_AddIntMacro(m, AF_BLUETOOTH);
5737 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
5738 PyModule_AddIntMacro(m, BTPROTO_HCI);
5739 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005740#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005741 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005742#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005743#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005744#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005745 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005746#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005747 PyModule_AddIntMacro(m, HCI_DATA_DIR);
5748 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005749#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005750 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5752 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005753#endif
5754
Charles-François Natali47413c12011-10-06 19:47:44 +02005755#ifdef AF_CAN
5756 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005757 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005758#endif
5759#ifdef PF_CAN
5760 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005761 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005762#endif
5763
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005764/* Reliable Datagram Sockets */
5765#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005766 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005767#endif
5768#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005769 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005770#endif
5771
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005772/* Kernel event messages */
5773#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005774 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005775#endif
5776#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005777 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005778#endif
5779
Antoine Pitroub156a462010-10-27 20:13:57 +00005780#ifdef AF_PACKET
5781 PyModule_AddIntMacro(m, AF_PACKET);
5782#endif
5783#ifdef PF_PACKET
5784 PyModule_AddIntMacro(m, PF_PACKET);
5785#endif
5786#ifdef PACKET_HOST
5787 PyModule_AddIntMacro(m, PACKET_HOST);
5788#endif
5789#ifdef PACKET_BROADCAST
5790 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5791#endif
5792#ifdef PACKET_MULTICAST
5793 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5794#endif
5795#ifdef PACKET_OTHERHOST
5796 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5797#endif
5798#ifdef PACKET_OUTGOING
5799 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5800#endif
5801#ifdef PACKET_LOOPBACK
5802 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5803#endif
5804#ifdef PACKET_FASTROUTE
5805 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005806#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005807
Christian Heimes043d6f62008-01-07 17:19:16 +00005808#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005809 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005812 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
5813 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
5814 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005815
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005816 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
5817 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
5818 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005821 PyModule_AddIntMacro(m, SOL_TIPC);
5822 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
5823 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
5824 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
5825 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005826
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005827 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
5828 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
5829 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
5830 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005833 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
5834 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005835#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005837 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005838#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005839 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
5840 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
5841 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
5842 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
5843 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
5844 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005845#endif
5846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005848 PyModule_AddIntMacro(m, SOCK_STREAM);
5849 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005850/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005851 PyModule_AddIntMacro(m, SOCK_RAW);
5852 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005853#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005854 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005855#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005856#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005857 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00005858#endif
5859#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005860 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00005861#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005864 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005867 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005870 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005871#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005872#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005873 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005874#endif
5875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005877 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005880 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005883 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005886 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005889 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005892 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005895 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005898 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005901 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005904 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005907 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005910 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005913 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005916 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005919 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005922 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005923#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005924#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005925 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005926#endif
5927#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005928 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005929#endif
5930#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005931 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005932#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005933#ifdef SO_BINDTODEVICE
5934 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5935#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 /* Maximum number of connections for "listen" */
5938#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005939 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005940#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005942#endif
5943
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005944 /* Ancilliary message types */
5945#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005946 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005947#endif
5948#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005949 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005950#endif
5951#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005952 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005953#endif
5954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 /* Flags for send, recv */
5956#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005957 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005960 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005963 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005966 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005969 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005972 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005975 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005978 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005984 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005985#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005986#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005987 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005988#endif
5989#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005990 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005991#endif
5992#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005993 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005994#endif
5995#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005996 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005997#endif
5998#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005999 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006000#endif
6001#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006002 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006003#endif
6004#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006005 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006006#endif
6007#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006008 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006009#endif
6010#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006011 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006012#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006013#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006014 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006015#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 /* Protocol level and numbers, usable for [gs]etsockopt */
6018#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006019 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006022 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006023#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006027 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006030 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006033 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006036 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006039 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006042 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006043#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006047 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006048#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006050#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006051#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006052 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006053#endif
6054#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006055 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6056 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006057#endif
6058#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006059 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6060 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6061 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006062
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006063 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6064 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6065 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006066#endif
6067#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006068 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6069 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6070 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6071 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006072#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006073#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006075 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6076 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6077 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6078 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6079 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6080 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6081 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6082 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6083 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6084 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6085 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6086 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6087#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006088#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006089 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006090#endif
6091#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006092 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006093#endif
6094#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006095 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006096#endif
6097#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006098 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006099#endif
6100#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006101 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006102#endif
6103#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006104 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006105#endif
6106#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006107 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006110 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006111#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006115 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006118 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006119#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006123 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006126 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006127#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006129 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006132 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006135 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006138 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006139#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006146 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006150#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006154 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006157 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006163 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006166 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006169 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006184 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006190 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006193 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006196 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006202 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006205 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006208 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006212#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006213#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006218#endif
6219/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006221 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006222#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006226 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006227#endif
6228
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006229#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006231#endif
6232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 /* Some port configuration */
6234#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006235 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006240 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006241#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006243#endif
6244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 /* Some reserved IP v.4 addresses */
6246#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006248#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006253#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006258#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006263#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266#ifdef INADDR_ALLHOSTS_GROUP
6267 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6268 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006269#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006274#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006278 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006279#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006281#endif
6282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 /* IPv4 [gs]etsockopt options */
6284#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006303 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006306 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006315 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006320#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006321 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006324 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006327 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006330 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006331#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006332#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006333 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006334#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6337#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006356#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006357 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006360#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006361 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006362#endif
6363#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006364 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006365#endif
6366#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006367 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006368#endif
6369#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006370 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006371#endif
6372#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006374#endif
6375#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006377#endif
6378#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006380#endif
6381#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006383#endif
6384#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006385 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006386#endif
6387#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006388 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006389#endif
6390#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006391 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006392#endif
6393#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006394 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006395#endif
6396#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006398#endif
6399#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006401#endif
6402#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006404#endif
6405#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006407#endif
6408#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006410#endif
6411#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006413#endif
6414#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006416#endif
6417#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006419#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 /* TCP options */
6422#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006426 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006429 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006435 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006444 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006447 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006450 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006457#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006458#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006460#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462 /* IPX options */
6463#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006464 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006465#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006466
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006467/* Reliable Datagram Sockets */
6468#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006469 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006470#endif
6471#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006472 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006473#endif
6474#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006476#endif
6477#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006478 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006479#endif
6480#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006481 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006482#endif
6483#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006485#endif
6486#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006488#endif
6489#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006491#endif
6492#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006494#endif
6495#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006497#endif
6498#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006500#endif
6501#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006503#endif
6504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006506#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006508#endif
6509#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006511#endif
6512#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006514#endif
6515#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006517#endif
6518#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006520#endif
6521#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006523#endif
6524#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006526#endif
6527#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006529#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006530#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006532#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006533#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006535#endif
6536#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006537 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006538#endif
6539#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006541#endif
6542#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006544#endif
6545#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006547#endif
6548#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006550#endif
6551#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006553#endif
6554#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006556#endif
6557#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006559#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006560#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006562#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006563#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006565#endif
6566#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006567 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006568#endif
6569#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006571#endif
6572#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006574#endif
6575#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006577#endif
6578#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006580#endif
6581#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006582 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006583#endif
6584#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006585 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006586#endif
6587#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006589#endif
6590#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006592#endif
6593#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006595#endif
6596#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006598#endif
6599#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006601#endif
6602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006604#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006606#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006608#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006610#endif
6611#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006613#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006615#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006617#endif
6618#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006620#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006622#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006624#endif
6625
Christian Heimesfaf2f632008-01-06 16:59:19 +00006626#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627 {
6628 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6629 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6630 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006631 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 PyObject *tmp;
6633 tmp = PyLong_FromUnsignedLong(codes[i]);
6634 if (tmp == NULL)
6635 return NULL;
6636 PyModule_AddObject(m, names[i], tmp);
6637 }
6638 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, RCVALL_OFF);
6640 PyModule_AddIntMacro(m, RCVALL_ON);
6641 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006642#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006644#endif
6645#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006647#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006648#endif /* _MSTCPIP_ */
6649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006651#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006655}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006656
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006657
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006658#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006659#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006660
6661/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006662/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006663
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006664int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006665inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006668#if (SIZEOF_INT != 4)
6669#error "Not sure if in_addr_t exists and int is not 32-bits."
6670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 unsigned int packed_addr;
6672 packed_addr = inet_addr(src);
6673 if (packed_addr == INADDR_NONE)
6674 return 0;
6675 memcpy(dst, &packed_addr, 4);
6676 return 1;
6677 }
6678 /* Should set errno to EAFNOSUPPORT */
6679 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006680}
6681
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006682const char *
6683inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 if (af == AF_INET) {
6686 struct in_addr packed_addr;
6687 if (size < 16)
6688 /* Should set errno to ENOSPC. */
6689 return NULL;
6690 memcpy(&packed_addr, src, sizeof(packed_addr));
6691 return strncpy(dst, inet_ntoa(packed_addr), size);
6692 }
6693 /* Should set errno to EAFNOSUPPORT */
6694 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006695}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006696
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006697#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006698#endif