blob: 20db3d94641c8f9a47d0b20684bbf022f8fbe03d [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 Rossum47dfa4a2003-04-25 05:48:32 +000098#undef MAX
99#define MAX(x, y) ((x) < (y) ? (y) : (x))
100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103"socket([family[, type[, proto]]]) -> socket object\n\
104\n\
105Open a socket of the given type. The family argument specifies the\n\
106address family; it defaults to AF_INET. The type argument specifies\n\
107whether this is a stream (SOCK_STREAM, this is the default)\n\
108or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
109specifying the default protocol. Keyword arguments are accepted.\n\
110\n\
111A socket object represents one endpoint of a network connection.\n\
112\n\
113Methods of socket objects (keyword arguments not allowed):\n\
114\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116bind(addr) -- bind the socket to a local address\n\
117close() -- close the socket\n\
118connect(addr) -- connect the socket to a remote address\n\
119connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000120_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121fileno() -- return underlying file descriptor\n\
122getpeername() -- return remote address [*]\n\
123getsockname() -- return local address\n\
124getsockopt(level, optname[, buflen]) -- get socket options\n\
125gettimeout() -- return timeout or None\n\
126listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700139if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700140if_nametoindex(name) -- return the corresponding interface index\n\
141if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000144
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000145/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000146 I hope some day someone can clean this up please... */
147
Guido van Rossum9376b741999-09-15 22:01:40 +0000148/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
149 script doesn't get this right, so we hardcode some platform checks below.
150 On the other hand, not all Linux versions agree, so there the settings
151 computed by the configure script are needed! */
152
153#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R_3_ARG
155# undef HAVE_GETHOSTBYNAME_R_5_ARG
156# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000157#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000158
Victor Stinner710d27e2011-08-23 10:57:32 +0200159#if defined(__OpenBSD__)
160# include <sys/uio.h>
161#endif
162
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#endif
166
Guido van Rossume7de2061999-03-24 17:24:33 +0000167#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100168# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# define HAVE_GETHOSTBYNAME_R_3_ARG
170# elif defined(__sun) || defined(__sgi)
171# define HAVE_GETHOSTBYNAME_R_5_ARG
172# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# else
175# undef HAVE_GETHOSTBYNAME_R
176# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000177#endif
178
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000179#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
180 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000182#endif
183
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000184/* To use __FreeBSD_version */
185#ifdef HAVE_SYS_PARAM_H
186#include <sys/param.h>
187#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000188/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000189 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#if defined(WITH_THREAD) && (defined(__APPLE__) || \
191 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000192 defined(__OpenBSD__) || defined(__NetBSD__) || \
193 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000194#define USE_GETADDRINFO_LOCK
195#endif
196
197#ifdef USE_GETADDRINFO_LOCK
198#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
199#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
200#else
201#define ACQUIRE_GETADDRINFO_LOCK
202#define RELEASE_GETADDRINFO_LOCK
203#endif
204
205#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000207#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000209#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000210# include <types.h>
211# include <io.h>
212# include <sys/ioctl.h>
213# include <utils.h>
214# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000215#endif
216
Martin v. Löwis9e437302002-12-06 12:57:26 +0000217#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000218# include <ioctl.h>
219#endif
220
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100221#ifdef __APPLE__
222# include <sys/ioctl.h>
223#endif
224
225
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000227/* make sure that the reentrant (gethostbyaddr_r etc)
228 functions are declared correctly if compiling with
229 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000230
Thomas Wouters477c8d52006-05-27 19:21:47 +0000231/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000232 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000233#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000234#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000235
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000236#undef _XOPEN_SOURCE
237#include <sys/socket.h>
238#include <sys/types.h>
239#include <netinet/in.h>
240#ifdef _SS_ALIGNSIZE
241#define HAVE_GETADDRINFO 1
242#define HAVE_GETNAMEINFO 1
243#endif
244
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000245#define HAVE_INET_PTON
246#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000247#endif
248
Thomas Wouters477c8d52006-05-27 19:21:47 +0000249/* Irix 6.5 fails to define this variable at all. This is needed
250 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000251 are just busted. Same thing for Solaris. */
252#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000253#define INET_ADDRSTRLEN 16
254#endif
255
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000257#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000258#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000260
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700261#ifdef HAVE_SYS_SOCKET_H
262#include <sys/socket.h>
263#endif
264
265#ifdef HAVE_NET_IF_H
266#include <net/if.h>
267#endif
268
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000269/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000271#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
273/* Addressing includes */
274
Guido van Rossum6f489d91996-06-28 20:15:15 +0000275#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276
277/* Non-MS WINDOWS includes */
278# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000279# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000280
Guido van Rossum9376b741999-09-15 22:01:40 +0000281/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000283
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000286#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000287
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000289# ifdef HAVE_FCNTL_H
290# include <fcntl.h>
291# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000292
Jeremy Hylton22308652001-02-02 03:23:09 +0000293#endif
294
Skip Montanaro7befb992004-02-10 16:50:21 +0000295#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000296
297#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000299#endif
300
Neal Norwitz39d22e52002-11-02 19:55:21 +0000301#ifndef O_NONBLOCK
302# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000303#endif
304
Trent Micka708d6e2004-09-07 17:48:26 +0000305/* include Python's addrinfo.h unless it causes trouble */
306#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
307 /* Do not include addinfo.h on some newer IRIX versions.
308 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
309 * for example, but not by 6.5.10.
310 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000311#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000312 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
313 * EAI_* constants are defined in (the already included) ws2tcpip.h.
314 */
315#else
316# include "addrinfo.h"
317#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000318
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000319#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000320#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000321int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000322const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000323#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000324#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000325
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000326#ifdef __APPLE__
327/* On OS X, getaddrinfo returns no error indication of lookup
328 failure, so we must use the emulation instead of the libinfo
329 implementation. Unfortunately, performing an autoconf test
330 for this bug would require DNS access for the machine performing
331 the configuration, which is not acceptable. Therefore, we
332 determine the bug just by checking for __APPLE__. If this bug
333 gets ever fixed, perhaps checking for sys/version.h would be
334 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000335#ifndef HAVE_GETNAMEINFO
336/* This bug seems to be fixed in Jaguar. Ths easiest way I could
337 Find to check for Jaguar is that it has getnameinfo(), which
338 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000341
342#ifdef HAVE_INET_ATON
343#define USE_INET_ATON_WEAKLINK
344#endif
345
Jack Jansen84262fb2002-07-02 14:40:42 +0000346#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000349#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000350/* avoid clashes with the C library definition of the symbol. */
351#define getaddrinfo fake_getaddrinfo
352#define gai_strerror fake_gai_strerror
353#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000354#include "getaddrinfo.c"
355#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000358#include "getnameinfo.c"
359#endif
360
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000361#ifdef MS_WINDOWS
362/* On Windows a socket is really a handle not an fd */
363static SOCKET
364dup_socket(SOCKET handle)
365{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000366 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000367
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000368 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000370
371 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Antoine Pitrou9a54a262012-04-01 01:14:39 +0200372 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000373}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000374#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000375#else
376/* On Unix we can use dup to duplicate the file descriptor of a socket*/
377#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000378#endif
379
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000380#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000381#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000382#define EAFNOSUPPORT WSAEAFNOSUPPORT
383#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000384#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000385
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000386#ifndef SOCKETCLOSE
387#define SOCKETCLOSE close
388#endif
389
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000390#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define USE_BLUETOOTH 1
392#if defined(__FreeBSD__)
393#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
394#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000395#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000396#define SOL_HCI SOL_HCI_RAW
397#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000398#define sockaddr_l2 sockaddr_l2cap
399#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000400#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000401#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
402#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000403#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000404#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000405#define sockaddr_l2 sockaddr_bt
406#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000407#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000408#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000409#define SOL_HCI BTPROTO_HCI
410#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000411#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
412#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000413#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000414#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000415#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000416#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
417#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000418#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000419#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
420#endif
421#endif
422
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000423#ifdef __VMS
424/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
425#define SEGMENT_SIZE (32 * 1024 -1)
426#endif
427
Charles-François Natali8b759652011-12-23 16:44:51 +0100428/* Convert "sock_addr_t *" to "struct sockaddr *". */
429#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430
Martin v. Löwise9416172003-05-03 10:12:45 +0000431/*
432 * Constants for getnameinfo()
433 */
434#if !defined(NI_MAXHOST)
435#define NI_MAXHOST 1025
436#endif
437#if !defined(NI_MAXSERV)
438#define NI_MAXSERV 32
439#endif
440
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000441#ifndef INVALID_SOCKET /* MS defines this */
442#define INVALID_SOCKET (-1)
443#endif
444
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000445/* XXX There's a problem here: *static* functions are not supposed to have
446 a Py prefix (or use CapitalizedWords). Later... */
447
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448/* Global variable holding the exception type for errors detected
449 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000450static PyObject *socket_herror;
451static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000452static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453
Tim Peters643a7fc2002-02-17 04:13:21 +0000454/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000455 The sock_type variable contains pointers to various functions,
456 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000457 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000458static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000459
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000460#if defined(HAVE_POLL_H)
461#include <poll.h>
462#elif defined(HAVE_SYS_POLL_H)
463#include <sys/poll.h>
464#endif
465
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000466/* Largest value to try to store in a socklen_t (used when handling
467 ancillary data). POSIX requires socklen_t to hold at least
468 (2**31)-1 and recommends against storing larger values, but
469 socklen_t was originally int in the BSD interface, so to be on the
470 safe side we use the smaller of (2**31)-1 and INT_MAX. */
471#if INT_MAX > 0x7fffffff
472#define SOCKLEN_T_LIMIT 0x7fffffff
473#else
474#define SOCKLEN_T_LIMIT INT_MAX
475#endif
476
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200477#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000478/* Instead of select(), we'll use poll() since poll() works on any fd. */
479#define IS_SELECTABLE(s) 1
480/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000481#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200482/* If there's no timeout left, we don't have to call select, so it's a safe,
483 * little white lie. */
484#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000485#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000486
487static PyObject*
488select_error(void)
489{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200490 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000492}
493
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000494#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000495#ifndef WSAEAGAIN
496#define WSAEAGAIN WSAEWOULDBLOCK
497#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000498#define CHECK_ERRNO(expected) \
499 (WSAGetLastError() == WSA ## expected)
500#else
501#define CHECK_ERRNO(expected) \
502 (errno == expected)
503#endif
504
Guido van Rossum30a685f1991-06-27 15:51:29 +0000505/* Convenience function to raise an error according to errno
506 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507
Guido van Rossum73624e91994-10-10 17:59:00 +0000508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000511#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 int err_no = WSAGetLastError();
513 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
514 recognizes the error codes used by both GetLastError() and
515 WSAGetLastError */
516 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200517 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000518#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000519
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200520 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521}
522
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000525set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528
529#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 if (v != NULL) {
535 PyErr_SetObject(socket_herror, v);
536 Py_DECREF(v);
537 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540}
541
542
543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000544set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
Martin v. Löwis272cb402002-03-01 08:31:07 +0000548#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 /* EAI_SYSTEM is not available on Windows XP. */
550 if (error == EAI_SYSTEM)
551 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000552#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000554#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000556#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (v != NULL) {
560 PyErr_SetObject(socket_gaierror, v);
561 Py_DECREF(v);
562 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565}
566
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000567#ifdef __VMS
568/* Function to send in segments */
569static int
570sendsegmented(int sock_fd, char *buf, int len, int flags)
571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 int n = 0;
573 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 while (remaining > 0) {
576 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
579 n = send(sock_fd, buf, segment, flags);
580 if (n < 0) {
581 return n;
582 }
583 remaining -= segment;
584 buf += segment;
585 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000588}
589#endif
590
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000591/* Function to perform the setting of socket blocking mode
592 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000593static int
594internal_setblocking(PySocketSockObject *s, int block)
595{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000596#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000598#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000599#ifdef SOCK_NONBLOCK
600 if (block)
601 s->sock_type &= (~SOCK_NONBLOCK);
602 else
603 s->sock_type |= SOCK_NONBLOCK;
604#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607#ifndef MS_WINDOWS
Jesus Cea14c81ab2012-10-05 02:11:36 +0200608#if defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 block = !block;
610 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200611#else /* !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
613 if (block)
614 delay_flag &= (~O_NONBLOCK);
615 else
616 delay_flag |= O_NONBLOCK;
617 fcntl(s->sock_fd, F_SETFL, delay_flag);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200618#endif /* !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000619#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 block = !block;
621 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 /* Since these don't return anything */
626 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627}
628
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000629/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000630 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000631 This does not raise an exception; we'll let our caller do that
632 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000633 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000634static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000635internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Nothing to do unless we're in timeout mode (not non-blocking) */
640 if (s->sock_timeout <= 0.0)
641 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Guard against closed socket */
644 if (s->sock_fd < 0)
645 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000646
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000647 /* Handling this condition here simplifies the select loops */
648 if (interval < 0.0)
649 return 1;
650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 /* Prefer poll, if available, since you can poll() any fd
652 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 {
655 struct pollfd pollfd;
656 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 pollfd.fd = s->sock_fd;
659 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000662 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 n = poll(&pollfd, 1, timeout);
664 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000665#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 {
667 /* Construct the arguments to select */
668 fd_set fds;
669 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000670 tv.tv_sec = (int)interval;
671 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 FD_ZERO(&fds);
673 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* See if the socket is ready */
676 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000677 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
678 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000680 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
681 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 if (n < 0)
686 return -1;
687 if (n == 0)
688 return 1;
689 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000690}
691
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000692static int
693internal_select(PySocketSockObject *s, int writing)
694{
695 return internal_select_ex(s, writing, s->sock_timeout);
696}
697
698/*
699 Two macros for automatic retry of select() in case of false positives
700 (for example, select() could indicate a socket is ready for reading
701 but the data then discarded by the OS because of a wrong checksum).
702 Here is an example of use:
703
704 BEGIN_SELECT_LOOP(s)
705 Py_BEGIN_ALLOW_THREADS
706 timeout = internal_select_ex(s, 0, interval);
707 if (!timeout)
708 outlen = recv(s->sock_fd, cbuf, len, flags);
709 Py_END_ALLOW_THREADS
710 if (timeout == 1) {
711 PyErr_SetString(socket_timeout, "timed out");
712 return -1;
713 }
714 END_SELECT_LOOP(s)
715*/
716
717#define BEGIN_SELECT_LOOP(s) \
718 { \
719 _PyTime_timeval now, deadline = {0, 0}; \
720 double interval = s->sock_timeout; \
721 int has_timeout = s->sock_timeout > 0.0; \
722 if (has_timeout) { \
723 _PyTime_gettimeofday(&now); \
724 deadline = now; \
725 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
726 } \
727 while (1) { \
728 errno = 0; \
729
730#define END_SELECT_LOOP(s) \
731 if (!has_timeout || \
732 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
733 break; \
734 _PyTime_gettimeofday(&now); \
735 interval = _PyTime_INTERVAL(now, deadline); \
736 } \
737 } \
738
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000739/* Initialize a new socket object. */
740
Tim Petersa12b4cf2002-07-18 22:38:44 +0000741static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000742
Martin v. Löwis1a214512008-06-11 05:26:20 +0000743static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000744init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 s->sock_fd = fd;
748 s->sock_family = family;
749 s->sock_type = type;
750 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000753#ifdef SOCK_NONBLOCK
754 if (type & SOCK_NONBLOCK)
755 s->sock_timeout = 0.0;
756 else
757#endif
758 {
759 s->sock_timeout = defaulttimeout;
760 if (defaulttimeout >= 0.0)
761 internal_setblocking(s, 0);
762 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000763
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000764}
765
766
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767/* Create a new socket object.
768 This just creates the object and initializes it.
769 If the creation fails, return NULL and set an exception (implicit
770 in NEWOBJ()). */
771
Guido van Rossum73624e91994-10-10 17:59:00 +0000772static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000773new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 PySocketSockObject *s;
776 s = (PySocketSockObject *)
777 PyType_GenericNew(&sock_type, NULL, NULL);
778 if (s != NULL)
779 init_sockobject(s, fd, family, type, proto);
780 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781}
782
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783
Guido van Rossum48a680c2001-03-02 06:34:14 +0000784/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000785 thread to be in gethostbyname or getaddrinfo */
786#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200787static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000788#endif
789
790
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791/* Convert a string specifying a host name or one of a few symbolic
792 names to a numeric IP address. This usually calls gethostbyname()
793 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000794 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 an error occurred; then an exception is raised. */
796
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000798setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 struct addrinfo hints, *res;
801 int error;
802 int d1, d2, d3, d4;
803 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
806 if (name[0] == '\0') {
807 int siz;
808 memset(&hints, 0, sizeof(hints));
809 hints.ai_family = af;
810 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
811 hints.ai_flags = AI_PASSIVE;
812 Py_BEGIN_ALLOW_THREADS
813 ACQUIRE_GETADDRINFO_LOCK
814 error = getaddrinfo(NULL, "0", &hints, &res);
815 Py_END_ALLOW_THREADS
816 /* We assume that those thread-unsafe getaddrinfo() versions
817 *are* safe regarding their return value, ie. that a
818 subsequent call to getaddrinfo() does not destroy the
819 outcome of the first call. */
820 RELEASE_GETADDRINFO_LOCK
821 if (error) {
822 set_gaierror(error);
823 return -1;
824 }
825 switch (res->ai_family) {
826 case AF_INET:
827 siz = 4;
828 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000829#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 case AF_INET6:
831 siz = 16;
832 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 default:
835 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200836 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 "unsupported address family");
838 return -1;
839 }
840 if (res->ai_next) {
841 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200842 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 "wildcard resolved to multiple address");
844 return -1;
845 }
846 if (res->ai_addrlen < addr_ret_size)
847 addr_ret_size = res->ai_addrlen;
848 memcpy(addr_ret, res->ai_addr, addr_ret_size);
849 freeaddrinfo(res);
850 return siz;
851 }
852 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
853 struct sockaddr_in *sin;
854 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200855 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 "address family mismatched");
857 return -1;
858 }
859 sin = (struct sockaddr_in *)addr_ret;
860 memset((void *) sin, '\0', sizeof(*sin));
861 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000862#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 sin->sin_addr.s_addr = INADDR_BROADCAST;
866 return sizeof(sin->sin_addr);
867 }
868 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
869 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
870 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
871 struct sockaddr_in *sin;
872 sin = (struct sockaddr_in *)addr_ret;
873 sin->sin_addr.s_addr = htonl(
874 ((long) d1 << 24) | ((long) d2 << 16) |
875 ((long) d3 << 8) | ((long) d4 << 0));
876 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000877#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 return 4;
881 }
882 memset(&hints, 0, sizeof(hints));
883 hints.ai_family = af;
884 Py_BEGIN_ALLOW_THREADS
885 ACQUIRE_GETADDRINFO_LOCK
886 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000887#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 if (error == EAI_NONAME && af == AF_UNSPEC) {
889 /* On Tru64 V5.1, numeric-to-addr conversion fails
890 if no address family is given. Assume IPv4 for now.*/
891 hints.ai_family = AF_INET;
892 error = getaddrinfo(name, NULL, &hints, &res);
893 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 Py_END_ALLOW_THREADS
896 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
897 if (error) {
898 set_gaierror(error);
899 return -1;
900 }
901 if (res->ai_addrlen < addr_ret_size)
902 addr_ret_size = res->ai_addrlen;
903 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
904 freeaddrinfo(res);
905 switch (addr_ret->sa_family) {
906 case AF_INET:
907 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000908#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 case AF_INET6:
910 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200913 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 return -1;
915 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916}
917
Guido van Rossum30a685f1991-06-27 15:51:29 +0000918
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919/* Create a string object representing an IP address.
920 This is always a string of the form 'dd.dd.dd.dd' (with variable
921 size numbers). */
922
Guido van Rossum73624e91994-10-10 17:59:00 +0000923static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000924makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 char buf[NI_MAXHOST];
927 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
930 NI_NUMERICHOST);
931 if (error) {
932 set_gaierror(error);
933 return NULL;
934 }
935 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936}
937
938
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000939#ifdef USE_BLUETOOTH
940/* Convert a string representation of a Bluetooth address into a numeric
941 address. Returns the length (6), or raises an exception and returns -1 if
942 an error occurred. */
943
944static int
945setbdaddr(char *name, bdaddr_t *bdaddr)
946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 unsigned int b0, b1, b2, b3, b4, b5;
948 char ch;
949 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
952 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
953 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
954 bdaddr->b[0] = b0;
955 bdaddr->b[1] = b1;
956 bdaddr->b[2] = b2;
957 bdaddr->b[3] = b3;
958 bdaddr->b[4] = b4;
959 bdaddr->b[5] = b5;
960 return 6;
961 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200962 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 return -1;
964 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000965}
966
967/* Create a string representation of the Bluetooth address. This is always a
968 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
969 value (zero padded if necessary). */
970
971static PyObject *
972makebdaddr(bdaddr_t *bdaddr)
973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
977 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
978 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
979 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000980}
981#endif
982
983
Guido van Rossum30a685f1991-06-27 15:51:29 +0000984/* Create an object representing the given socket address,
985 suitable for passing it back to bind(), connect() etc.
986 The family field of the sockaddr structure is inspected
987 to determine what kind of address it really is. */
988
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000990static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000991makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 if (addrlen == 0) {
994 /* No address -- may be recvfrom() from known socket */
995 Py_INCREF(Py_None);
996 return Py_None;
997 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 case AF_INET:
1002 {
1003 struct sockaddr_in *a;
1004 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1005 PyObject *ret = NULL;
1006 if (addrobj) {
1007 a = (struct sockaddr_in *)addr;
1008 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1009 Py_DECREF(addrobj);
1010 }
1011 return ret;
1012 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001014#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 case AF_UNIX:
1016 {
1017 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001018#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1020 addrlen -= offsetof(struct sockaddr_un, sun_path);
1021 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1022 }
1023 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001024#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 {
1026 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001027 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 }
1029 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001030#endif /* AF_UNIX */
1031
Martin v. Löwis11017b12006-01-14 18:12:57 +00001032#if defined(AF_NETLINK)
1033 case AF_NETLINK:
1034 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1036 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001037 }
1038#endif /* AF_NETLINK */
1039
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001040#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case AF_INET6:
1042 {
1043 struct sockaddr_in6 *a;
1044 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1045 PyObject *ret = NULL;
1046 if (addrobj) {
1047 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001048 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 addrobj,
1050 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001051 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 a->sin6_scope_id);
1053 Py_DECREF(addrobj);
1054 }
1055 return ret;
1056 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001057#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001058
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001059#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 case AF_BLUETOOTH:
1061 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 case BTPROTO_L2CAP:
1064 {
1065 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1066 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1067 PyObject *ret = NULL;
1068 if (addrobj) {
1069 ret = Py_BuildValue("Oi",
1070 addrobj,
1071 _BT_L2_MEMB(a, psm));
1072 Py_DECREF(addrobj);
1073 }
1074 return ret;
1075 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 case BTPROTO_RFCOMM:
1078 {
1079 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1080 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1081 PyObject *ret = NULL;
1082 if (addrobj) {
1083 ret = Py_BuildValue("Oi",
1084 addrobj,
1085 _BT_RC_MEMB(a, channel));
1086 Py_DECREF(addrobj);
1087 }
1088 return ret;
1089 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case BTPROTO_HCI:
1092 {
1093 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001094#if defined(__NetBSD__) || defined(__DragonFly__)
1095 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1096#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 PyObject *ret = NULL;
1098 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1099 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001102
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 case BTPROTO_SCO:
1105 {
1106 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1107 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1108 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109#endif
1110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 default:
1112 PyErr_SetString(PyExc_ValueError,
1113 "Unknown Bluetooth protocol");
1114 return NULL;
1115 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001116#endif
1117
Antoine Pitroub156a462010-10-27 20:13:57 +00001118#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 case AF_PACKET:
1120 {
1121 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1122 char *ifname = "";
1123 struct ifreq ifr;
1124 /* need to look up interface name give index */
1125 if (a->sll_ifindex) {
1126 ifr.ifr_ifindex = a->sll_ifindex;
1127 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1128 ifname = ifr.ifr_name;
1129 }
1130 return Py_BuildValue("shbhy#",
1131 ifname,
1132 ntohs(a->sll_protocol),
1133 a->sll_pkttype,
1134 a->sll_hatype,
1135 a->sll_addr,
1136 a->sll_halen);
1137 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001138#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001139
Christian Heimes043d6f62008-01-07 17:19:16 +00001140#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 case AF_TIPC:
1142 {
1143 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1144 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1145 return Py_BuildValue("IIIII",
1146 a->addrtype,
1147 a->addr.nameseq.type,
1148 a->addr.nameseq.lower,
1149 a->addr.nameseq.upper,
1150 a->scope);
1151 } else if (a->addrtype == TIPC_ADDR_NAME) {
1152 return Py_BuildValue("IIIII",
1153 a->addrtype,
1154 a->addr.name.name.type,
1155 a->addr.name.name.instance,
1156 a->addr.name.name.instance,
1157 a->scope);
1158 } else if (a->addrtype == TIPC_ADDR_ID) {
1159 return Py_BuildValue("IIIII",
1160 a->addrtype,
1161 a->addr.id.node,
1162 a->addr.id.ref,
1163 0,
1164 a->scope);
1165 } else {
1166 PyErr_SetString(PyExc_ValueError,
1167 "Invalid address type");
1168 return NULL;
1169 }
1170 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001171#endif
1172
Charles-François Natali30589c92011-10-07 22:47:08 +02001173#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001174 case AF_CAN:
1175 {
1176 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1177 char *ifname = "";
1178 struct ifreq ifr;
1179 /* need to look up interface name given index */
1180 if (a->can_ifindex) {
1181 ifr.ifr_ifindex = a->can_ifindex;
1182 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1183 ifname = ifr.ifr_name;
1184 }
1185
1186 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1187 ifname,
1188 a->can_family);
1189 }
1190#endif
1191
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001192#ifdef PF_SYSTEM
1193 case PF_SYSTEM:
1194 switch(proto) {
1195#ifdef SYSPROTO_CONTROL
1196 case SYSPROTO_CONTROL:
1197 {
1198 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1199 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1200 }
1201#endif
1202 default:
1203 PyErr_SetString(PyExc_ValueError,
1204 "Invalid address type");
1205 return 0;
1206 }
1207#endif
1208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 default:
1212 /* If we don't know the address family, don't raise an
1213 exception -- return it as an (int, bytes) tuple. */
1214 return Py_BuildValue("iy#",
1215 addr->sa_family,
1216 addr->sa_data,
1217 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001220}
1221
Guido van Rossum30a685f1991-06-27 15:51:29 +00001222
1223/* Parse a socket address argument according to the socket object's
1224 address family. Return 1 if the address was in the proper format,
1225 0 of not. The address is returned through addr_ret, its length
1226 through len_ret. */
1227
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001228static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001229getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001233
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001234#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 case AF_UNIX:
1236 {
1237 struct sockaddr_un* addr;
1238 char *path;
1239 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001240 int retval = 0;
1241
1242 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1243 allow embedded nulls on Linux. */
1244 if (PyUnicode_Check(args)) {
1245 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1246 return 0;
1247 }
1248 else
1249 Py_INCREF(args);
1250 if (!PyArg_Parse(args, "y#", &path, &len))
1251 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001254#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 if (len > 0 && path[0] == 0) {
1256 /* Linux abstract namespace extension */
1257 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001258 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001260 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 }
1262 }
1263 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001264#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 {
1266 /* regular NULL-terminated string */
1267 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001268 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001270 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 }
1272 addr->sun_path[len] = 0;
1273 }
1274 addr->sun_family = s->sock_family;
1275 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001277 retval = 1;
1278 unix_out:
1279 Py_DECREF(args);
1280 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283
Martin v. Löwis11017b12006-01-14 18:12:57 +00001284#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 case AF_NETLINK:
1286 {
1287 struct sockaddr_nl* addr;
1288 int pid, groups;
1289 addr = (struct sockaddr_nl *)addr_ret;
1290 if (!PyTuple_Check(args)) {
1291 PyErr_Format(
1292 PyExc_TypeError,
1293 "getsockaddrarg: "
1294 "AF_NETLINK address must be tuple, not %.500s",
1295 Py_TYPE(args)->tp_name);
1296 return 0;
1297 }
1298 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1299 return 0;
1300 addr->nl_family = AF_NETLINK;
1301 addr->nl_pid = pid;
1302 addr->nl_groups = groups;
1303 *len_ret = sizeof(*addr);
1304 return 1;
1305 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001306#endif
1307
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001308#ifdef AF_RDS
1309 case AF_RDS:
1310 /* RDS sockets use sockaddr_in: fall-through */
1311#endif
1312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 case AF_INET:
1314 {
1315 struct sockaddr_in* addr;
1316 char *host;
1317 int port, result;
1318 if (!PyTuple_Check(args)) {
1319 PyErr_Format(
1320 PyExc_TypeError,
1321 "getsockaddrarg: "
1322 "AF_INET address must be tuple, not %.500s",
1323 Py_TYPE(args)->tp_name);
1324 return 0;
1325 }
1326 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1327 "idna", &host, &port))
1328 return 0;
1329 addr=(struct sockaddr_in*)addr_ret;
1330 result = setipaddr(host, (struct sockaddr *)addr,
1331 sizeof(*addr), AF_INET);
1332 PyMem_Free(host);
1333 if (result < 0)
1334 return 0;
1335 if (port < 0 || port > 0xffff) {
1336 PyErr_SetString(
1337 PyExc_OverflowError,
1338 "getsockaddrarg: port must be 0-65535.");
1339 return 0;
1340 }
1341 addr->sin_family = AF_INET;
1342 addr->sin_port = htons((short)port);
1343 *len_ret = sizeof *addr;
1344 return 1;
1345 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001347#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 case AF_INET6:
1349 {
1350 struct sockaddr_in6* addr;
1351 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001352 int port, result;
1353 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 flowinfo = scope_id = 0;
1355 if (!PyTuple_Check(args)) {
1356 PyErr_Format(
1357 PyExc_TypeError,
1358 "getsockaddrarg: "
1359 "AF_INET6 address must be tuple, not %.500s",
1360 Py_TYPE(args)->tp_name);
1361 return 0;
1362 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001363 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 "idna", &host, &port, &flowinfo,
1365 &scope_id)) {
1366 return 0;
1367 }
1368 addr = (struct sockaddr_in6*)addr_ret;
1369 result = setipaddr(host, (struct sockaddr *)addr,
1370 sizeof(*addr), AF_INET6);
1371 PyMem_Free(host);
1372 if (result < 0)
1373 return 0;
1374 if (port < 0 || port > 0xffff) {
1375 PyErr_SetString(
1376 PyExc_OverflowError,
1377 "getsockaddrarg: port must be 0-65535.");
1378 return 0;
1379 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001380 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001381 PyErr_SetString(
1382 PyExc_OverflowError,
1383 "getsockaddrarg: flowinfo must be 0-1048575.");
1384 return 0;
1385 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 addr->sin6_family = s->sock_family;
1387 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001388 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 addr->sin6_scope_id = scope_id;
1390 *len_ret = sizeof *addr;
1391 return 1;
1392 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001393#endif
1394
Hye-Shik Chang81268602004-02-02 06:05:24 +00001395#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 case AF_BLUETOOTH:
1397 {
1398 switch (s->sock_proto) {
1399 case BTPROTO_L2CAP:
1400 {
1401 struct sockaddr_l2 *addr;
1402 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 addr = (struct sockaddr_l2 *)addr_ret;
1405 memset(addr, 0, sizeof(struct sockaddr_l2));
1406 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1407 if (!PyArg_ParseTuple(args, "si", &straddr,
1408 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001409 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 "wrong format");
1411 return 0;
1412 }
1413 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1414 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 *len_ret = sizeof *addr;
1417 return 1;
1418 }
1419 case BTPROTO_RFCOMM:
1420 {
1421 struct sockaddr_rc *addr;
1422 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 addr = (struct sockaddr_rc *)addr_ret;
1425 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1426 if (!PyArg_ParseTuple(args, "si", &straddr,
1427 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001428 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 "wrong format");
1430 return 0;
1431 }
1432 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1433 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 *len_ret = sizeof *addr;
1436 return 1;
1437 }
1438 case BTPROTO_HCI:
1439 {
1440 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001441#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001442 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001443
Alexander Belopolskye239d232010-12-08 23:31:48 +00001444 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001445 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001446 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001447 "wrong format");
1448 return 0;
1449 }
1450 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1451 return 0;
1452#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1454 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001455 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 "wrong format");
1457 return 0;
1458 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 *len_ret = sizeof *addr;
1461 return 1;
1462 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001463#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 case BTPROTO_SCO:
1465 {
1466 struct sockaddr_sco *addr;
1467 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 addr = (struct sockaddr_sco *)addr_ret;
1470 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1471 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001472 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 "wrong format");
1474 return 0;
1475 }
1476 straddr = PyBytes_AS_STRING(args);
1477 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1478 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 *len_ret = sizeof *addr;
1481 return 1;
1482 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001485 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 return 0;
1487 }
1488 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001489#endif
1490
Antoine Pitroub156a462010-10-27 20:13:57 +00001491#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 case AF_PACKET:
1493 {
1494 struct sockaddr_ll* addr;
1495 struct ifreq ifr;
1496 char *interfaceName;
1497 int protoNumber;
1498 int hatype = 0;
1499 int pkttype = 0;
1500 char *haddr = NULL;
1501 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 if (!PyTuple_Check(args)) {
1504 PyErr_Format(
1505 PyExc_TypeError,
1506 "getsockaddrarg: "
1507 "AF_PACKET address must be tuple, not %.500s",
1508 Py_TYPE(args)->tp_name);
1509 return 0;
1510 }
1511 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1512 &protoNumber, &pkttype, &hatype,
1513 &haddr, &halen))
1514 return 0;
1515 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1516 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1517 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1518 s->errorhandler();
1519 return 0;
1520 }
1521 if (halen > 8) {
1522 PyErr_SetString(PyExc_ValueError,
1523 "Hardware address must be 8 bytes or less");
1524 return 0;
1525 }
1526 if (protoNumber < 0 || protoNumber > 0xffff) {
1527 PyErr_SetString(
1528 PyExc_OverflowError,
1529 "getsockaddrarg: protoNumber must be 0-65535.");
1530 return 0;
1531 }
1532 addr = (struct sockaddr_ll*)addr_ret;
1533 addr->sll_family = AF_PACKET;
1534 addr->sll_protocol = htons((short)protoNumber);
1535 addr->sll_ifindex = ifr.ifr_ifindex;
1536 addr->sll_pkttype = pkttype;
1537 addr->sll_hatype = hatype;
1538 if (halen != 0) {
1539 memcpy(&addr->sll_addr, haddr, halen);
1540 }
1541 addr->sll_halen = halen;
1542 *len_ret = sizeof *addr;
1543 return 1;
1544 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001545#endif
1546
Christian Heimes043d6f62008-01-07 17:19:16 +00001547#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 case AF_TIPC:
1549 {
1550 unsigned int atype, v1, v2, v3;
1551 unsigned int scope = TIPC_CLUSTER_SCOPE;
1552 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 if (!PyTuple_Check(args)) {
1555 PyErr_Format(
1556 PyExc_TypeError,
1557 "getsockaddrarg: "
1558 "AF_TIPC address must be tuple, not %.500s",
1559 Py_TYPE(args)->tp_name);
1560 return 0;
1561 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (!PyArg_ParseTuple(args,
1564 "IIII|I;Invalid TIPC address format",
1565 &atype, &v1, &v2, &v3, &scope))
1566 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 addr = (struct sockaddr_tipc *) addr_ret;
1569 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 addr->family = AF_TIPC;
1572 addr->scope = scope;
1573 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 if (atype == TIPC_ADDR_NAMESEQ) {
1576 addr->addr.nameseq.type = v1;
1577 addr->addr.nameseq.lower = v2;
1578 addr->addr.nameseq.upper = v3;
1579 } else if (atype == TIPC_ADDR_NAME) {
1580 addr->addr.name.name.type = v1;
1581 addr->addr.name.name.instance = v2;
1582 } else if (atype == TIPC_ADDR_ID) {
1583 addr->addr.id.node = v1;
1584 addr->addr.id.ref = v2;
1585 } else {
1586 /* Shouldn't happen */
1587 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1588 return 0;
1589 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 return 1;
1594 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001595#endif
1596
Charles-François Natali30589c92011-10-07 22:47:08 +02001597#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001598 case AF_CAN:
1599 switch (s->sock_proto) {
1600 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001601 /* fall-through */
1602 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001603 {
1604 struct sockaddr_can *addr;
1605 PyObject *interfaceName;
1606 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001607 Py_ssize_t len;
1608
Benjamin Peterson18b71912013-05-16 15:29:44 -05001609 addr = (struct sockaddr_can *)addr_ret;
1610
Charles-François Natali47413c12011-10-06 19:47:44 +02001611 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1612 &interfaceName))
1613 return 0;
1614
1615 len = PyBytes_GET_SIZE(interfaceName);
1616
1617 if (len == 0) {
1618 ifr.ifr_ifindex = 0;
1619 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001620 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1621 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001622 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1623 s->errorhandler();
1624 Py_DECREF(interfaceName);
1625 return 0;
1626 }
1627 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001628 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001629 "AF_CAN interface name too long");
1630 Py_DECREF(interfaceName);
1631 return 0;
1632 }
1633
1634 addr->can_family = AF_CAN;
1635 addr->can_ifindex = ifr.ifr_ifindex;
1636
1637 *len_ret = sizeof(*addr);
1638 Py_DECREF(interfaceName);
1639 return 1;
1640 }
1641 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001642 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001643 "getsockaddrarg: unsupported CAN protocol");
1644 return 0;
1645 }
1646#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001647
1648#ifdef PF_SYSTEM
1649 case PF_SYSTEM:
1650 switch (s->sock_proto) {
1651#ifdef SYSPROTO_CONTROL
1652 case SYSPROTO_CONTROL:
1653 {
1654 struct sockaddr_ctl *addr;
1655
1656 addr = (struct sockaddr_ctl *)addr_ret;
1657 addr->sc_family = AF_SYSTEM;
1658 addr->ss_sysaddr = AF_SYS_CONTROL;
1659
1660 if (PyUnicode_Check(args)) {
1661 struct ctl_info info;
1662 PyObject *ctl_name;
1663
1664 if (!PyArg_Parse(args, "O&",
1665 PyUnicode_FSConverter, &ctl_name)) {
1666 return 0;
1667 }
1668
1669 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1670 PyErr_SetString(PyExc_ValueError,
1671 "provided string is too long");
1672 Py_DECREF(ctl_name);
1673 return 0;
1674 }
1675 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1676 sizeof(info.ctl_name));
1677 Py_DECREF(ctl_name);
1678
1679 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1680 PyErr_SetString(PyExc_OSError,
1681 "cannot find kernel control with provided name");
1682 return 0;
1683 }
1684
1685 addr->sc_id = info.ctl_id;
1686 addr->sc_unit = 0;
1687 } else if (!PyArg_ParseTuple(args, "II",
1688 &(addr->sc_id), &(addr->sc_unit))) {
1689 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1690 "expected str or tuple of two ints");
1691
1692 return 0;
1693 }
1694
1695 *len_ret = sizeof(*addr);
1696 return 1;
1697 }
1698#endif
1699 default:
1700 PyErr_SetString(PyExc_OSError,
1701 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1702 return 0;
1703 }
1704#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001709 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001713}
1714
Guido van Rossum30a685f1991-06-27 15:51:29 +00001715
Guido van Rossum48a680c2001-03-02 06:34:14 +00001716/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001717 Return 1 if the family is known, 0 otherwise. The length is returned
1718 through len_ret. */
1719
1720static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001721getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001724
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001725#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 case AF_UNIX:
1727 {
1728 *len_ret = sizeof (struct sockaddr_un);
1729 return 1;
1730 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001731#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001732#if defined(AF_NETLINK)
1733 case AF_NETLINK:
1734 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 *len_ret = sizeof (struct sockaddr_nl);
1736 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001737 }
1738#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001739
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001740#ifdef AF_RDS
1741 case AF_RDS:
1742 /* RDS sockets use sockaddr_in: fall-through */
1743#endif
1744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 case AF_INET:
1746 {
1747 *len_ret = sizeof (struct sockaddr_in);
1748 return 1;
1749 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001750
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001751#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 case AF_INET6:
1753 {
1754 *len_ret = sizeof (struct sockaddr_in6);
1755 return 1;
1756 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001757#endif
1758
Hye-Shik Chang81268602004-02-02 06:05:24 +00001759#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 case AF_BLUETOOTH:
1761 {
1762 switch(s->sock_proto)
1763 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 case BTPROTO_L2CAP:
1766 *len_ret = sizeof (struct sockaddr_l2);
1767 return 1;
1768 case BTPROTO_RFCOMM:
1769 *len_ret = sizeof (struct sockaddr_rc);
1770 return 1;
1771 case BTPROTO_HCI:
1772 *len_ret = sizeof (struct sockaddr_hci);
1773 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001774#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 case BTPROTO_SCO:
1776 *len_ret = sizeof (struct sockaddr_sco);
1777 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001780 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 "unknown BT protocol");
1782 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 }
1785 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001786#endif
1787
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001788#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 case AF_PACKET:
1790 {
1791 *len_ret = sizeof (struct sockaddr_ll);
1792 return 1;
1793 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001794#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001795
Christian Heimes043d6f62008-01-07 17:19:16 +00001796#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 case AF_TIPC:
1798 {
1799 *len_ret = sizeof (struct sockaddr_tipc);
1800 return 1;
1801 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001802#endif
1803
Charles-François Natali30589c92011-10-07 22:47:08 +02001804#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001805 case AF_CAN:
1806 {
1807 *len_ret = sizeof (struct sockaddr_can);
1808 return 1;
1809 }
1810#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001811
1812#ifdef PF_SYSTEM
1813 case PF_SYSTEM:
1814 switch(s->sock_proto) {
1815#ifdef SYSPROTO_CONTROL
1816 case SYSPROTO_CONTROL:
1817 *len_ret = sizeof (struct sockaddr_ctl);
1818 return 1;
1819#endif
1820 default:
1821 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1822 "unknown PF_SYSTEM protocol");
1823 return 0;
1824 }
1825#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001830 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001834}
1835
1836
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001837/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1838 Currently, these methods are only compiled if the RFC 2292/3542
1839 CMSG_LEN() macro is available. Older systems seem to have used
1840 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1841 it may be possible to define CMSG_LEN() that way if it's not
1842 provided. Some architectures might need extra padding after the
1843 cmsghdr, however, and CMSG_LEN() would have to take account of
1844 this. */
1845#ifdef CMSG_LEN
1846/* If length is in range, set *result to CMSG_LEN(length) and return
1847 true; otherwise, return false. */
1848static int
1849get_CMSG_LEN(size_t length, size_t *result)
1850{
1851 size_t tmp;
1852
1853 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1854 return 0;
1855 tmp = CMSG_LEN(length);
1856 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1857 return 0;
1858 *result = tmp;
1859 return 1;
1860}
1861
1862#ifdef CMSG_SPACE
1863/* If length is in range, set *result to CMSG_SPACE(length) and return
1864 true; otherwise, return false. */
1865static int
1866get_CMSG_SPACE(size_t length, size_t *result)
1867{
1868 size_t tmp;
1869
1870 /* Use CMSG_SPACE(1) here in order to take account of the padding
1871 necessary before *and* after the data. */
1872 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1873 return 0;
1874 tmp = CMSG_SPACE(length);
1875 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1876 return 0;
1877 *result = tmp;
1878 return 1;
1879}
1880#endif
1881
1882/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1883 pointer in msg->msg_control with at least "space" bytes after it,
1884 and its cmsg_len member inside the buffer. */
1885static int
1886cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1887{
1888 size_t cmsg_offset;
1889 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1890 sizeof(cmsgh->cmsg_len));
1891
Charles-François Natali466517d2011-08-28 18:23:43 +02001892 /* Note that POSIX allows msg_controllen to be of signed type. */
1893 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001894 return 0;
1895 if (space < cmsg_len_end)
1896 space = cmsg_len_end;
1897 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1898 return (cmsg_offset <= (size_t)-1 - space &&
1899 cmsg_offset + space <= msg->msg_controllen);
1900}
1901
1902/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1903 *space to number of bytes following it in the buffer and return
1904 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1905 msg->msg_controllen are valid. */
1906static int
1907get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1908{
1909 size_t data_offset;
1910 char *data_ptr;
1911
1912 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1913 return 0;
1914 data_offset = data_ptr - (char *)msg->msg_control;
1915 if (data_offset > msg->msg_controllen)
1916 return 0;
1917 *space = msg->msg_controllen - data_offset;
1918 return 1;
1919}
1920
1921/* If cmsgh is invalid or not contained in the buffer pointed to by
1922 msg->msg_control, return -1. If cmsgh is valid and its associated
1923 data is entirely contained in the buffer, set *data_len to the
1924 length of the associated data and return 0. If only part of the
1925 associated data is contained in the buffer but cmsgh is otherwise
1926 valid, set *data_len to the length contained in the buffer and
1927 return 1. */
1928static int
1929get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1930{
1931 size_t space, cmsg_data_len;
1932
1933 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1934 cmsgh->cmsg_len < CMSG_LEN(0))
1935 return -1;
1936 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1937 if (!get_cmsg_data_space(msg, cmsgh, &space))
1938 return -1;
1939 if (space >= cmsg_data_len) {
1940 *data_len = cmsg_data_len;
1941 return 0;
1942 }
1943 *data_len = space;
1944 return 1;
1945}
1946#endif /* CMSG_LEN */
1947
1948
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001949/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001950
Guido van Rossum73624e91994-10-10 17:59:00 +00001951static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001952sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 sock_addr_t addrbuf;
1955 SOCKET_T newfd = INVALID_SOCKET;
1956 socklen_t addrlen;
1957 PyObject *sock = NULL;
1958 PyObject *addr = NULL;
1959 PyObject *res = NULL;
1960 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 if (!getsockaddrlen(s, &addrlen))
1962 return NULL;
1963 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 if (!IS_SELECTABLE(s))
1966 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001967
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001968 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001970 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001971 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001973 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 if (timeout == 1) {
1977 PyErr_SetString(socket_timeout, "timed out");
1978 return NULL;
1979 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001980 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 if (newfd == INVALID_SOCKET)
1983 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 sock = PyLong_FromSocket_t(newfd);
1986 if (sock == NULL) {
1987 SOCKETCLOSE(newfd);
1988 goto finally;
1989 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1992 addrlen, s->sock_proto);
1993 if (addr == NULL)
1994 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001997
Guido van Rossum67f7a382002-06-06 21:08:16 +00001998finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 Py_XDECREF(sock);
2000 Py_XDECREF(addr);
2001 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002002}
2003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002004PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002005"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002006\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002007Wait for an incoming connection. Return a new socket file descriptor\n\
2008representing the connection, and the address of the client.\n\
2009For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002010
Guido van Rossum11ba0942002-06-13 15:07:44 +00002011/* s.setblocking(flag) method. Argument:
2012 False -- non-blocking mode; same as settimeout(0)
2013 True -- blocking mode; same as settimeout(None)
2014*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002015
Guido van Rossum73624e91994-10-10 17:59:00 +00002016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002018{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002019 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 block = PyLong_AsLong(arg);
2022 if (block == -1 && PyErr_Occurred())
2023 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 s->sock_timeout = block ? -1.0 : 0.0;
2026 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 Py_INCREF(Py_None);
2029 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002030}
Guido van Rossume4485b01994-09-07 14:32:49 +00002031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002032PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002033"setblocking(flag)\n\
2034\n\
2035Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002036setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002037setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002038
Guido van Rossum11ba0942002-06-13 15:07:44 +00002039/* s.settimeout(timeout) method. Argument:
2040 None -- no timeout, blocking mode; same as setblocking(True)
2041 0.0 -- non-blocking mode; same as setblocking(False)
2042 > 0 -- timeout mode; operations time out after timeout seconds
2043 < 0 -- illegal; raises an exception
2044*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002045static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002046sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 if (arg == Py_None)
2051 timeout = -1.0;
2052 else {
2053 timeout = PyFloat_AsDouble(arg);
2054 if (timeout < 0.0) {
2055 if (!PyErr_Occurred())
2056 PyErr_SetString(PyExc_ValueError,
2057 "Timeout value out of range");
2058 return NULL;
2059 }
2060 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 s->sock_timeout = timeout;
2063 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 Py_INCREF(Py_None);
2066 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002067}
2068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002069PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002070"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002071\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002072Set a timeout on socket operations. 'timeout' can be a float,\n\
2073giving in seconds, or None. Setting a timeout of None disables\n\
2074the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002075Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002077/* s.gettimeout() method.
2078 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002079static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002080sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 if (s->sock_timeout < 0.0) {
2083 Py_INCREF(Py_None);
2084 return Py_None;
2085 }
2086 else
2087 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002088}
2089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002090PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002091"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002092\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002093Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002094operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002096
Guido van Rossumaee08791992-09-08 09:05:33 +00002097/* s.setsockopt() method.
2098 With an integer third argument, sets an integer option.
2099 With a string third argument, sets an option from a buffer;
2100 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002101
Guido van Rossum73624e91994-10-10 17:59:00 +00002102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002103sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 int level;
2106 int optname;
2107 int res;
2108 char *buf;
2109 int buflen;
2110 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 if (PyArg_ParseTuple(args, "iii:setsockopt",
2113 &level, &optname, &flag)) {
2114 buf = (char *) &flag;
2115 buflen = sizeof flag;
2116 }
2117 else {
2118 PyErr_Clear();
2119 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2120 &level, &optname, &buf, &buflen))
2121 return NULL;
2122 }
2123 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2124 if (res < 0)
2125 return s->errorhandler();
2126 Py_INCREF(Py_None);
2127 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002128}
2129
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002130PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002131"setsockopt(level, option, value)\n\
2132\n\
2133Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002134The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002135
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002136
Guido van Rossumaee08791992-09-08 09:05:33 +00002137/* s.getsockopt() method.
2138 With two arguments, retrieves an integer option.
2139 With a third integer argument, retrieves a string buffer of that size;
2140 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002141
Guido van Rossum73624e91994-10-10 17:59:00 +00002142static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002143sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 int level;
2146 int optname;
2147 int res;
2148 PyObject *buf;
2149 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2152 &level, &optname, &buflen))
2153 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 if (buflen == 0) {
2156 int flag = 0;
2157 socklen_t flagsize = sizeof flag;
2158 res = getsockopt(s->sock_fd, level, optname,
2159 (void *)&flag, &flagsize);
2160 if (res < 0)
2161 return s->errorhandler();
2162 return PyLong_FromLong(flag);
2163 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002164#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 /* socklen_t is unsigned so no negative test is needed,
2166 test buflen == 0 is previously done */
2167 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002168#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002170#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002171 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 "getsockopt buflen out of range");
2173 return NULL;
2174 }
2175 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2176 if (buf == NULL)
2177 return NULL;
2178 res = getsockopt(s->sock_fd, level, optname,
2179 (void *)PyBytes_AS_STRING(buf), &buflen);
2180 if (res < 0) {
2181 Py_DECREF(buf);
2182 return s->errorhandler();
2183 }
2184 _PyBytes_Resize(&buf, buflen);
2185 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002186}
2187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002188PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002189"getsockopt(level, option[, buffersize]) -> value\n\
2190\n\
2191Get a socket option. See the Unix manual for level and option.\n\
2192If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002193string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002194
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002195
Fred Drake728819a2000-07-01 03:40:12 +00002196/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002197
Guido van Rossum73624e91994-10-10 17:59:00 +00002198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002199sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 sock_addr_t addrbuf;
2202 int addrlen;
2203 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2206 return NULL;
2207 Py_BEGIN_ALLOW_THREADS
2208 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2209 Py_END_ALLOW_THREADS
2210 if (res < 0)
2211 return s->errorhandler();
2212 Py_INCREF(Py_None);
2213 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002214}
2215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002216PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002217"bind(address)\n\
2218\n\
2219Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002220pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002221sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002222
Guido van Rossum30a685f1991-06-27 15:51:29 +00002223
2224/* s.close() method.
2225 Set the file descriptor to -1 so operations tried subsequently
2226 will surely fail. */
2227
Guido van Rossum73624e91994-10-10 17:59:00 +00002228static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002229sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 if ((fd = s->sock_fd) != -1) {
2234 s->sock_fd = -1;
2235 Py_BEGIN_ALLOW_THREADS
2236 (void) SOCKETCLOSE(fd);
2237 Py_END_ALLOW_THREADS
2238 }
2239 Py_INCREF(Py_None);
2240 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002241}
2242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244"close()\n\
2245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002248static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002249sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002250{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002251 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002252 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002253 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002254}
2255
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002256PyDoc_STRVAR(detach_doc,
2257"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002258\n\
2259Close the socket object without closing the underlying file descriptor.\
2260The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002261can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002262
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002263static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002264internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 timeout = 0;
2270 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002271
2272#ifdef MS_WINDOWS
2273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 if (s->sock_timeout > 0.0) {
2275 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2276 IS_SELECTABLE(s)) {
2277 /* This is a mess. Best solution: trust select */
2278 fd_set fds;
2279 fd_set fds_exc;
2280 struct timeval tv;
2281 tv.tv_sec = (int)s->sock_timeout;
2282 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2283 FD_ZERO(&fds);
2284 FD_SET(s->sock_fd, &fds);
2285 FD_ZERO(&fds_exc);
2286 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002287 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2288 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 if (res == 0) {
2290 res = WSAEWOULDBLOCK;
2291 timeout = 1;
2292 } else if (res > 0) {
2293 if (FD_ISSET(s->sock_fd, &fds))
2294 /* The socket is in the writable set - this
2295 means connected */
2296 res = 0;
2297 else {
2298 /* As per MS docs, we need to call getsockopt()
2299 to get the underlying error */
2300 int res_size = sizeof res;
2301 /* It must be in the exception set */
2302 assert(FD_ISSET(s->sock_fd, &fds_exc));
2303 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2304 (char *)&res, &res_size))
2305 /* getsockopt also clears WSAGetLastError,
2306 so reset it back. */
2307 WSASetLastError(res);
2308 else
2309 res = WSAGetLastError();
2310 }
2311 }
2312 /* else if (res < 0) an error occurred */
2313 }
2314 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 if (res < 0)
2317 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002318
2319#else
2320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 if (s->sock_timeout > 0.0) {
2322 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2323 timeout = internal_select(s, 1);
2324 if (timeout == 0) {
2325 /* Bug #1019808: in case of an EINPROGRESS,
2326 use getsockopt(SO_ERROR) to get the real
2327 error. */
2328 socklen_t res_size = sizeof res;
2329 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2330 SO_ERROR, &res, &res_size);
2331 if (res == EISCONN)
2332 res = 0;
2333 errno = res;
2334 }
2335 else if (timeout == -1) {
2336 res = errno; /* had error */
2337 }
2338 else
2339 res = EWOULDBLOCK; /* timed out */
2340 }
2341 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 if (res < 0)
2344 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002345
2346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002350}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002351
Fred Drake728819a2000-07-01 03:40:12 +00002352/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002353
Guido van Rossum73624e91994-10-10 17:59:00 +00002354static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002355sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 sock_addr_t addrbuf;
2358 int addrlen;
2359 int res;
2360 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2363 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Py_BEGIN_ALLOW_THREADS
2366 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2367 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 if (timeout == 1) {
2370 PyErr_SetString(socket_timeout, "timed out");
2371 return NULL;
2372 }
2373 if (res != 0)
2374 return s->errorhandler();
2375 Py_INCREF(Py_None);
2376 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002377}
2378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002379PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002380"connect(address)\n\
2381\n\
2382Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002383is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002384
Guido van Rossum30a685f1991-06-27 15:51:29 +00002385
Fred Drake728819a2000-07-01 03:40:12 +00002386/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002387
2388static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 sock_addr_t addrbuf;
2392 int addrlen;
2393 int res;
2394 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2397 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 Py_BEGIN_ALLOW_THREADS
2400 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2401 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 /* Signals are not errors (though they may raise exceptions). Adapted
2404 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002405#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 if (res == EINTR && PyErr_CheckSignals())
2407 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002408#endif
2409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002411}
2412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002414"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002415\n\
2416This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002417instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002418
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002419
Guido van Rossumed233a51992-06-23 09:07:03 +00002420/* s.fileno() method */
2421
Guido van Rossum73624e91994-10-10 17:59:00 +00002422static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002423sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002426}
2427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002428PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002429"fileno() -> integer\n\
2430\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002431Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002432
Guido van Rossumed233a51992-06-23 09:07:03 +00002433
Guido van Rossumc89705d1992-11-26 08:54:07 +00002434/* s.getsockname() method */
2435
Guido van Rossum73624e91994-10-10 17:59:00 +00002436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002437sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 sock_addr_t addrbuf;
2440 int res;
2441 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 if (!getsockaddrlen(s, &addrlen))
2444 return NULL;
2445 memset(&addrbuf, 0, addrlen);
2446 Py_BEGIN_ALLOW_THREADS
2447 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2448 Py_END_ALLOW_THREADS
2449 if (res < 0)
2450 return s->errorhandler();
2451 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2452 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002453}
2454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002455PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002456"getsockname() -> address info\n\
2457\n\
2458Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002459info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002460
Guido van Rossumc89705d1992-11-26 08:54:07 +00002461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002463/* s.getpeername() method */
2464
Guido van Rossum73624e91994-10-10 17:59:00 +00002465static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002466sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 sock_addr_t addrbuf;
2469 int res;
2470 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 if (!getsockaddrlen(s, &addrlen))
2473 return NULL;
2474 memset(&addrbuf, 0, addrlen);
2475 Py_BEGIN_ALLOW_THREADS
2476 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2477 Py_END_ALLOW_THREADS
2478 if (res < 0)
2479 return s->errorhandler();
2480 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2481 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002482}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485"getpeername() -> address info\n\
2486\n\
2487Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002488info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489
Guido van Rossumb6775db1994-08-01 11:34:53 +00002490#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002491
2492
Guido van Rossum30a685f1991-06-27 15:51:29 +00002493/* s.listen(n) method */
2494
Guido van Rossum73624e91994-10-10 17:59:00 +00002495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002496sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 int backlog;
2499 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002500
Serhiy Storchaka78980432013-01-15 01:12:17 +02002501 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 if (backlog == -1 && PyErr_Occurred())
2503 return NULL;
2504 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002505 /* To avoid problems on systems that don't allow a negative backlog
2506 * (which doesn't make sense anyway) we force a minimum value of 0. */
2507 if (backlog < 0)
2508 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 res = listen(s->sock_fd, backlog);
2510 Py_END_ALLOW_THREADS
2511 if (res < 0)
2512 return s->errorhandler();
2513 Py_INCREF(Py_None);
2514 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002515}
2516
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002517PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002518"listen(backlog)\n\
2519\n\
2520Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002521least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2522unaccepted connections that the system will allow before refusing new\n\
2523connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524
2525
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002527 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002528 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002529 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002530 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531 * also possible that we return a number of bytes smaller than the request
2532 * bytes.
2533 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002534
Antoine Pitrou19467d22010-08-17 19:33:30 +00002535static Py_ssize_t
2536sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002537{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002538 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002540#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 int remaining;
2542 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002543#endif
2544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 if (!IS_SELECTABLE(s)) {
2546 select_error();
2547 return -1;
2548 }
2549 if (len == 0) {
2550 /* If 0 bytes were requested, do nothing. */
2551 return 0;
2552 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002553
2554#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002555 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002557 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 if (!timeout)
2559 outlen = recv(s->sock_fd, cbuf, len, flags);
2560 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 if (timeout == 1) {
2563 PyErr_SetString(socket_timeout, "timed out");
2564 return -1;
2565 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002566 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 if (outlen < 0) {
2568 /* Note: the call to errorhandler() ALWAYS indirectly returned
2569 NULL, so ignore its return value */
2570 s->errorhandler();
2571 return -1;
2572 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002573#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 read_buf = cbuf;
2575 remaining = len;
2576 while (remaining != 0) {
2577 unsigned int segment;
2578 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 segment = remaining /SEGMENT_SIZE;
2581 if (segment != 0) {
2582 segment = SEGMENT_SIZE;
2583 }
2584 else {
2585 segment = remaining;
2586 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002588 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002590 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 if (!timeout)
2592 nread = recv(s->sock_fd, read_buf, segment, flags);
2593 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 if (timeout == 1) {
2595 PyErr_SetString(socket_timeout, "timed out");
2596 return -1;
2597 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002598 END_SELECT_LOOP(s)
2599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 if (nread < 0) {
2601 s->errorhandler();
2602 return -1;
2603 }
2604 if (nread != remaining) {
2605 read_buf += nread;
2606 break;
2607 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 remaining -= segment;
2610 read_buf += segment;
2611 }
2612 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002613#endif /* !__VMS */
2614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002616}
2617
Guido van Rossum48a680c2001-03-02 06:34:14 +00002618
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002619/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002620
Guido van Rossum73624e91994-10-10 17:59:00 +00002621static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002622sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002623{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002624 Py_ssize_t recvlen, outlen;
2625 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002627
Antoine Pitrou19467d22010-08-17 19:33:30 +00002628 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 if (recvlen < 0) {
2632 PyErr_SetString(PyExc_ValueError,
2633 "negative buffersize in recv");
2634 return NULL;
2635 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 /* Allocate a new string. */
2638 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2639 if (buf == NULL)
2640 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 /* Call the guts */
2643 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2644 if (outlen < 0) {
2645 /* An error occurred, release the string and return an
2646 error. */
2647 Py_DECREF(buf);
2648 return NULL;
2649 }
2650 if (outlen != recvlen) {
2651 /* We did not read as many bytes as we anticipated, resize the
2652 string if possible and be successful. */
2653 _PyBytes_Resize(&buf, outlen);
2654 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002657}
2658
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002659PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002660"recv(buffersize[, flags]) -> data\n\
2661\n\
2662Receive up to buffersize bytes from the socket. For the optional flags\n\
2663argument, see the Unix manual. When no data is available, block until\n\
2664at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002665the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002666
Guido van Rossum30a685f1991-06-27 15:51:29 +00002667
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002668/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002669
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002671sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002674
Antoine Pitrou19467d22010-08-17 19:33:30 +00002675 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 Py_buffer pbuf;
2677 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002678 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002681 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 &pbuf, &recvlen, &flags))
2683 return NULL;
2684 buf = pbuf.buf;
2685 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 if (recvlen < 0) {
2688 PyBuffer_Release(&pbuf);
2689 PyErr_SetString(PyExc_ValueError,
2690 "negative buffersize in recv_into");
2691 return NULL;
2692 }
2693 if (recvlen == 0) {
2694 /* If nbytes was not specified, use the buffer's length */
2695 recvlen = buflen;
2696 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 /* Check if the buffer is large enough */
2699 if (buflen < recvlen) {
2700 PyBuffer_Release(&pbuf);
2701 PyErr_SetString(PyExc_ValueError,
2702 "buffer too small for requested bytes");
2703 return NULL;
2704 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 /* Call the guts */
2707 readlen = sock_recv_guts(s, buf, recvlen, flags);
2708 if (readlen < 0) {
2709 /* Return an error. */
2710 PyBuffer_Release(&pbuf);
2711 return NULL;
2712 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 PyBuffer_Release(&pbuf);
2715 /* Return the number of bytes read. Note that we do not do anything
2716 special here in the case that readlen < recvlen. */
2717 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002718}
2719
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002720PyDoc_STRVAR(recv_into_doc,
2721"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002722\n\
2723A version of recv() that stores its data into a buffer rather than creating \n\
2724a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2725is not specified (or 0), receive up to the size available in the given buffer.\n\
2726\n\
2727See recv() for documentation about the flags.");
2728
2729
2730/*
Christian Heimes99170a52007-12-19 02:07:34 +00002731 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2732 * into a char buffer. If you have any inc/def ref to do to the objects that
2733 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002734 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002735 * that it is also possible that we return a number of bytes smaller than the
2736 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002737 *
2738 * 'addr' is a return value for the address object. Note that you must decref
2739 * it yourself.
2740 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002741static Py_ssize_t
2742sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 sock_addr_t addrbuf;
2746 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002747 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 if (!getsockaddrlen(s, &addrlen))
2753 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 if (!IS_SELECTABLE(s)) {
2756 select_error();
2757 return -1;
2758 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002759
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002760 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 Py_BEGIN_ALLOW_THREADS
2762 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002763 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002765#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 n = recvfrom(s->sock_fd, cbuf, len, flags,
2767 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002768#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 n = recvfrom(s->sock_fd, cbuf, len, flags,
2770 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 }
2773 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 if (timeout == 1) {
2776 PyErr_SetString(socket_timeout, "timed out");
2777 return -1;
2778 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002779 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (n < 0) {
2781 s->errorhandler();
2782 return -1;
2783 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2786 addrlen, s->sock_proto)))
2787 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002790}
2791
2792/* s.recvfrom(nbytes [,flags]) method */
2793
2794static PyObject *
2795sock_recvfrom(PySocketSockObject *s, PyObject *args)
2796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 PyObject *buf = NULL;
2798 PyObject *addr = NULL;
2799 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002800 int flags = 0;
2801 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002802
Antoine Pitrou19467d22010-08-17 19:33:30 +00002803 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 if (recvlen < 0) {
2807 PyErr_SetString(PyExc_ValueError,
2808 "negative buffersize in recvfrom");
2809 return NULL;
2810 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2813 if (buf == NULL)
2814 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2817 recvlen, flags, &addr);
2818 if (outlen < 0) {
2819 goto finally;
2820 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 if (outlen != recvlen) {
2823 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002824 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002826 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 goto finally;
2828 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002831
2832finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 Py_XDECREF(buf);
2834 Py_XDECREF(addr);
2835 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002836}
2837
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002838PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002839"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2840\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842
Thomas Wouters477c8d52006-05-27 19:21:47 +00002843
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002844/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002845
2846static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002847sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850
Antoine Pitrou19467d22010-08-17 19:33:30 +00002851 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 Py_buffer pbuf;
2853 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002854 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002857
Antoine Pitrou19467d22010-08-17 19:33:30 +00002858 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 kwlist, &pbuf,
2860 &recvlen, &flags))
2861 return NULL;
2862 buf = pbuf.buf;
2863 buflen = pbuf.len;
2864 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 if (recvlen < 0) {
2867 PyBuffer_Release(&pbuf);
2868 PyErr_SetString(PyExc_ValueError,
2869 "negative buffersize in recvfrom_into");
2870 return NULL;
2871 }
2872 if (recvlen == 0) {
2873 /* If nbytes was not specified, use the buffer's length */
2874 recvlen = buflen;
2875 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2878 if (readlen < 0) {
2879 PyBuffer_Release(&pbuf);
2880 /* Return an error */
2881 Py_XDECREF(addr);
2882 return NULL;
2883 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 PyBuffer_Release(&pbuf);
2886 /* Return the number of bytes read and the address. Note that we do
2887 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002888 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002889}
2890
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002891PyDoc_STRVAR(recvfrom_into_doc,
2892"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002893\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002894Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002895
2896
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002897/* The sendmsg() and recvmsg[_into]() methods require a working
2898 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2899#ifdef CMSG_LEN
2900/*
2901 * Call recvmsg() with the supplied iovec structures, flags, and
2902 * ancillary data buffer size (controllen). Returns the tuple return
2903 * value for recvmsg() or recvmsg_into(), with the first item provided
2904 * by the supplied makeval() function. makeval() will be called with
2905 * the length read and makeval_data as arguments, and must return a
2906 * new reference (which will be decrefed if there is a subsequent
2907 * error). On error, closes any file descriptors received via
2908 * SCM_RIGHTS.
2909 */
2910static PyObject *
2911sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2912 int flags, Py_ssize_t controllen,
2913 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2914{
2915 ssize_t bytes_received = -1;
2916 int timeout;
2917 sock_addr_t addrbuf;
2918 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002919 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002920 PyObject *cmsg_list = NULL, *retval = NULL;
2921 void *controlbuf = NULL;
2922 struct cmsghdr *cmsgh;
2923 size_t cmsgdatalen = 0;
2924 int cmsg_status;
2925
2926 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2927 ignored" when the socket is connected (Linux fills them in
2928 anyway for AF_UNIX sockets at least). Normally msg_namelen
2929 seems to be set to 0 if there's no address, but try to
2930 initialize msg_name to something that won't be mistaken for a
2931 real address if that doesn't happen. */
2932 if (!getsockaddrlen(s, &addrbuflen))
2933 return NULL;
2934 memset(&addrbuf, 0, addrbuflen);
2935 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2936
2937 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2938 PyErr_SetString(PyExc_ValueError,
2939 "invalid ancillary data buffer length");
2940 return NULL;
2941 }
2942 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2943 return PyErr_NoMemory();
2944
2945 /* Make the system call. */
2946 if (!IS_SELECTABLE(s)) {
2947 select_error();
2948 goto finally;
2949 }
2950
2951 BEGIN_SELECT_LOOP(s)
2952 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002953 msg.msg_name = SAS2SA(&addrbuf);
2954 msg.msg_namelen = addrbuflen;
2955 msg.msg_iov = iov;
2956 msg.msg_iovlen = iovlen;
2957 msg.msg_control = controlbuf;
2958 msg.msg_controllen = controllen;
2959 timeout = internal_select_ex(s, 0, interval);
2960 if (!timeout)
2961 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2962 Py_END_ALLOW_THREADS;
2963 if (timeout == 1) {
2964 PyErr_SetString(socket_timeout, "timed out");
2965 goto finally;
2966 }
2967 END_SELECT_LOOP(s)
2968
2969 if (bytes_received < 0) {
2970 s->errorhandler();
2971 goto finally;
2972 }
2973
2974 /* Make list of (level, type, data) tuples from control messages. */
2975 if ((cmsg_list = PyList_New(0)) == NULL)
2976 goto err_closefds;
2977 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2978 implementations didn't do so. */
2979 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2980 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2981 PyObject *bytes, *tuple;
2982 int tmp;
2983
2984 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2985 if (cmsg_status != 0) {
2986 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2987 "received malformed or improperly-truncated "
2988 "ancillary data", 1) == -1)
2989 goto err_closefds;
2990 }
2991 if (cmsg_status < 0)
2992 break;
2993 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002994 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002995 goto err_closefds;
2996 }
2997
2998 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2999 cmsgdatalen);
3000 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3001 (int)cmsgh->cmsg_type, bytes);
3002 if (tuple == NULL)
3003 goto err_closefds;
3004 tmp = PyList_Append(cmsg_list, tuple);
3005 Py_DECREF(tuple);
3006 if (tmp != 0)
3007 goto err_closefds;
3008
3009 if (cmsg_status != 0)
3010 break;
3011 }
3012
3013 retval = Py_BuildValue("NOiN",
3014 (*makeval)(bytes_received, makeval_data),
3015 cmsg_list,
3016 (int)msg.msg_flags,
3017 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3018 ((msg.msg_namelen > addrbuflen) ?
3019 addrbuflen : msg.msg_namelen),
3020 s->sock_proto));
3021 if (retval == NULL)
3022 goto err_closefds;
3023
3024finally:
3025 Py_XDECREF(cmsg_list);
3026 PyMem_Free(controlbuf);
3027 return retval;
3028
3029err_closefds:
3030#ifdef SCM_RIGHTS
3031 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3032 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3033 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3034 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3035 if (cmsg_status < 0)
3036 break;
3037 if (cmsgh->cmsg_level == SOL_SOCKET &&
3038 cmsgh->cmsg_type == SCM_RIGHTS) {
3039 size_t numfds;
3040 int *fdp;
3041
3042 numfds = cmsgdatalen / sizeof(int);
3043 fdp = (int *)CMSG_DATA(cmsgh);
3044 while (numfds-- > 0)
3045 close(*fdp++);
3046 }
3047 if (cmsg_status != 0)
3048 break;
3049 }
3050#endif /* SCM_RIGHTS */
3051 goto finally;
3052}
3053
3054
3055static PyObject *
3056makeval_recvmsg(ssize_t received, void *data)
3057{
3058 PyObject **buf = data;
3059
3060 if (received < PyBytes_GET_SIZE(*buf))
3061 _PyBytes_Resize(buf, received);
3062 Py_XINCREF(*buf);
3063 return *buf;
3064}
3065
3066/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3067
3068static PyObject *
3069sock_recvmsg(PySocketSockObject *s, PyObject *args)
3070{
3071 Py_ssize_t bufsize, ancbufsize = 0;
3072 int flags = 0;
3073 struct iovec iov;
3074 PyObject *buf = NULL, *retval = NULL;
3075
3076 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3077 return NULL;
3078
3079 if (bufsize < 0) {
3080 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3081 return NULL;
3082 }
3083 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3084 return NULL;
3085 iov.iov_base = PyBytes_AS_STRING(buf);
3086 iov.iov_len = bufsize;
3087
3088 /* Note that we're passing a pointer to *our pointer* to the bytes
3089 object here (&buf); makeval_recvmsg() may incref the object, or
3090 deallocate it and set our pointer to NULL. */
3091 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3092 &makeval_recvmsg, &buf);
3093 Py_XDECREF(buf);
3094 return retval;
3095}
3096
3097PyDoc_STRVAR(recvmsg_doc,
3098"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3099\n\
3100Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3101socket. The ancbufsize argument sets the size in bytes of the\n\
3102internal buffer used to receive the ancillary data; it defaults to 0,\n\
3103meaning that no ancillary data will be received. Appropriate buffer\n\
3104sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3105CMSG_LEN(), and items which do not fit into the buffer might be\n\
3106truncated or discarded. The flags argument defaults to 0 and has the\n\
3107same meaning as for recv().\n\
3108\n\
3109The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3110The data item is a bytes object holding the non-ancillary data\n\
3111received. The ancdata item is a list of zero or more tuples\n\
3112(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3113(control messages) received: cmsg_level and cmsg_type are integers\n\
3114specifying the protocol level and protocol-specific type respectively,\n\
3115and cmsg_data is a bytes object holding the associated data. The\n\
3116msg_flags item is the bitwise OR of various flags indicating\n\
3117conditions on the received message; see your system documentation for\n\
3118details. If the receiving socket is unconnected, address is the\n\
3119address of the sending socket, if available; otherwise, its value is\n\
3120unspecified.\n\
3121\n\
3122If recvmsg() raises an exception after the system call returns, it\n\
3123will first attempt to close any file descriptors received via the\n\
3124SCM_RIGHTS mechanism.");
3125
3126
3127static PyObject *
3128makeval_recvmsg_into(ssize_t received, void *data)
3129{
3130 return PyLong_FromSsize_t(received);
3131}
3132
3133/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3134
3135static PyObject *
3136sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3137{
3138 Py_ssize_t ancbufsize = 0;
3139 int flags = 0;
3140 struct iovec *iovs = NULL;
3141 Py_ssize_t i, nitems, nbufs = 0;
3142 Py_buffer *bufs = NULL;
3143 PyObject *buffers_arg, *fast, *retval = NULL;
3144
3145 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3146 &buffers_arg, &ancbufsize, &flags))
3147 return NULL;
3148
3149 if ((fast = PySequence_Fast(buffers_arg,
3150 "recvmsg_into() argument 1 must be an "
3151 "iterable")) == NULL)
3152 return NULL;
3153 nitems = PySequence_Fast_GET_SIZE(fast);
3154 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003155 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003156 goto finally;
3157 }
3158
3159 /* Fill in an iovec for each item, and save the Py_buffer
3160 structs to release afterwards. */
3161 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3162 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3163 PyErr_NoMemory();
3164 goto finally;
3165 }
3166 for (; nbufs < nitems; nbufs++) {
3167 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3168 "w*;recvmsg_into() argument 1 must be an iterable "
3169 "of single-segment read-write buffers",
3170 &bufs[nbufs]))
3171 goto finally;
3172 iovs[nbufs].iov_base = bufs[nbufs].buf;
3173 iovs[nbufs].iov_len = bufs[nbufs].len;
3174 }
3175
3176 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3177 &makeval_recvmsg_into, NULL);
3178finally:
3179 for (i = 0; i < nbufs; i++)
3180 PyBuffer_Release(&bufs[i]);
3181 PyMem_Free(bufs);
3182 PyMem_Free(iovs);
3183 Py_DECREF(fast);
3184 return retval;
3185}
3186
3187PyDoc_STRVAR(recvmsg_into_doc,
3188"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3189\n\
3190Receive normal data and ancillary data from the socket, scattering the\n\
3191non-ancillary data into a series of buffers. The buffers argument\n\
3192must be an iterable of objects that export writable buffers\n\
3193(e.g. bytearray objects); these will be filled with successive chunks\n\
3194of the non-ancillary data until it has all been written or there are\n\
3195no more buffers. The ancbufsize argument sets the size in bytes of\n\
3196the internal buffer used to receive the ancillary data; it defaults to\n\
31970, meaning that no ancillary data will be received. Appropriate\n\
3198buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3199or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3200truncated or discarded. The flags argument defaults to 0 and has the\n\
3201same meaning as for recv().\n\
3202\n\
3203The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3204The nbytes item is the total number of bytes of non-ancillary data\n\
3205written into the buffers. The ancdata item is a list of zero or more\n\
3206tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3207data (control messages) received: cmsg_level and cmsg_type are\n\
3208integers specifying the protocol level and protocol-specific type\n\
3209respectively, and cmsg_data is a bytes object holding the associated\n\
3210data. The msg_flags item is the bitwise OR of various flags\n\
3211indicating conditions on the received message; see your system\n\
3212documentation for details. If the receiving socket is unconnected,\n\
3213address is the address of the sending socket, if available; otherwise,\n\
3214its value is unspecified.\n\
3215\n\
3216If recvmsg_into() raises an exception after the system call returns,\n\
3217it will first attempt to close any file descriptors received via the\n\
3218SCM_RIGHTS mechanism.");
3219#endif /* CMSG_LEN */
3220
3221
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003222/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003223
Guido van Rossum73624e91994-10-10 17:59:00 +00003224static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003225sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003228 Py_ssize_t len, n = -1;
3229 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3233 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 if (!IS_SELECTABLE(s)) {
3236 PyBuffer_Release(&pbuf);
3237 return select_error();
3238 }
3239 buf = pbuf.buf;
3240 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003241
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003242 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003244 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003246#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003248#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003253 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 PyErr_SetString(socket_timeout, "timed out");
3255 return NULL;
3256 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003257 END_SELECT_LOOP(s)
3258
3259 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 if (n < 0)
3261 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003262 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003263}
3264
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003265PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003266"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003267\n\
3268Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003269argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003270sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003271
3272
3273/* s.sendall(data [,flags]) method */
3274
3275static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003276sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003279 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003280 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3284 return NULL;
3285 buf = pbuf.buf;
3286 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 if (!IS_SELECTABLE(s)) {
3289 PyBuffer_Release(&pbuf);
3290 return select_error();
3291 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003294 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 timeout = internal_select(s, 1);
3296 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003297 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003298#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003299 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003300#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003301 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003302#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003303 }
3304 Py_END_ALLOW_THREADS
3305 if (timeout == 1) {
3306 PyBuffer_Release(&pbuf);
3307 PyErr_SetString(socket_timeout, "timed out");
3308 return NULL;
3309 }
3310 /* PyErr_CheckSignals() might change errno */
3311 saved_errno = errno;
3312 /* We must run our signal handlers before looping again.
3313 send() can return a successful partial write when it is
3314 interrupted, so we can't restrict ourselves to EINTR. */
3315 if (PyErr_CheckSignals()) {
3316 PyBuffer_Release(&pbuf);
3317 return NULL;
3318 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003320 /* If interrupted, try again */
3321 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003323 else
3324 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 }
3326 buf += n;
3327 len -= n;
3328 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 if (n < 0)
3332 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 Py_INCREF(Py_None);
3335 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003336}
3337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003338PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003339"sendall(data[, flags])\n\
3340\n\
3341Send a data string to the socket. For the optional flags\n\
3342argument, see the Unix manual. This calls send() repeatedly\n\
3343until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003344to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003345
Guido van Rossum30a685f1991-06-27 15:51:29 +00003346
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003347/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003348
Guido van Rossum73624e91994-10-10 17:59:00 +00003349static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003350sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 Py_buffer pbuf;
3353 PyObject *addro;
3354 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003355 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 sock_addr_t addrbuf;
3357 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003360 arglen = PyTuple_Size(args);
3361 switch (arglen) {
3362 case 2:
3363 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3364 break;
3365 case 3:
3366 PyArg_ParseTuple(args, "y*iO:sendto",
3367 &pbuf, &flags, &addro);
3368 break;
3369 default:
3370 PyErr_Format(PyExc_TypeError,
3371 "sendto() takes 2 or 3 arguments (%d given)",
3372 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003373 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003375 if (PyErr_Occurred())
3376 return NULL;
3377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 buf = pbuf.buf;
3379 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 if (!IS_SELECTABLE(s)) {
3382 PyBuffer_Release(&pbuf);
3383 return select_error();
3384 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3387 PyBuffer_Release(&pbuf);
3388 return NULL;
3389 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003390
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003391 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003393 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 if (!timeout)
3395 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3396 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003399 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 PyErr_SetString(socket_timeout, "timed out");
3401 return NULL;
3402 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003403 END_SELECT_LOOP(s)
3404 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 if (n < 0)
3406 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003407 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003408}
3409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003410PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003411"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003412\n\
3413Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003414For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003415
Guido van Rossum30a685f1991-06-27 15:51:29 +00003416
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003417/* The sendmsg() and recvmsg[_into]() methods require a working
3418 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3419#ifdef CMSG_LEN
3420/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3421
3422static PyObject *
3423sock_sendmsg(PySocketSockObject *s, PyObject *args)
3424{
3425 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3426 Py_buffer *databufs = NULL;
3427 struct iovec *iovs = NULL;
3428 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003429 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003430 struct cmsginfo {
3431 int level;
3432 int type;
3433 Py_buffer data;
3434 } *cmsgs = NULL;
3435 void *controlbuf = NULL;
3436 size_t controllen, controllen_last;
3437 ssize_t bytes_sent = -1;
3438 int addrlen, timeout, flags = 0;
3439 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3440 *cmsg_fast = NULL, *retval = NULL;
3441
3442 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3443 &data_arg, &cmsg_arg, &flags, &addr_arg))
3444 return NULL;
3445
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003446 /* Parse destination address. */
3447 if (addr_arg != NULL && addr_arg != Py_None) {
3448 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3449 goto finally;
3450 msg.msg_name = &addrbuf;
3451 msg.msg_namelen = addrlen;
3452 }
3453
3454 /* Fill in an iovec for each message part, and save the Py_buffer
3455 structs to release afterwards. */
3456 if ((data_fast = PySequence_Fast(data_arg,
3457 "sendmsg() argument 1 must be an "
3458 "iterable")) == NULL)
3459 goto finally;
3460 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3461 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003462 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003463 goto finally;
3464 }
3465 msg.msg_iovlen = ndataparts;
3466 if (ndataparts > 0 &&
3467 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3468 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3469 PyErr_NoMemory();
3470 goto finally;
3471 }
3472 for (; ndatabufs < ndataparts; ndatabufs++) {
3473 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3474 "y*;sendmsg() argument 1 must be an iterable of "
3475 "buffer-compatible objects",
3476 &databufs[ndatabufs]))
3477 goto finally;
3478 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3479 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3480 }
3481
3482 if (cmsg_arg == NULL)
3483 ncmsgs = 0;
3484 else {
3485 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3486 "sendmsg() argument 2 must be an "
3487 "iterable")) == NULL)
3488 goto finally;
3489 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3490 }
3491
3492#ifndef CMSG_SPACE
3493 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003494 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003495 "sending multiple control messages is not supported "
3496 "on this system");
3497 goto finally;
3498 }
3499#endif
3500 /* Save level, type and Py_buffer for each control message,
3501 and calculate total size. */
3502 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3503 PyErr_NoMemory();
3504 goto finally;
3505 }
3506 controllen = controllen_last = 0;
3507 while (ncmsgbufs < ncmsgs) {
3508 size_t bufsize, space;
3509
3510 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3511 "(iiy*):[sendmsg() ancillary data items]",
3512 &cmsgs[ncmsgbufs].level,
3513 &cmsgs[ncmsgbufs].type,
3514 &cmsgs[ncmsgbufs].data))
3515 goto finally;
3516 bufsize = cmsgs[ncmsgbufs++].data.len;
3517
3518#ifdef CMSG_SPACE
3519 if (!get_CMSG_SPACE(bufsize, &space)) {
3520#else
3521 if (!get_CMSG_LEN(bufsize, &space)) {
3522#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003523 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003524 goto finally;
3525 }
3526 controllen += space;
3527 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003528 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003529 goto finally;
3530 }
3531 controllen_last = controllen;
3532 }
3533
3534 /* Construct ancillary data block from control message info. */
3535 if (ncmsgbufs > 0) {
3536 struct cmsghdr *cmsgh = NULL;
3537
3538 if ((msg.msg_control = controlbuf =
3539 PyMem_Malloc(controllen)) == NULL) {
3540 PyErr_NoMemory();
3541 goto finally;
3542 }
3543 msg.msg_controllen = controllen;
3544
3545 /* Need to zero out the buffer as a workaround for glibc's
3546 CMSG_NXTHDR() implementation. After getting the pointer to
3547 the next header, it checks its (uninitialized) cmsg_len
3548 member to see if the "message" fits in the buffer, and
3549 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003550 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003551 memset(controlbuf, 0, controllen);
3552
3553 for (i = 0; i < ncmsgbufs; i++) {
3554 size_t msg_len, data_len = cmsgs[i].data.len;
3555 int enough_space = 0;
3556
3557 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3558 if (cmsgh == NULL) {
3559 PyErr_Format(PyExc_RuntimeError,
3560 "unexpected NULL result from %s()",
3561 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3562 goto finally;
3563 }
3564 if (!get_CMSG_LEN(data_len, &msg_len)) {
3565 PyErr_SetString(PyExc_RuntimeError,
3566 "item size out of range for CMSG_LEN()");
3567 goto finally;
3568 }
3569 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3570 size_t space;
3571
3572 cmsgh->cmsg_len = msg_len;
3573 if (get_cmsg_data_space(&msg, cmsgh, &space))
3574 enough_space = (space >= data_len);
3575 }
3576 if (!enough_space) {
3577 PyErr_SetString(PyExc_RuntimeError,
3578 "ancillary data does not fit in calculated "
3579 "space");
3580 goto finally;
3581 }
3582 cmsgh->cmsg_level = cmsgs[i].level;
3583 cmsgh->cmsg_type = cmsgs[i].type;
3584 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3585 }
3586 }
3587
3588 /* Make the system call. */
3589 if (!IS_SELECTABLE(s)) {
3590 select_error();
3591 goto finally;
3592 }
3593
3594 BEGIN_SELECT_LOOP(s)
3595 Py_BEGIN_ALLOW_THREADS;
3596 timeout = internal_select_ex(s, 1, interval);
3597 if (!timeout)
3598 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3599 Py_END_ALLOW_THREADS;
3600 if (timeout == 1) {
3601 PyErr_SetString(socket_timeout, "timed out");
3602 goto finally;
3603 }
3604 END_SELECT_LOOP(s)
3605
3606 if (bytes_sent < 0) {
3607 s->errorhandler();
3608 goto finally;
3609 }
3610 retval = PyLong_FromSsize_t(bytes_sent);
3611
3612finally:
3613 PyMem_Free(controlbuf);
3614 for (i = 0; i < ncmsgbufs; i++)
3615 PyBuffer_Release(&cmsgs[i].data);
3616 PyMem_Free(cmsgs);
3617 Py_XDECREF(cmsg_fast);
3618 for (i = 0; i < ndatabufs; i++)
3619 PyBuffer_Release(&databufs[i]);
3620 PyMem_Free(databufs);
3621 PyMem_Free(iovs);
3622 Py_XDECREF(data_fast);
3623 return retval;
3624}
3625
3626PyDoc_STRVAR(sendmsg_doc,
3627"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3628\n\
3629Send normal and ancillary data to the socket, gathering the\n\
3630non-ancillary data from a series of buffers and concatenating it into\n\
3631a single message. The buffers argument specifies the non-ancillary\n\
3632data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3633The ancdata argument specifies the ancillary data (control messages)\n\
3634as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3635cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3636protocol level and protocol-specific type respectively, and cmsg_data\n\
3637is a buffer-compatible object holding the associated data. The flags\n\
3638argument defaults to 0 and has the same meaning as for send(). If\n\
3639address is supplied and not None, it sets a destination address for\n\
3640the message. The return value is the number of bytes of non-ancillary\n\
3641data sent.");
3642#endif /* CMSG_LEN */
3643
3644
Guido van Rossum30a685f1991-06-27 15:51:29 +00003645/* s.shutdown(how) method */
3646
Guido van Rossum73624e91994-10-10 17:59:00 +00003647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003648sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 int how;
3651 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003652
Serhiy Storchaka78980432013-01-15 01:12:17 +02003653 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 if (how == -1 && PyErr_Occurred())
3655 return NULL;
3656 Py_BEGIN_ALLOW_THREADS
3657 res = shutdown(s->sock_fd, how);
3658 Py_END_ALLOW_THREADS
3659 if (res < 0)
3660 return s->errorhandler();
3661 Py_INCREF(Py_None);
3662 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003663}
3664
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003665PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003666"shutdown(flag)\n\
3667\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003668Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3669of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003670
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003671#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003672static PyObject*
3673sock_ioctl(PySocketSockObject *s, PyObject *arg)
3674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 unsigned long cmd = SIO_RCVALL;
3676 PyObject *argO;
3677 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3680 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 switch (cmd) {
3683 case SIO_RCVALL: {
3684 unsigned int option = RCVALL_ON;
3685 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3686 return NULL;
3687 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3688 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3689 return set_error();
3690 }
3691 return PyLong_FromUnsignedLong(recv); }
3692 case SIO_KEEPALIVE_VALS: {
3693 struct tcp_keepalive ka;
3694 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3695 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3696 return NULL;
3697 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3698 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3699 return set_error();
3700 }
3701 return PyLong_FromUnsignedLong(recv); }
3702 default:
3703 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3704 return NULL;
3705 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003706}
3707PyDoc_STRVAR(sock_ioctl_doc,
3708"ioctl(cmd, option) -> long\n\
3709\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003710Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3711SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3712SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003713#endif
3714
3715#if defined(MS_WINDOWS)
3716static PyObject*
3717sock_share(PySocketSockObject *s, PyObject *arg)
3718{
3719 WSAPROTOCOL_INFO info;
3720 DWORD processId;
3721 int result;
3722
3723 if (!PyArg_ParseTuple(arg, "I", &processId))
3724 return NULL;
3725
3726 Py_BEGIN_ALLOW_THREADS
3727 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3728 Py_END_ALLOW_THREADS
3729 if (result == SOCKET_ERROR)
3730 return set_error();
3731 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3732}
3733PyDoc_STRVAR(sock_share_doc,
3734"share(process_id) -> bytes\n\
3735\n\
3736Share the socket with another process. The target process id\n\
3737must be provided and the resulting bytes object passed to the target\n\
3738process. There the shared socket can be instantiated by calling\n\
3739socket.fromshare().");
3740
Christian Heimesfaf2f632008-01-06 16:59:19 +00003741
3742#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003743
3744/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003745
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003746static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3748 accept_doc},
3749 {"bind", (PyCFunction)sock_bind, METH_O,
3750 bind_doc},
3751 {"close", (PyCFunction)sock_close, METH_NOARGS,
3752 close_doc},
3753 {"connect", (PyCFunction)sock_connect, METH_O,
3754 connect_doc},
3755 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3756 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003757 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3758 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3760 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003761#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 {"getpeername", (PyCFunction)sock_getpeername,
3763 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 {"getsockname", (PyCFunction)sock_getsockname,
3766 METH_NOARGS, getsockname_doc},
3767 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3768 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003769#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3771 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003772#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003773#if defined(MS_WINDOWS)
3774 {"share", (PyCFunction)sock_share, METH_VARARGS,
3775 sock_share_doc},
3776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003777 {"listen", (PyCFunction)sock_listen, METH_O,
3778 listen_doc},
3779 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3780 recv_doc},
3781 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3782 recv_into_doc},
3783 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3784 recvfrom_doc},
3785 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3786 recvfrom_into_doc},
3787 {"send", (PyCFunction)sock_send, METH_VARARGS,
3788 send_doc},
3789 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3790 sendall_doc},
3791 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3792 sendto_doc},
3793 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3794 setblocking_doc},
3795 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3796 settimeout_doc},
3797 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3798 gettimeout_doc},
3799 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3800 setsockopt_doc},
3801 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3802 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803#ifdef CMSG_LEN
3804 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3805 recvmsg_doc},
3806 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3807 recvmsg_into_doc,},
3808 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3809 sendmsg_doc},
3810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003812};
3813
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003814/* SockObject members */
3815static PyMemberDef sock_memberlist[] = {
3816 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3817 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3818 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3819 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3820 {0},
3821};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003822
Guido van Rossum73624e91994-10-10 17:59:00 +00003823/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003824 First close the file description. */
3825
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003826static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003827sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003828{
Antoine Pitroue033e062010-10-29 10:38:18 +00003829 if (s->sock_fd != -1) {
3830 PyObject *exc, *val, *tb;
3831 Py_ssize_t old_refcount = Py_REFCNT(s);
3832 ++Py_REFCNT(s);
3833 PyErr_Fetch(&exc, &val, &tb);
3834 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3835 "unclosed %R", s))
3836 /* Spurious errors can appear at shutdown */
3837 if (PyErr_ExceptionMatches(PyExc_Warning))
3838 PyErr_WriteUnraisable((PyObject *) s);
3839 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003840 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003841 Py_REFCNT(s) = old_refcount;
3842 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003844}
3845
Guido van Rossum30a685f1991-06-27 15:51:29 +00003846
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003847static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003848sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003849{
Fred Drakea04eaad2000-06-30 02:46:07 +00003850#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 if (s->sock_fd > LONG_MAX) {
3852 /* this can occur on Win64, and actually there is a special
3853 ugly printf formatter for decimal pointer length integer
3854 printing, only bother if necessary*/
3855 PyErr_SetString(PyExc_OverflowError,
3856 "no printf formatter to display "
3857 "the socket descriptor in decimal");
3858 return NULL;
3859 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003861 return PyUnicode_FromFormat(
3862 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3863 (long)s->sock_fd, s->sock_family,
3864 s->sock_type,
3865 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003866}
3867
3868
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003869/* Create a new, uninitialized socket object. */
3870
3871static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003872sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003874 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 new = type->tp_alloc(type, 0);
3877 if (new != NULL) {
3878 ((PySocketSockObject *)new)->sock_fd = -1;
3879 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3880 ((PySocketSockObject *)new)->errorhandler = &set_error;
3881 }
3882 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003883}
3884
3885
3886/* Initialize a new socket object. */
3887
3888/*ARGSUSED*/
3889static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003890sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 PySocketSockObject *s = (PySocketSockObject *)self;
3893 PyObject *fdobj = NULL;
3894 SOCKET_T fd = INVALID_SOCKET;
3895 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3896 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003898 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3899 "|iiiO:socket", keywords,
3900 &family, &type, &proto, &fdobj))
3901 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003904#ifdef MS_WINDOWS
3905 /* recreate a socket that was duplicated */
3906 if (PyBytes_Check(fdobj)) {
3907 WSAPROTOCOL_INFO info;
3908 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3909 PyErr_Format(PyExc_ValueError,
3910 "socket descriptor string has wrong size, "
3911 "should be %zu bytes.", sizeof(info));
3912 return -1;
3913 }
3914 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3915 Py_BEGIN_ALLOW_THREADS
3916 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3917 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3918 Py_END_ALLOW_THREADS
3919 if (fd == INVALID_SOCKET) {
3920 set_error();
3921 return -1;
3922 }
3923 family = info.iAddressFamily;
3924 type = info.iSocketType;
3925 proto = info.iProtocol;
3926 }
3927 else
3928#endif
3929 {
3930 fd = PyLong_AsSocket_t(fdobj);
3931 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3932 return -1;
3933 if (fd == INVALID_SOCKET) {
3934 PyErr_SetString(PyExc_ValueError,
3935 "can't use invalid socket value");
3936 return -1;
3937 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 }
3939 }
3940 else {
3941 Py_BEGIN_ALLOW_THREADS
3942 fd = socket(family, type, proto);
3943 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 if (fd == INVALID_SOCKET) {
3946 set_error();
3947 return -1;
3948 }
3949 }
3950 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003953
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003954}
3955
3956
Guido van Rossumb6775db1994-08-01 11:34:53 +00003957/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003958
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003959static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3961 "_socket.socket", /* tp_name */
3962 sizeof(PySocketSockObject), /* tp_basicsize */
3963 0, /* tp_itemsize */
3964 (destructor)sock_dealloc, /* tp_dealloc */
3965 0, /* tp_print */
3966 0, /* tp_getattr */
3967 0, /* tp_setattr */
3968 0, /* tp_reserved */
3969 (reprfunc)sock_repr, /* tp_repr */
3970 0, /* tp_as_number */
3971 0, /* tp_as_sequence */
3972 0, /* tp_as_mapping */
3973 0, /* tp_hash */
3974 0, /* tp_call */
3975 0, /* tp_str */
3976 PyObject_GenericGetAttr, /* tp_getattro */
3977 0, /* tp_setattro */
3978 0, /* tp_as_buffer */
3979 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3980 sock_doc, /* tp_doc */
3981 0, /* tp_traverse */
3982 0, /* tp_clear */
3983 0, /* tp_richcompare */
3984 0, /* tp_weaklistoffset */
3985 0, /* tp_iter */
3986 0, /* tp_iternext */
3987 sock_methods, /* tp_methods */
3988 sock_memberlist, /* tp_members */
3989 0, /* tp_getset */
3990 0, /* tp_base */
3991 0, /* tp_dict */
3992 0, /* tp_descr_get */
3993 0, /* tp_descr_set */
3994 0, /* tp_dictoffset */
3995 sock_initobj, /* tp_init */
3996 PyType_GenericAlloc, /* tp_alloc */
3997 sock_new, /* tp_new */
3998 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003999};
4000
Guido van Rossum30a685f1991-06-27 15:51:29 +00004001
Guido van Rossum81194471991-07-27 21:42:02 +00004002/* Python interface to gethostname(). */
4003
4004/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004005static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004006socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004007{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004008#ifdef MS_WINDOWS
4009 /* Don't use winsock's gethostname, as this returns the ANSI
4010 version of the hostname, whereas we need a Unicode string.
4011 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004012 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004013 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004014 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004015 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004016
4017 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004018 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004019
4020 if (GetLastError() != ERROR_MORE_DATA)
4021 return PyErr_SetFromWindowsErr(0);
4022
4023 if (size == 0)
4024 return PyUnicode_New(0, 0);
4025
4026 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4027 names */
4028 name = PyMem_Malloc(size * sizeof(wchar_t));
4029 if (!name)
4030 return NULL;
4031 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4032 name,
4033 &size))
4034 {
4035 PyMem_Free(name);
4036 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004037 }
Victor Stinner74168972011-11-17 01:11:36 +01004038
4039 result = PyUnicode_FromWideChar(name, size);
4040 PyMem_Free(name);
4041 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004042#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 char buf[1024];
4044 int res;
4045 Py_BEGIN_ALLOW_THREADS
4046 res = gethostname(buf, (int) sizeof buf - 1);
4047 Py_END_ALLOW_THREADS
4048 if (res < 0)
4049 return set_error();
4050 buf[sizeof buf - 1] = '\0';
4051 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004052#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004053}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004055PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004056"gethostname() -> string\n\
4057\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004058Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004059
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004060#ifdef HAVE_SETHOSTNAME
4061PyDoc_STRVAR(sethostname_doc,
4062"sethostname(name)\n\n\
4063Sets the hostname to name.");
4064
4065static PyObject *
4066socket_sethostname(PyObject *self, PyObject *args)
4067{
4068 PyObject *hnobj;
4069 Py_buffer buf;
4070 int res, flag = 0;
4071
4072 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4073 PyErr_Clear();
4074 if (!PyArg_ParseTuple(args, "O&:sethostname",
4075 PyUnicode_FSConverter, &hnobj))
4076 return NULL;
4077 flag = 1;
4078 }
4079 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4080 if (!res) {
4081 res = sethostname(buf.buf, buf.len);
4082 PyBuffer_Release(&buf);
4083 }
4084 if (flag)
4085 Py_DECREF(hnobj);
4086 if (res)
4087 return set_error();
4088 Py_RETURN_NONE;
4089}
4090#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004091
Guido van Rossum30a685f1991-06-27 15:51:29 +00004092/* Python interface to gethostbyname(name). */
4093
4094/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004095static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004096socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 char *name;
4099 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004100 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004101
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004102 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 return NULL;
4104 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004105 goto finally;
4106 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4107finally:
4108 PyMem_Free(name);
4109 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004110}
4111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004112PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004113"gethostbyname(host) -> address\n\
4114\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004115Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004116
4117
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004118/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4119
4120static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004121gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 char **pch;
4124 PyObject *rtn_tuple = (PyObject *)NULL;
4125 PyObject *name_list = (PyObject *)NULL;
4126 PyObject *addr_list = (PyObject *)NULL;
4127 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 if (h == NULL) {
4130 /* Let's get real error message to return */
4131 set_herror(h_errno);
4132 return NULL;
4133 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 if (h->h_addrtype != af) {
4136 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004137 errno = EAFNOSUPPORT;
4138 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 return NULL;
4140 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 case AF_INET:
4145 if (alen < sizeof(struct sockaddr_in))
4146 return NULL;
4147 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004148
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004149#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 case AF_INET6:
4151 if (alen < sizeof(struct sockaddr_in6))
4152 return NULL;
4153 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004154#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 if ((name_list = PyList_New(0)) == NULL)
4159 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 if ((addr_list = PyList_New(0)) == NULL)
4162 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 /* SF #1511317: h_aliases can be NULL */
4165 if (h->h_aliases) {
4166 for (pch = h->h_aliases; *pch != NULL; pch++) {
4167 int status;
4168 tmp = PyUnicode_FromString(*pch);
4169 if (tmp == NULL)
4170 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 status = PyList_Append(name_list, tmp);
4173 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 if (status)
4176 goto err;
4177 }
4178 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4181 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 case AF_INET:
4186 {
4187 struct sockaddr_in sin;
4188 memset(&sin, 0, sizeof(sin));
4189 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004190#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4194 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 if (pch == h->h_addr_list && alen >= sizeof(sin))
4197 memcpy((char *) addr, &sin, sizeof(sin));
4198 break;
4199 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004200
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004201#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 case AF_INET6:
4203 {
4204 struct sockaddr_in6 sin6;
4205 memset(&sin6, 0, sizeof(sin6));
4206 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004207#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004208 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4211 tmp = makeipaddr((struct sockaddr *)&sin6,
4212 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4215 memcpy((char *) addr, &sin6, sizeof(sin6));
4216 break;
4217 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004218#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004221 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 "unsupported address family");
4223 return NULL;
4224 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 if (tmp == NULL)
4227 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 status = PyList_Append(addr_list, tmp);
4230 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004232 if (status)
4233 goto err;
4234 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004237
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004238 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 Py_XDECREF(name_list);
4240 Py_XDECREF(addr_list);
4241 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004242}
4243
4244
4245/* Python interface to gethostbyname_ex(name). */
4246
4247/*ARGSUSED*/
4248static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004249socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 char *name;
4252 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004253 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004255 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004256#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004258#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004260#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 char buf[16384];
4262 int buf_len = (sizeof buf) - 1;
4263 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004264#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004265#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004267#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004268#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004269
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004270 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004272 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004273 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004275#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004276#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004277 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004279#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004281#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 memset((void *) &data, '\0', sizeof(data));
4283 result = gethostbyname_r(name, &hp_allocated, &data);
4284 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004285#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004286#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004287#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004291#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 Py_END_ALLOW_THREADS
4293 /* Some C libraries would require addr.__ss_family instead of
4294 addr.ss_family.
4295 Therefore, we cast the sockaddr_storage into sockaddr to
4296 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004297 sa = SAS2SA(&addr);
4298 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004299 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004300#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004302#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004303finally:
4304 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004305 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004306}
4307
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004308PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004309"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4310\n\
4311Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004312for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004313
4314
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004315/* Python interface to gethostbyaddr(IP). */
4316
4317/*ARGSUSED*/
4318static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004319socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004320{
Charles-François Natali8b759652011-12-23 16:44:51 +01004321 sock_addr_t addr;
4322 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 char *ip_num;
4324 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004325 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004326#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004328#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004330#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 /* glibcs up to 2.10 assume that the buf argument to
4332 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4333 does not ensure. The attribute below instructs the compiler
4334 to maintain this alignment. */
4335 char buf[16384] Py_ALIGNED(8);
4336 int buf_len = (sizeof buf) - 1;
4337 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004338#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004339#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004340 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004341#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004342#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 char *ap;
4344 int al;
4345 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004346
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004347 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 return NULL;
4349 af = AF_UNSPEC;
4350 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004351 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 af = sa->sa_family;
4353 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004354 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 switch (af) {
4356 case AF_INET:
4357 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4358 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4359 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004360#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 case AF_INET6:
4362 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4363 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4364 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004367 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004368 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 }
4370 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004371#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004372#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004373 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 &hp_allocated, buf, buf_len,
4375 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004376#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 h = gethostbyaddr_r(ap, al, af,
4378 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004379#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 memset((void *) &data, '\0', sizeof(data));
4381 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4382 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004383#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004384#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004385#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004389#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004391 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004392#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004394#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004395finally:
4396 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004398}
4399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004400PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004401"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4402\n\
4403Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004404for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004405
Guido van Rossum30a685f1991-06-27 15:51:29 +00004406
4407/* Python interface to getservbyname(name).
4408 This only returns the port number, since the other info is already
4409 known or not useful (like the list of aliases). */
4410
4411/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004412static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004413socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 char *name, *proto=NULL;
4416 struct servent *sp;
4417 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4418 return NULL;
4419 Py_BEGIN_ALLOW_THREADS
4420 sp = getservbyname(name, proto);
4421 Py_END_ALLOW_THREADS
4422 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004423 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 return NULL;
4425 }
4426 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004427}
4428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004429PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004430"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004431\n\
4432Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004433The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4434otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004435
Guido van Rossum30a685f1991-06-27 15:51:29 +00004436
Barry Warsaw11b91a02004-06-28 00:50:43 +00004437/* Python interface to getservbyport(port).
4438 This only returns the service name, since the other info is already
4439 known or not useful (like the list of aliases). */
4440
4441/*ARGSUSED*/
4442static PyObject *
4443socket_getservbyport(PyObject *self, PyObject *args)
4444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 int port;
4446 char *proto=NULL;
4447 struct servent *sp;
4448 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4449 return NULL;
4450 if (port < 0 || port > 0xffff) {
4451 PyErr_SetString(
4452 PyExc_OverflowError,
4453 "getservbyport: port must be 0-65535.");
4454 return NULL;
4455 }
4456 Py_BEGIN_ALLOW_THREADS
4457 sp = getservbyport(htons((short)port), proto);
4458 Py_END_ALLOW_THREADS
4459 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004460 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 return NULL;
4462 }
4463 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004464}
4465
4466PyDoc_STRVAR(getservbyport_doc,
4467"getservbyport(port[, protocolname]) -> string\n\
4468\n\
4469Return the service name from a port number and protocol name.\n\
4470The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4471otherwise any protocol will match.");
4472
Guido van Rossum3901d851996-12-19 16:35:04 +00004473/* Python interface to getprotobyname(name).
4474 This only returns the protocol number, since the other info is
4475 already known or not useful (like the list of aliases). */
4476
4477/*ARGSUSED*/
4478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004479socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 char *name;
4482 struct protoent *sp;
4483 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4484 return NULL;
4485 Py_BEGIN_ALLOW_THREADS
4486 sp = getprotobyname(name);
4487 Py_END_ALLOW_THREADS
4488 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004489 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 return NULL;
4491 }
4492 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004493}
4494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004495PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004496"getprotobyname(name) -> integer\n\
4497\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004498Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004499
Guido van Rossum3901d851996-12-19 16:35:04 +00004500
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004501#ifndef NO_DUP
4502/* dup() function for socket fds */
4503
4504static PyObject *
4505socket_dup(PyObject *self, PyObject *fdobj)
4506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 SOCKET_T fd, newfd;
4508 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004509
4510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 fd = PyLong_AsSocket_t(fdobj);
4512 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4513 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004515 newfd = dup_socket(fd);
4516 if (newfd == INVALID_SOCKET)
4517 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 newfdobj = PyLong_FromSocket_t(newfd);
4520 if (newfdobj == NULL)
4521 SOCKETCLOSE(newfd);
4522 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004523}
4524
4525PyDoc_STRVAR(dup_doc,
4526"dup(integer) -> integer\n\
4527\n\
4528Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4529sockets; on some platforms os.dup() won't work for socket file descriptors.");
4530#endif
4531
4532
Dave Cole331708b2004-08-09 04:51:41 +00004533#ifdef HAVE_SOCKETPAIR
4534/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004535 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004536 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004537
4538/*ARGSUSED*/
4539static PyObject *
4540socket_socketpair(PyObject *self, PyObject *args)
4541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 PySocketSockObject *s0 = NULL, *s1 = NULL;
4543 SOCKET_T sv[2];
4544 int family, type = SOCK_STREAM, proto = 0;
4545 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004546
4547#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004549#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4553 &family, &type, &proto))
4554 return NULL;
4555 /* Create a pair of socket fds */
4556 if (socketpair(family, type, proto, sv) < 0)
4557 return set_error();
4558 s0 = new_sockobject(sv[0], family, type, proto);
4559 if (s0 == NULL)
4560 goto finally;
4561 s1 = new_sockobject(sv[1], family, type, proto);
4562 if (s1 == NULL)
4563 goto finally;
4564 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004565
4566finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 if (res == NULL) {
4568 if (s0 == NULL)
4569 SOCKETCLOSE(sv[0]);
4570 if (s1 == NULL)
4571 SOCKETCLOSE(sv[1]);
4572 }
4573 Py_XDECREF(s0);
4574 Py_XDECREF(s1);
4575 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004576}
4577
4578PyDoc_STRVAR(socketpair_doc,
4579"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4580\n\
4581Create a pair of socket objects from the sockets returned by the platform\n\
4582socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004583The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004584AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004585
4586#endif /* HAVE_SOCKETPAIR */
4587
4588
Guido van Rossum006bf911996-06-12 04:04:55 +00004589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004590socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4595 return NULL;
4596 }
4597 if (x1 < 0) {
4598 PyErr_SetString(PyExc_OverflowError,
4599 "can't convert negative number to unsigned long");
4600 return NULL;
4601 }
4602 x2 = (unsigned int)ntohs((unsigned short)x1);
4603 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004604}
4605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004606PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004607"ntohs(integer) -> integer\n\
4608\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004609Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004610
4611
Guido van Rossum006bf911996-06-12 04:04:55 +00004612static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004613socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 if (PyLong_Check(arg)) {
4618 x = PyLong_AsUnsignedLong(arg);
4619 if (x == (unsigned long) -1 && PyErr_Occurred())
4620 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004621#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 {
4623 unsigned long y;
4624 /* only want the trailing 32 bits */
4625 y = x & 0xFFFFFFFFUL;
4626 if (y ^ x)
4627 return PyErr_Format(PyExc_OverflowError,
4628 "long int larger than 32 bits");
4629 x = y;
4630 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 }
4633 else
4634 return PyErr_Format(PyExc_TypeError,
4635 "expected int/long, %s found",
4636 Py_TYPE(arg)->tp_name);
4637 if (x == (unsigned long) -1 && PyErr_Occurred())
4638 return NULL;
4639 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004640}
4641
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004642PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004643"ntohl(integer) -> integer\n\
4644\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004645Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004646
4647
Guido van Rossum006bf911996-06-12 04:04:55 +00004648static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004649socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4654 return NULL;
4655 }
4656 if (x1 < 0) {
4657 PyErr_SetString(PyExc_OverflowError,
4658 "can't convert negative number to unsigned long");
4659 return NULL;
4660 }
4661 x2 = (unsigned int)htons((unsigned short)x1);
4662 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004663}
4664
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004665PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004666"htons(integer) -> integer\n\
4667\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004668Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004669
4670
Guido van Rossum006bf911996-06-12 04:04:55 +00004671static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004672socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 if (PyLong_Check(arg)) {
4677 x = PyLong_AsUnsignedLong(arg);
4678 if (x == (unsigned long) -1 && PyErr_Occurred())
4679 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004680#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 {
4682 unsigned long y;
4683 /* only want the trailing 32 bits */
4684 y = x & 0xFFFFFFFFUL;
4685 if (y ^ x)
4686 return PyErr_Format(PyExc_OverflowError,
4687 "long int larger than 32 bits");
4688 x = y;
4689 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 }
4692 else
4693 return PyErr_Format(PyExc_TypeError,
4694 "expected int/long, %s found",
4695 Py_TYPE(arg)->tp_name);
4696 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004697}
4698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004699PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004700"htonl(integer) -> integer\n\
4701\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004702Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004703
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004704/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004705
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004706PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004707"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004708\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004709Convert 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 +00004710binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004711
4712static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004713socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004714{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004715#ifndef INADDR_NONE
4716#define INADDR_NONE (-1)
4717#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004718#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004719 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004720#endif
4721
4722#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004723#if (SIZEOF_INT != 4)
4724#error "Not sure if in_addr_t exists and int is not 32-bits."
4725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 /* Have to use inet_addr() instead */
4727 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4732 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004733
Tim Peters1df9fdd2003-02-13 03:13:40 +00004734
4735#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004736
4737#ifdef USE_INET_ATON_WEAKLINK
4738 if (inet_aton != NULL) {
4739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 if (inet_aton(ip_addr, &buf))
4741 return PyBytes_FromStringAndSize((char *)(&buf),
4742 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004743
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004744 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 "illegal IP address string passed to inet_aton");
4746 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004747
Thomas Wouters477c8d52006-05-27 19:21:47 +00004748#ifdef USE_INET_ATON_WEAKLINK
4749 } else {
4750#endif
4751
4752#endif
4753
4754#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 /* special-case this address as inet_addr might return INADDR_NONE
4757 * for this */
4758 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4759 packed_addr = 0xFFFFFFFF;
4760 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004765 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 "illegal IP address string passed to inet_aton");
4767 return NULL;
4768 }
4769 }
4770 return PyBytes_FromStringAndSize((char *) &packed_addr,
4771 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004772
4773#ifdef USE_INET_ATON_WEAKLINK
4774 }
4775#endif
4776
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004777#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004778}
4779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004780PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004781"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004782\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004783Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004784
4785static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004786socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 char *packed_str;
4789 int addr_len;
4790 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4793 return NULL;
4794 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004797 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 "packed IP wrong length for inet_ntoa");
4799 return NULL;
4800 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004805}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004806
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004807#ifdef HAVE_INET_PTON
4808
4809PyDoc_STRVAR(inet_pton_doc,
4810"inet_pton(af, ip) -> packed IP address string\n\
4811\n\
4812Convert an IP address from string format to a packed string suitable\n\
4813for use with low-level network functions.");
4814
4815static PyObject *
4816socket_inet_pton(PyObject *self, PyObject *args)
4817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 int af;
4819 char* ip;
4820 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004821#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004823#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4827 return NULL;
4828 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004829
Martin v. Löwis04697e82004-06-02 12:35:29 +00004830#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004832 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 "can't use AF_INET6, IPv6 is disabled");
4834 return NULL;
4835 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004836#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 retval = inet_pton(af, ip, packed);
4839 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004840 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 return NULL;
4842 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004843 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 "illegal IP address string passed to inet_pton");
4845 return NULL;
4846 } else if (af == AF_INET) {
4847 return PyBytes_FromStringAndSize(packed,
4848 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004849#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 } else if (af == AF_INET6) {
4851 return PyBytes_FromStringAndSize(packed,
4852 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004855 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 return NULL;
4857 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004858}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004859
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004860PyDoc_STRVAR(inet_ntop_doc,
4861"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4862\n\
4863Convert a packed IP address of the given family to string format.");
4864
4865static PyObject *
4866socket_inet_ntop(PyObject *self, PyObject *args)
4867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 int af;
4869 char* packed;
4870 int len;
4871 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004872#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004874#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004876#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4879 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4882 return NULL;
4883 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 if (af == AF_INET) {
4886 if (len != sizeof(struct in_addr)) {
4887 PyErr_SetString(PyExc_ValueError,
4888 "invalid length of packed IP address string");
4889 return NULL;
4890 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004891#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 } else if (af == AF_INET6) {
4893 if (len != sizeof(struct in6_addr)) {
4894 PyErr_SetString(PyExc_ValueError,
4895 "invalid length of packed IP address string");
4896 return NULL;
4897 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 } else {
4900 PyErr_Format(PyExc_ValueError,
4901 "unknown address family %d", af);
4902 return NULL;
4903 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 retval = inet_ntop(af, packed, ip, sizeof(ip));
4906 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004907 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 return NULL;
4909 } else {
4910 return PyUnicode_FromString(retval);
4911 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 /* NOTREACHED */
4914 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4915 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004916}
4917
4918#endif /* HAVE_INET_PTON */
4919
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004920/* Python interface to getaddrinfo(host, port). */
4921
4922/*ARGSUSED*/
4923static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004924socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004925{
Victor Stinner77af1722011-05-26 14:05:59 +02004926 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004927 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 struct addrinfo hints, *res;
4929 struct addrinfo *res0 = NULL;
4930 PyObject *hobj = NULL;
4931 PyObject *pobj = (PyObject *)NULL;
4932 char pbuf[30];
4933 char *hptr, *pptr;
4934 int family, socktype, protocol, flags;
4935 int error;
4936 PyObject *all = (PyObject *)NULL;
4937 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 family = socktype = protocol = flags = 0;
4940 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004941 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004942 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 &protocol, &flags)) {
4944 return NULL;
4945 }
4946 if (hobj == Py_None) {
4947 hptr = NULL;
4948 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004949 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004950
4951 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 if (!idna)
4953 return NULL;
4954 assert(PyBytes_Check(idna));
4955 hptr = PyBytes_AS_STRING(idna);
4956 } else if (PyBytes_Check(hobj)) {
4957 hptr = PyBytes_AsString(hobj);
4958 } else {
4959 PyErr_SetString(PyExc_TypeError,
4960 "getaddrinfo() argument 1 must be string or None");
4961 return NULL;
4962 }
4963 if (PyLong_CheckExact(pobj)) {
4964 long value = PyLong_AsLong(pobj);
4965 if (value == -1 && PyErr_Occurred())
4966 goto err;
4967 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4968 pptr = pbuf;
4969 } else if (PyUnicode_Check(pobj)) {
4970 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004971 if (pptr == NULL)
4972 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004974 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 } else if (pobj == Py_None) {
4976 pptr = (char *)NULL;
4977 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004978 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 goto err;
4980 }
4981 memset(&hints, 0, sizeof(hints));
4982 hints.ai_family = family;
4983 hints.ai_socktype = socktype;
4984 hints.ai_protocol = protocol;
4985 hints.ai_flags = flags;
4986 Py_BEGIN_ALLOW_THREADS
4987 ACQUIRE_GETADDRINFO_LOCK
4988 error = getaddrinfo(hptr, pptr, &hints, &res0);
4989 Py_END_ALLOW_THREADS
4990 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4991 if (error) {
4992 set_gaierror(error);
4993 goto err;
4994 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 if ((all = PyList_New(0)) == NULL)
4997 goto err;
4998 for (res = res0; res; res = res->ai_next) {
4999 PyObject *single;
5000 PyObject *addr =
5001 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5002 if (addr == NULL)
5003 goto err;
5004 single = Py_BuildValue("iiisO", res->ai_family,
5005 res->ai_socktype, res->ai_protocol,
5006 res->ai_canonname ? res->ai_canonname : "",
5007 addr);
5008 Py_DECREF(addr);
5009 if (single == NULL)
5010 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 if (PyList_Append(all, single))
5013 goto err;
5014 Py_XDECREF(single);
5015 }
5016 Py_XDECREF(idna);
5017 if (res0)
5018 freeaddrinfo(res0);
5019 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005020 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 Py_XDECREF(all);
5022 Py_XDECREF(idna);
5023 if (res0)
5024 freeaddrinfo(res0);
5025 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005026}
5027
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005028PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005029"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5030 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005031\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005032Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005033
5034/* Python interface to getnameinfo(sa, flags). */
5035
5036/*ARGSUSED*/
5037static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005038socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 PyObject *sa = (PyObject *)NULL;
5041 int flags;
5042 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005043 int port;
5044 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5046 struct addrinfo hints, *res = NULL;
5047 int error;
5048 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 flags = flowinfo = scope_id = 0;
5051 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5052 return NULL;
5053 if (!PyTuple_Check(sa)) {
5054 PyErr_SetString(PyExc_TypeError,
5055 "getnameinfo() argument 1 must be a tuple");
5056 return NULL;
5057 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005058 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 &hostp, &port, &flowinfo, &scope_id))
5060 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005061 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005062 PyErr_SetString(PyExc_OverflowError,
5063 "getsockaddrarg: flowinfo must be 0-1048575.");
5064 return NULL;
5065 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5067 memset(&hints, 0, sizeof(hints));
5068 hints.ai_family = AF_UNSPEC;
5069 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005070 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 Py_BEGIN_ALLOW_THREADS
5072 ACQUIRE_GETADDRINFO_LOCK
5073 error = getaddrinfo(hostp, pbuf, &hints, &res);
5074 Py_END_ALLOW_THREADS
5075 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5076 if (error) {
5077 set_gaierror(error);
5078 goto fail;
5079 }
5080 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005081 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 "sockaddr resolved to multiple addresses");
5083 goto fail;
5084 }
5085 switch (res->ai_family) {
5086 case AF_INET:
5087 {
5088 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005089 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 "IPv4 sockaddr must be 2 tuple");
5091 goto fail;
5092 }
5093 break;
5094 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005095#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 case AF_INET6:
5097 {
5098 struct sockaddr_in6 *sin6;
5099 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005100 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 sin6->sin6_scope_id = scope_id;
5102 break;
5103 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005106 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5108 if (error) {
5109 set_gaierror(error);
5110 goto fail;
5111 }
5112 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005113
5114fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 if (res)
5116 freeaddrinfo(res);
5117 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005118}
5119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005120PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005121"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005122\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005123Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005124
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005125
5126/* Python API to getting and setting the default timeout value. */
5127
5128static PyObject *
5129socket_getdefaulttimeout(PyObject *self)
5130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 if (defaulttimeout < 0.0) {
5132 Py_INCREF(Py_None);
5133 return Py_None;
5134 }
5135 else
5136 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005137}
5138
5139PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005140"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005141\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005142Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005143A value of None indicates that new socket objects have no timeout.\n\
5144When the socket module is first imported, the default is None.");
5145
5146static PyObject *
5147socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 if (arg == Py_None)
5152 timeout = -1.0;
5153 else {
5154 timeout = PyFloat_AsDouble(arg);
5155 if (timeout < 0.0) {
5156 if (!PyErr_Occurred())
5157 PyErr_SetString(PyExc_ValueError,
5158 "Timeout value out of range");
5159 return NULL;
5160 }
5161 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 Py_INCREF(Py_None);
5166 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005167}
5168
5169PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005170"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005171\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005172Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005173A value of None indicates that new socket objects have no timeout.\n\
5174When the socket module is first imported, the default is None.");
5175
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005176#ifdef HAVE_IF_NAMEINDEX
5177/* Python API for getting interface indices and names */
5178
5179static PyObject *
5180socket_if_nameindex(PyObject *self, PyObject *arg)
5181{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005182 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005183 int i;
5184 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005185
Charles-François Natali60713592011-05-20 16:55:06 +02005186 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005187 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005188 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005189 return NULL;
5190 }
5191
5192 list = PyList_New(0);
5193 if (list == NULL) {
5194 if_freenameindex(ni);
5195 return NULL;
5196 }
5197
Charles-François Natali60713592011-05-20 16:55:06 +02005198 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5199 PyObject *ni_tuple = Py_BuildValue("IO&",
5200 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005201
5202 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5203 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005204 Py_DECREF(list);
5205 if_freenameindex(ni);
5206 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005207 }
5208 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005209 }
5210
5211 if_freenameindex(ni);
5212 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005213}
5214
5215PyDoc_STRVAR(if_nameindex_doc,
5216"if_nameindex()\n\
5217\n\
5218Returns a list of network interface information (index, name) tuples.");
5219
Charles-François Natali60713592011-05-20 16:55:06 +02005220static PyObject *
5221socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005222{
Charles-François Natali60713592011-05-20 16:55:06 +02005223 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005224 unsigned long index;
5225
Charles-François Natali60713592011-05-20 16:55:06 +02005226 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5227 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005228 return NULL;
5229
Charles-François Natali60713592011-05-20 16:55:06 +02005230 index = if_nametoindex(PyBytes_AS_STRING(oname));
5231 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005232 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005233 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005234 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005235 return NULL;
5236 }
5237
5238 return PyLong_FromUnsignedLong(index);
5239}
5240
5241PyDoc_STRVAR(if_nametoindex_doc,
5242"if_nametoindex(if_name)\n\
5243\n\
5244Returns the interface index corresponding to the interface name if_name.");
5245
Charles-François Natali60713592011-05-20 16:55:06 +02005246static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005247socket_if_indextoname(PyObject *self, PyObject *arg)
5248{
Charles-François Natali60713592011-05-20 16:55:06 +02005249 unsigned long index;
5250 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005251
Charles-François Natali60713592011-05-20 16:55:06 +02005252 index = PyLong_AsUnsignedLong(arg);
5253 if (index == (unsigned long) -1)
5254 return NULL;
5255
5256 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005257 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005258 return NULL;
5259 }
5260
Charles-François Natali60713592011-05-20 16:55:06 +02005261 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005262}
5263
5264PyDoc_STRVAR(if_indextoname_doc,
5265"if_indextoname(if_index)\n\
5266\n\
5267Returns the interface name corresponding to the interface index if_index.");
5268
5269#endif /* HAVE_IF_NAMEINDEX */
5270
5271
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005272#ifdef CMSG_LEN
5273/* Python interface to CMSG_LEN(length). */
5274
5275static PyObject *
5276socket_CMSG_LEN(PyObject *self, PyObject *args)
5277{
5278 Py_ssize_t length;
5279 size_t result;
5280
5281 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5282 return NULL;
5283 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5284 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5285 return NULL;
5286 }
5287 return PyLong_FromSize_t(result);
5288}
5289
5290PyDoc_STRVAR(CMSG_LEN_doc,
5291"CMSG_LEN(length) -> control message length\n\
5292\n\
5293Return the total length, without trailing padding, of an ancillary\n\
5294data item with associated data of the given length. This value can\n\
5295often be used as the buffer size for recvmsg() to receive a single\n\
5296item of ancillary data, but RFC 3542 requires portable applications to\n\
5297use CMSG_SPACE() and thus include space for padding, even when the\n\
5298item will be the last in the buffer. Raises OverflowError if length\n\
5299is outside the permissible range of values.");
5300
5301
5302#ifdef CMSG_SPACE
5303/* Python interface to CMSG_SPACE(length). */
5304
5305static PyObject *
5306socket_CMSG_SPACE(PyObject *self, PyObject *args)
5307{
5308 Py_ssize_t length;
5309 size_t result;
5310
5311 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5312 return NULL;
5313 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5314 PyErr_SetString(PyExc_OverflowError,
5315 "CMSG_SPACE() argument out of range");
5316 return NULL;
5317 }
5318 return PyLong_FromSize_t(result);
5319}
5320
5321PyDoc_STRVAR(CMSG_SPACE_doc,
5322"CMSG_SPACE(length) -> buffer size\n\
5323\n\
5324Return the buffer size needed for recvmsg() to receive an ancillary\n\
5325data item with associated data of the given length, along with any\n\
5326trailing padding. The buffer space needed to receive multiple items\n\
5327is the sum of the CMSG_SPACE() values for their associated data\n\
5328lengths. Raises OverflowError if length is outside the permissible\n\
5329range of values.");
5330#endif /* CMSG_SPACE */
5331#endif /* CMSG_LEN */
5332
5333
Guido van Rossum30a685f1991-06-27 15:51:29 +00005334/* List of functions exported by this module. */
5335
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005336static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 {"gethostbyname", socket_gethostbyname,
5338 METH_VARARGS, gethostbyname_doc},
5339 {"gethostbyname_ex", socket_gethostbyname_ex,
5340 METH_VARARGS, ghbn_ex_doc},
5341 {"gethostbyaddr", socket_gethostbyaddr,
5342 METH_VARARGS, gethostbyaddr_doc},
5343 {"gethostname", socket_gethostname,
5344 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005345#ifdef HAVE_SETHOSTNAME
5346 {"sethostname", socket_sethostname,
5347 METH_VARARGS, sethostname_doc},
5348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 {"getservbyname", socket_getservbyname,
5350 METH_VARARGS, getservbyname_doc},
5351 {"getservbyport", socket_getservbyport,
5352 METH_VARARGS, getservbyport_doc},
5353 {"getprotobyname", socket_getprotobyname,
5354 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005355#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 {"dup", socket_dup,
5357 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005358#endif
Dave Cole331708b2004-08-09 04:51:41 +00005359#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 {"socketpair", socket_socketpair,
5361 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 {"ntohs", socket_ntohs,
5364 METH_VARARGS, ntohs_doc},
5365 {"ntohl", socket_ntohl,
5366 METH_O, ntohl_doc},
5367 {"htons", socket_htons,
5368 METH_VARARGS, htons_doc},
5369 {"htonl", socket_htonl,
5370 METH_O, htonl_doc},
5371 {"inet_aton", socket_inet_aton,
5372 METH_VARARGS, inet_aton_doc},
5373 {"inet_ntoa", socket_inet_ntoa,
5374 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005375#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 {"inet_pton", socket_inet_pton,
5377 METH_VARARGS, inet_pton_doc},
5378 {"inet_ntop", socket_inet_ntop,
5379 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005380#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005381 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5382 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 {"getnameinfo", socket_getnameinfo,
5384 METH_VARARGS, getnameinfo_doc},
5385 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5386 METH_NOARGS, getdefaulttimeout_doc},
5387 {"setdefaulttimeout", socket_setdefaulttimeout,
5388 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005389#ifdef HAVE_IF_NAMEINDEX
5390 {"if_nameindex", socket_if_nameindex,
5391 METH_NOARGS, if_nameindex_doc},
5392 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005393 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005394 {"if_indextoname", socket_if_indextoname,
5395 METH_O, if_indextoname_doc},
5396#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005397#ifdef CMSG_LEN
5398 {"CMSG_LEN", socket_CMSG_LEN,
5399 METH_VARARGS, CMSG_LEN_doc},
5400#ifdef CMSG_SPACE
5401 {"CMSG_SPACE", socket_CMSG_SPACE,
5402 METH_VARARGS, CMSG_SPACE_doc},
5403#endif
5404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005406};
5407
Guido van Rossum30a685f1991-06-27 15:51:29 +00005408
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005409#ifdef MS_WINDOWS
5410#define OS_INIT_DEFINED
5411
5412/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005413
5414static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005415os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005418}
5419
5420static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005421os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 WSADATA WSAData;
5424 int ret;
5425 ret = WSAStartup(0x0101, &WSAData);
5426 switch (ret) {
5427 case 0: /* No error */
5428 Py_AtExit(os_cleanup);
5429 return 1; /* Success */
5430 case WSASYSNOTREADY:
5431 PyErr_SetString(PyExc_ImportError,
5432 "WSAStartup failed: network not ready");
5433 break;
5434 case WSAVERNOTSUPPORTED:
5435 case WSAEINVAL:
5436 PyErr_SetString(
5437 PyExc_ImportError,
5438 "WSAStartup failed: requested version not supported");
5439 break;
5440 default:
5441 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5442 break;
5443 }
5444 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005445}
5446
Guido van Rossum8d665e61996-06-26 18:22:49 +00005447#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005448
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005449
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005450
5451#ifndef OS_INIT_DEFINED
5452static int
5453os_init(void)
5454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005456}
5457#endif
5458
5459
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005460/* C API table - always add new things to the end for binary
5461 compatibility. */
5462static
5463PySocketModule_APIObject PySocketModuleAPI =
5464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005466 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005468};
5469
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005470
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005471/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005472
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005473 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005474 "socket.py" which implements some additional functionality.
5475 The import of "_socket" may fail with an ImportError exception if
5476 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005477 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005478 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005479*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005481PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005482"Implementation module for socket operations.\n\
5483\n\
5484See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005485
Martin v. Löwis1a214512008-06-11 05:26:20 +00005486static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 PyModuleDef_HEAD_INIT,
5488 PySocket_MODULE_NAME,
5489 socket_doc,
5490 -1,
5491 socket_methods,
5492 NULL,
5493 NULL,
5494 NULL,
5495 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005496};
5497
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005498PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005499PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 if (!os_init())
5504 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 Py_TYPE(&sock_type) = &PyType_Type;
5507 m = PyModule_Create(&socketmodule);
5508 if (m == NULL)
5509 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005510
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005511 Py_INCREF(PyExc_OSError);
5512 PySocketModuleAPI.error = PyExc_OSError;
5513 Py_INCREF(PyExc_OSError);
5514 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005516 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 if (socket_herror == NULL)
5518 return NULL;
5519 Py_INCREF(socket_herror);
5520 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005521 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 NULL);
5523 if (socket_gaierror == NULL)
5524 return NULL;
5525 Py_INCREF(socket_gaierror);
5526 PyModule_AddObject(m, "gaierror", socket_gaierror);
5527 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005528 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 if (socket_timeout == NULL)
5530 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005531 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 Py_INCREF(socket_timeout);
5533 PyModule_AddObject(m, "timeout", socket_timeout);
5534 Py_INCREF((PyObject *)&sock_type);
5535 if (PyModule_AddObject(m, "SocketType",
5536 (PyObject *)&sock_type) != 0)
5537 return NULL;
5538 Py_INCREF((PyObject *)&sock_type);
5539 if (PyModule_AddObject(m, "socket",
5540 (PyObject *)&sock_type) != 0)
5541 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005542
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005543#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005545#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 Py_INCREF(has_ipv6);
5549 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 /* Export C API */
5552 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5553 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5554 ) != 0)
5555 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005558#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005559 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005560#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005561 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005562#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005563 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005564#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005565#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005566 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005567#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005568#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005570 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005571#endif
5572#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005573 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005574#endif
5575#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005577 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005578#endif
5579#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005581 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005582#endif
5583#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005585 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005586#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005587#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005589 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005590#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005591#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005593 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005594#endif
5595#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005597 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005598#endif
5599#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005600 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005601#endif
5602#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005604 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005605#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005606#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005608 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005609#endif
5610#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005612 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005613#endif
5614#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005616 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005617#endif
5618#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005620 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005621#endif
5622#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005624 PyModule_AddIntMacro(m, AF_NETLINK);
5625 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005626#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005627 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005628#endif
5629#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005630 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005631#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005632 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5633 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005634#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005635 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005636#endif
5637#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005638 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005639#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005640#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005641 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005642#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005643#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005644 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005645#endif
5646#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005647 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005648#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005649 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005650#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005651 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005652#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005653#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005654 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005655#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005656#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005657#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005659 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005660#endif
5661#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005663 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005664#endif
5665#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005667 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005668#endif
5669#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005671 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005672#endif
5673#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005675 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005676#endif
5677#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005679 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005680#endif
5681#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005683 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005684#endif
5685#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005687 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005688#endif
5689#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005691 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005692#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005693
Hye-Shik Chang81268602004-02-02 06:05:24 +00005694#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005695 PyModule_AddIntMacro(m, AF_BLUETOOTH);
5696 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
5697 PyModule_AddIntMacro(m, BTPROTO_HCI);
5698 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005699#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005700 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005701#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005702#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005703#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005704 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005705#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005706 PyModule_AddIntMacro(m, HCI_DATA_DIR);
5707 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005708#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005709 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5711 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005712#endif
5713
Charles-François Natali47413c12011-10-06 19:47:44 +02005714#ifdef AF_CAN
5715 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005716 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005717#endif
5718#ifdef PF_CAN
5719 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005720 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02005721#endif
5722
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005723/* Reliable Datagram Sockets */
5724#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005725 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005726#endif
5727#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005728 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005729#endif
5730
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005731/* Kernel event messages */
5732#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005733 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005734#endif
5735#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005736 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005737#endif
5738
Antoine Pitroub156a462010-10-27 20:13:57 +00005739#ifdef AF_PACKET
5740 PyModule_AddIntMacro(m, AF_PACKET);
5741#endif
5742#ifdef PF_PACKET
5743 PyModule_AddIntMacro(m, PF_PACKET);
5744#endif
5745#ifdef PACKET_HOST
5746 PyModule_AddIntMacro(m, PACKET_HOST);
5747#endif
5748#ifdef PACKET_BROADCAST
5749 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5750#endif
5751#ifdef PACKET_MULTICAST
5752 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5753#endif
5754#ifdef PACKET_OTHERHOST
5755 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5756#endif
5757#ifdef PACKET_OUTGOING
5758 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5759#endif
5760#ifdef PACKET_LOOPBACK
5761 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5762#endif
5763#ifdef PACKET_FASTROUTE
5764 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005765#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005766
Christian Heimes043d6f62008-01-07 17:19:16 +00005767#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005768 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005771 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
5772 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
5773 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005774
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005775 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
5776 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
5777 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005780 PyModule_AddIntMacro(m, SOL_TIPC);
5781 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
5782 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
5783 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
5784 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005785
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005786 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
5787 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
5788 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
5789 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005792 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
5793 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005794#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005796 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005797#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005798 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
5799 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
5800 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
5801 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
5802 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
5803 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005804#endif
5805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005807 PyModule_AddIntMacro(m, SOCK_STREAM);
5808 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005809/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005810 PyModule_AddIntMacro(m, SOCK_RAW);
5811 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005812#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005813 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005814#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005815#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005816 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00005817#endif
5818#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005819 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00005820#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005823 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005826 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005829 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005830#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005831#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005832 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005833#endif
5834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005836 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005839 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005842 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005844#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005845 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005848 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005851 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005854 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005857 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005860 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005863 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005866 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005869 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005872 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005875 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005878 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005881 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005882#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005883#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005884 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005885#endif
5886#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005887 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005888#endif
5889#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005890 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005891#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005892#ifdef SO_BINDTODEVICE
5893 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5894#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 /* Maximum number of connections for "listen" */
5897#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005898 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005899#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005901#endif
5902
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005903 /* Ancilliary message types */
5904#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005905 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005906#endif
5907#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005908 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005909#endif
5910#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005911 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005912#endif
5913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 /* Flags for send, recv */
5915#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005916 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005919 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005922 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005925 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005928 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005931 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005934 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005937 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005940 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005943 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005944#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005945#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005946 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005947#endif
5948#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005949 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005950#endif
5951#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005952 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005953#endif
5954#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005955 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005956#endif
5957#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005958 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005959#endif
5960#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005961 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005962#endif
5963#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005964 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005965#endif
5966#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005967 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005968#endif
5969#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005970 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005971#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05005972#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005973 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05005974#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 /* Protocol level and numbers, usable for [gs]etsockopt */
5977#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005978 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005982#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005986 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005989 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005992 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005995 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005998 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006001 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006002#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006006 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006007#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006009#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006010#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006011 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006012#endif
6013#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006014 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6015 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006016#endif
6017#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006018 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6019 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6020 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006021
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006022 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6023 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6024 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006025#endif
6026#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006027 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6028 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6029 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6030 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006031#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006032#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006033 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006034 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6035 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6036 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6037 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6038 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6039 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6040 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6041 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6042 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6043 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6044 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6045 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6046#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006047#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006048 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006049#endif
6050#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006051 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006052#endif
6053#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006054 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006055#endif
6056#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006058#endif
6059#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006060 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006061#endif
6062#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006063 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006064#endif
6065#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006066 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006069 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006070#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006075#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006077 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006078#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006082 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006085 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006088 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006091 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006094 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006097 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006098#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006102 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006105 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006108 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006113 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006116 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006119 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006122 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006125 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006128 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006129#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006131 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006134 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006137 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006140 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006146 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006152 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006155 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006161 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006164 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006171#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006172#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006173 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006176 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006177#endif
6178/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006180 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006181#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006186#endif
6187
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006188#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006190#endif
6191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 /* Some port configuration */
6193#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006194 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006195#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006200#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006202#endif
6203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 /* Some reserved IP v.4 addresses */
6205#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006207#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006212#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006216 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006217#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006221 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006222#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225#ifdef INADDR_ALLHOSTS_GROUP
6226 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6227 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006228#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006232 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006233#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006238#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006240#endif
6241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 /* IPv4 [gs]etsockopt options */
6243#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006244 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006250 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006256 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006259 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006268 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006274 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006277 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006290#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006291#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006293#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6296#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006303 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006306 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006315#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006319#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006321#endif
6322#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006324#endif
6325#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006327#endif
6328#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006330#endif
6331#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006333#endif
6334#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006336#endif
6337#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006339#endif
6340#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006342#endif
6343#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006345#endif
6346#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006348#endif
6349#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006351#endif
6352#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006354#endif
6355#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006357#endif
6358#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006359 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006360#endif
6361#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006363#endif
6364#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006365 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006366#endif
6367#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006369#endif
6370#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006371 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006372#endif
6373#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006374 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006375#endif
6376#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006378#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 /* TCP options */
6381#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006385 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006388 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006391 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006394 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006416#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006417#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006419#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 /* IPX options */
6422#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006424#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006425
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006426/* Reliable Datagram Sockets */
6427#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006429#endif
6430#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006432#endif
6433#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006434 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006435#endif
6436#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006437 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006438#endif
6439#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006440 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006441#endif
6442#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006443 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006444#endif
6445#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006446 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006447#endif
6448#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006449 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006450#endif
6451#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006452 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006453#endif
6454#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006455 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006456#endif
6457#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006458 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006459#endif
6460#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006461 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006462#endif
6463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006465#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006467#endif
6468#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006469 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006470#endif
6471#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006472 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006473#endif
6474#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006476#endif
6477#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006478 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006479#endif
6480#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006481 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006482#endif
6483#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006485#endif
6486#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006488#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006489#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006491#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006492#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006494#endif
6495#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006497#endif
6498#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006500#endif
6501#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006503#endif
6504#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006505 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006506#endif
6507#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006508 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006509#endif
6510#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006512#endif
6513#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006515#endif
6516#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006517 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006518#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006519#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006521#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006522#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006524#endif
6525#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006527#endif
6528#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006530#endif
6531#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006533#endif
6534#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006536#endif
6537#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006539#endif
6540#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006542#endif
6543#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006545#endif
6546#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006548#endif
6549#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006551#endif
6552#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006554#endif
6555#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006557#endif
6558#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006560#endif
6561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006563#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006565#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006567#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006569#endif
6570#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006572#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006576#endif
6577#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006579#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006581#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006583#endif
6584
Christian Heimesfaf2f632008-01-06 16:59:19 +00006585#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 {
6587 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6588 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6589 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006590 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyObject *tmp;
6592 tmp = PyLong_FromUnsignedLong(codes[i]);
6593 if (tmp == NULL)
6594 return NULL;
6595 PyModule_AddObject(m, names[i], tmp);
6596 }
6597 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006598 PyModule_AddIntMacro(m, RCVALL_OFF);
6599 PyModule_AddIntMacro(m, RCVALL_ON);
6600 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006601#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006603#endif
6604#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006606#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006607#endif /* _MSTCPIP_ */
6608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006610#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006614}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006615
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006616
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006617#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006618#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006619
6620/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006621/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006622
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006623int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006624inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006627#if (SIZEOF_INT != 4)
6628#error "Not sure if in_addr_t exists and int is not 32-bits."
6629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 unsigned int packed_addr;
6631 packed_addr = inet_addr(src);
6632 if (packed_addr == INADDR_NONE)
6633 return 0;
6634 memcpy(dst, &packed_addr, 4);
6635 return 1;
6636 }
6637 /* Should set errno to EAFNOSUPPORT */
6638 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006639}
6640
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006641const char *
6642inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 if (af == AF_INET) {
6645 struct in_addr packed_addr;
6646 if (size < 16)
6647 /* Should set errno to ENOSPC. */
6648 return NULL;
6649 memcpy(&packed_addr, src, sizeof(packed_addr));
6650 return strncpy(dst, inet_ntoa(packed_addr), size);
6651 }
6652 /* Should set errno to EAFNOSUPPORT */
6653 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006654}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006655
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006656#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006657#endif