blob: 326299942bb350b0eada3c9a658260b599cca0ff [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;
1607 addr = (struct sockaddr_can *)addr_ret;
1608 Py_ssize_t len;
1609
1610 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1611 &interfaceName))
1612 return 0;
1613
1614 len = PyBytes_GET_SIZE(interfaceName);
1615
1616 if (len == 0) {
1617 ifr.ifr_ifindex = 0;
1618 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001619 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1620 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001621 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1622 s->errorhandler();
1623 Py_DECREF(interfaceName);
1624 return 0;
1625 }
1626 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001627 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001628 "AF_CAN interface name too long");
1629 Py_DECREF(interfaceName);
1630 return 0;
1631 }
1632
1633 addr->can_family = AF_CAN;
1634 addr->can_ifindex = ifr.ifr_ifindex;
1635
1636 *len_ret = sizeof(*addr);
1637 Py_DECREF(interfaceName);
1638 return 1;
1639 }
1640 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001641 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001642 "getsockaddrarg: unsupported CAN protocol");
1643 return 0;
1644 }
1645#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001646
1647#ifdef PF_SYSTEM
1648 case PF_SYSTEM:
1649 switch (s->sock_proto) {
1650#ifdef SYSPROTO_CONTROL
1651 case SYSPROTO_CONTROL:
1652 {
1653 struct sockaddr_ctl *addr;
1654
1655 addr = (struct sockaddr_ctl *)addr_ret;
1656 addr->sc_family = AF_SYSTEM;
1657 addr->ss_sysaddr = AF_SYS_CONTROL;
1658
1659 if (PyUnicode_Check(args)) {
1660 struct ctl_info info;
1661 PyObject *ctl_name;
1662
1663 if (!PyArg_Parse(args, "O&",
1664 PyUnicode_FSConverter, &ctl_name)) {
1665 return 0;
1666 }
1667
1668 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1669 PyErr_SetString(PyExc_ValueError,
1670 "provided string is too long");
1671 Py_DECREF(ctl_name);
1672 return 0;
1673 }
1674 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1675 sizeof(info.ctl_name));
1676 Py_DECREF(ctl_name);
1677
1678 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1679 PyErr_SetString(PyExc_OSError,
1680 "cannot find kernel control with provided name");
1681 return 0;
1682 }
1683
1684 addr->sc_id = info.ctl_id;
1685 addr->sc_unit = 0;
1686 } else if (!PyArg_ParseTuple(args, "II",
1687 &(addr->sc_id), &(addr->sc_unit))) {
1688 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1689 "expected str or tuple of two ints");
1690
1691 return 0;
1692 }
1693
1694 *len_ret = sizeof(*addr);
1695 return 1;
1696 }
1697#endif
1698 default:
1699 PyErr_SetString(PyExc_OSError,
1700 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1701 return 0;
1702 }
1703#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001708 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001712}
1713
Guido van Rossum30a685f1991-06-27 15:51:29 +00001714
Guido van Rossum48a680c2001-03-02 06:34:14 +00001715/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001716 Return 1 if the family is known, 0 otherwise. The length is returned
1717 through len_ret. */
1718
1719static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001720getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001723
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001724#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 case AF_UNIX:
1726 {
1727 *len_ret = sizeof (struct sockaddr_un);
1728 return 1;
1729 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001730#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001731#if defined(AF_NETLINK)
1732 case AF_NETLINK:
1733 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 *len_ret = sizeof (struct sockaddr_nl);
1735 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001736 }
1737#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001738
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001739#ifdef AF_RDS
1740 case AF_RDS:
1741 /* RDS sockets use sockaddr_in: fall-through */
1742#endif
1743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 case AF_INET:
1745 {
1746 *len_ret = sizeof (struct sockaddr_in);
1747 return 1;
1748 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001749
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001750#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 case AF_INET6:
1752 {
1753 *len_ret = sizeof (struct sockaddr_in6);
1754 return 1;
1755 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001756#endif
1757
Hye-Shik Chang81268602004-02-02 06:05:24 +00001758#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 case AF_BLUETOOTH:
1760 {
1761 switch(s->sock_proto)
1762 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 case BTPROTO_L2CAP:
1765 *len_ret = sizeof (struct sockaddr_l2);
1766 return 1;
1767 case BTPROTO_RFCOMM:
1768 *len_ret = sizeof (struct sockaddr_rc);
1769 return 1;
1770 case BTPROTO_HCI:
1771 *len_ret = sizeof (struct sockaddr_hci);
1772 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001773#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 case BTPROTO_SCO:
1775 *len_ret = sizeof (struct sockaddr_sco);
1776 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001779 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 "unknown BT protocol");
1781 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 }
1784 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001785#endif
1786
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001787#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 case AF_PACKET:
1789 {
1790 *len_ret = sizeof (struct sockaddr_ll);
1791 return 1;
1792 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001793#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001794
Christian Heimes043d6f62008-01-07 17:19:16 +00001795#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 case AF_TIPC:
1797 {
1798 *len_ret = sizeof (struct sockaddr_tipc);
1799 return 1;
1800 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001801#endif
1802
Charles-François Natali30589c92011-10-07 22:47:08 +02001803#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001804 case AF_CAN:
1805 {
1806 *len_ret = sizeof (struct sockaddr_can);
1807 return 1;
1808 }
1809#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001810
1811#ifdef PF_SYSTEM
1812 case PF_SYSTEM:
1813 switch(s->sock_proto) {
1814#ifdef SYSPROTO_CONTROL
1815 case SYSPROTO_CONTROL:
1816 *len_ret = sizeof (struct sockaddr_ctl);
1817 return 1;
1818#endif
1819 default:
1820 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1821 "unknown PF_SYSTEM protocol");
1822 return 0;
1823 }
1824#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001829 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001833}
1834
1835
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001836/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1837 Currently, these methods are only compiled if the RFC 2292/3542
1838 CMSG_LEN() macro is available. Older systems seem to have used
1839 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1840 it may be possible to define CMSG_LEN() that way if it's not
1841 provided. Some architectures might need extra padding after the
1842 cmsghdr, however, and CMSG_LEN() would have to take account of
1843 this. */
1844#ifdef CMSG_LEN
1845/* If length is in range, set *result to CMSG_LEN(length) and return
1846 true; otherwise, return false. */
1847static int
1848get_CMSG_LEN(size_t length, size_t *result)
1849{
1850 size_t tmp;
1851
1852 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1853 return 0;
1854 tmp = CMSG_LEN(length);
1855 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1856 return 0;
1857 *result = tmp;
1858 return 1;
1859}
1860
1861#ifdef CMSG_SPACE
1862/* If length is in range, set *result to CMSG_SPACE(length) and return
1863 true; otherwise, return false. */
1864static int
1865get_CMSG_SPACE(size_t length, size_t *result)
1866{
1867 size_t tmp;
1868
1869 /* Use CMSG_SPACE(1) here in order to take account of the padding
1870 necessary before *and* after the data. */
1871 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1872 return 0;
1873 tmp = CMSG_SPACE(length);
1874 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1875 return 0;
1876 *result = tmp;
1877 return 1;
1878}
1879#endif
1880
1881/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1882 pointer in msg->msg_control with at least "space" bytes after it,
1883 and its cmsg_len member inside the buffer. */
1884static int
1885cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1886{
1887 size_t cmsg_offset;
1888 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1889 sizeof(cmsgh->cmsg_len));
1890
Charles-François Natali466517d2011-08-28 18:23:43 +02001891 /* Note that POSIX allows msg_controllen to be of signed type. */
1892 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001893 return 0;
1894 if (space < cmsg_len_end)
1895 space = cmsg_len_end;
1896 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1897 return (cmsg_offset <= (size_t)-1 - space &&
1898 cmsg_offset + space <= msg->msg_controllen);
1899}
1900
1901/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1902 *space to number of bytes following it in the buffer and return
1903 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1904 msg->msg_controllen are valid. */
1905static int
1906get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1907{
1908 size_t data_offset;
1909 char *data_ptr;
1910
1911 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1912 return 0;
1913 data_offset = data_ptr - (char *)msg->msg_control;
1914 if (data_offset > msg->msg_controllen)
1915 return 0;
1916 *space = msg->msg_controllen - data_offset;
1917 return 1;
1918}
1919
1920/* If cmsgh is invalid or not contained in the buffer pointed to by
1921 msg->msg_control, return -1. If cmsgh is valid and its associated
1922 data is entirely contained in the buffer, set *data_len to the
1923 length of the associated data and return 0. If only part of the
1924 associated data is contained in the buffer but cmsgh is otherwise
1925 valid, set *data_len to the length contained in the buffer and
1926 return 1. */
1927static int
1928get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1929{
1930 size_t space, cmsg_data_len;
1931
1932 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1933 cmsgh->cmsg_len < CMSG_LEN(0))
1934 return -1;
1935 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1936 if (!get_cmsg_data_space(msg, cmsgh, &space))
1937 return -1;
1938 if (space >= cmsg_data_len) {
1939 *data_len = cmsg_data_len;
1940 return 0;
1941 }
1942 *data_len = space;
1943 return 1;
1944}
1945#endif /* CMSG_LEN */
1946
1947
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001948/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001949
Guido van Rossum73624e91994-10-10 17:59:00 +00001950static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001951sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 sock_addr_t addrbuf;
1954 SOCKET_T newfd = INVALID_SOCKET;
1955 socklen_t addrlen;
1956 PyObject *sock = NULL;
1957 PyObject *addr = NULL;
1958 PyObject *res = NULL;
1959 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 if (!getsockaddrlen(s, &addrlen))
1961 return NULL;
1962 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 if (!IS_SELECTABLE(s))
1965 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001966
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001967 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001969 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001970 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001972 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 if (timeout == 1) {
1976 PyErr_SetString(socket_timeout, "timed out");
1977 return NULL;
1978 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001979 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 if (newfd == INVALID_SOCKET)
1982 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 sock = PyLong_FromSocket_t(newfd);
1985 if (sock == NULL) {
1986 SOCKETCLOSE(newfd);
1987 goto finally;
1988 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1991 addrlen, s->sock_proto);
1992 if (addr == NULL)
1993 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001996
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 Py_XDECREF(sock);
1999 Py_XDECREF(addr);
2000 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002001}
2002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002003PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002004"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002005\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002006Wait for an incoming connection. Return a new socket file descriptor\n\
2007representing the connection, and the address of the client.\n\
2008For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002009
Guido van Rossum11ba0942002-06-13 15:07:44 +00002010/* s.setblocking(flag) method. Argument:
2011 False -- non-blocking mode; same as settimeout(0)
2012 True -- blocking mode; same as settimeout(None)
2013*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002014
Guido van Rossum73624e91994-10-10 17:59:00 +00002015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002016sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002017{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002018 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 block = PyLong_AsLong(arg);
2021 if (block == -1 && PyErr_Occurred())
2022 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 s->sock_timeout = block ? -1.0 : 0.0;
2025 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 Py_INCREF(Py_None);
2028 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002029}
Guido van Rossume4485b01994-09-07 14:32:49 +00002030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002031PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002032"setblocking(flag)\n\
2033\n\
2034Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002035setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002036setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002037
Guido van Rossum11ba0942002-06-13 15:07:44 +00002038/* s.settimeout(timeout) method. Argument:
2039 None -- no timeout, blocking mode; same as setblocking(True)
2040 0.0 -- non-blocking mode; same as setblocking(False)
2041 > 0 -- timeout mode; operations time out after timeout seconds
2042 < 0 -- illegal; raises an exception
2043*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002044static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002045sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 if (arg == Py_None)
2050 timeout = -1.0;
2051 else {
2052 timeout = PyFloat_AsDouble(arg);
2053 if (timeout < 0.0) {
2054 if (!PyErr_Occurred())
2055 PyErr_SetString(PyExc_ValueError,
2056 "Timeout value out of range");
2057 return NULL;
2058 }
2059 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 s->sock_timeout = timeout;
2062 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 Py_INCREF(Py_None);
2065 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002066}
2067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002068PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002069"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002070\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002071Set a timeout on socket operations. 'timeout' can be a float,\n\
2072giving in seconds, or None. Setting a timeout of None disables\n\
2073the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002074Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002075
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002076/* s.gettimeout() method.
2077 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002078static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002079sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 if (s->sock_timeout < 0.0) {
2082 Py_INCREF(Py_None);
2083 return Py_None;
2084 }
2085 else
2086 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002087}
2088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002089PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002090"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002092Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002093operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002094operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002095
Guido van Rossumaee08791992-09-08 09:05:33 +00002096/* s.setsockopt() method.
2097 With an integer third argument, sets an integer option.
2098 With a string third argument, sets an option from a buffer;
2099 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002100
Guido van Rossum73624e91994-10-10 17:59:00 +00002101static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002102sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 int level;
2105 int optname;
2106 int res;
2107 char *buf;
2108 int buflen;
2109 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 if (PyArg_ParseTuple(args, "iii:setsockopt",
2112 &level, &optname, &flag)) {
2113 buf = (char *) &flag;
2114 buflen = sizeof flag;
2115 }
2116 else {
2117 PyErr_Clear();
2118 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2119 &level, &optname, &buf, &buflen))
2120 return NULL;
2121 }
2122 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2123 if (res < 0)
2124 return s->errorhandler();
2125 Py_INCREF(Py_None);
2126 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002127}
2128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002129PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002130"setsockopt(level, option, value)\n\
2131\n\
2132Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002133The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002134
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002135
Guido van Rossumaee08791992-09-08 09:05:33 +00002136/* s.getsockopt() method.
2137 With two arguments, retrieves an integer option.
2138 With a third integer argument, retrieves a string buffer of that size;
2139 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002140
Guido van Rossum73624e91994-10-10 17:59:00 +00002141static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002142sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 int level;
2145 int optname;
2146 int res;
2147 PyObject *buf;
2148 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2151 &level, &optname, &buflen))
2152 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 if (buflen == 0) {
2155 int flag = 0;
2156 socklen_t flagsize = sizeof flag;
2157 res = getsockopt(s->sock_fd, level, optname,
2158 (void *)&flag, &flagsize);
2159 if (res < 0)
2160 return s->errorhandler();
2161 return PyLong_FromLong(flag);
2162 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002163#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 /* socklen_t is unsigned so no negative test is needed,
2165 test buflen == 0 is previously done */
2166 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002167#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002169#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002170 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 "getsockopt buflen out of range");
2172 return NULL;
2173 }
2174 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2175 if (buf == NULL)
2176 return NULL;
2177 res = getsockopt(s->sock_fd, level, optname,
2178 (void *)PyBytes_AS_STRING(buf), &buflen);
2179 if (res < 0) {
2180 Py_DECREF(buf);
2181 return s->errorhandler();
2182 }
2183 _PyBytes_Resize(&buf, buflen);
2184 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002185}
2186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188"getsockopt(level, option[, buffersize]) -> value\n\
2189\n\
2190Get a socket option. See the Unix manual for level and option.\n\
2191If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002194
Fred Drake728819a2000-07-01 03:40:12 +00002195/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002196
Guido van Rossum73624e91994-10-10 17:59:00 +00002197static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002198sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 sock_addr_t addrbuf;
2201 int addrlen;
2202 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2205 return NULL;
2206 Py_BEGIN_ALLOW_THREADS
2207 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2208 Py_END_ALLOW_THREADS
2209 if (res < 0)
2210 return s->errorhandler();
2211 Py_INCREF(Py_None);
2212 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002213}
2214
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002215PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002216"bind(address)\n\
2217\n\
2218Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002219pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002220sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002221
Guido van Rossum30a685f1991-06-27 15:51:29 +00002222
2223/* s.close() method.
2224 Set the file descriptor to -1 so operations tried subsequently
2225 will surely fail. */
2226
Guido van Rossum73624e91994-10-10 17:59:00 +00002227static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002228sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 if ((fd = s->sock_fd) != -1) {
2233 s->sock_fd = -1;
2234 Py_BEGIN_ALLOW_THREADS
2235 (void) SOCKETCLOSE(fd);
2236 Py_END_ALLOW_THREADS
2237 }
2238 Py_INCREF(Py_None);
2239 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002240}
2241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002242PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002243"close()\n\
2244\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002245Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002246
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002247static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002248sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002249{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002250 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002251 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002252 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002253}
2254
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002255PyDoc_STRVAR(detach_doc,
2256"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002257\n\
2258Close the socket object without closing the underlying file descriptor.\
2259The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002260can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002261
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002262static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002263internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 timeout = 0;
2269 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002270
2271#ifdef MS_WINDOWS
2272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 if (s->sock_timeout > 0.0) {
2274 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2275 IS_SELECTABLE(s)) {
2276 /* This is a mess. Best solution: trust select */
2277 fd_set fds;
2278 fd_set fds_exc;
2279 struct timeval tv;
2280 tv.tv_sec = (int)s->sock_timeout;
2281 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2282 FD_ZERO(&fds);
2283 FD_SET(s->sock_fd, &fds);
2284 FD_ZERO(&fds_exc);
2285 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002286 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2287 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 if (res == 0) {
2289 res = WSAEWOULDBLOCK;
2290 timeout = 1;
2291 } else if (res > 0) {
2292 if (FD_ISSET(s->sock_fd, &fds))
2293 /* The socket is in the writable set - this
2294 means connected */
2295 res = 0;
2296 else {
2297 /* As per MS docs, we need to call getsockopt()
2298 to get the underlying error */
2299 int res_size = sizeof res;
2300 /* It must be in the exception set */
2301 assert(FD_ISSET(s->sock_fd, &fds_exc));
2302 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2303 (char *)&res, &res_size))
2304 /* getsockopt also clears WSAGetLastError,
2305 so reset it back. */
2306 WSASetLastError(res);
2307 else
2308 res = WSAGetLastError();
2309 }
2310 }
2311 /* else if (res < 0) an error occurred */
2312 }
2313 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 if (res < 0)
2316 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002317
2318#else
2319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 if (s->sock_timeout > 0.0) {
2321 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2322 timeout = internal_select(s, 1);
2323 if (timeout == 0) {
2324 /* Bug #1019808: in case of an EINPROGRESS,
2325 use getsockopt(SO_ERROR) to get the real
2326 error. */
2327 socklen_t res_size = sizeof res;
2328 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2329 SO_ERROR, &res, &res_size);
2330 if (res == EISCONN)
2331 res = 0;
2332 errno = res;
2333 }
2334 else if (timeout == -1) {
2335 res = errno; /* had error */
2336 }
2337 else
2338 res = EWOULDBLOCK; /* timed out */
2339 }
2340 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 if (res < 0)
2343 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002344
2345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002349}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002350
Fred Drake728819a2000-07-01 03:40:12 +00002351/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002352
Guido van Rossum73624e91994-10-10 17:59:00 +00002353static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002354sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 sock_addr_t addrbuf;
2357 int addrlen;
2358 int res;
2359 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2362 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 Py_BEGIN_ALLOW_THREADS
2365 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2366 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 if (timeout == 1) {
2369 PyErr_SetString(socket_timeout, "timed out");
2370 return NULL;
2371 }
2372 if (res != 0)
2373 return s->errorhandler();
2374 Py_INCREF(Py_None);
2375 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002376}
2377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002378PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002379"connect(address)\n\
2380\n\
2381Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002382is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002383
Guido van Rossum30a685f1991-06-27 15:51:29 +00002384
Fred Drake728819a2000-07-01 03:40:12 +00002385/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002386
2387static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002388sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 sock_addr_t addrbuf;
2391 int addrlen;
2392 int res;
2393 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2396 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 Py_BEGIN_ALLOW_THREADS
2399 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2400 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 /* Signals are not errors (though they may raise exceptions). Adapted
2403 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002404#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 if (res == EINTR && PyErr_CheckSignals())
2406 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002407#endif
2408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002410}
2411
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002412PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002413"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002414\n\
2415This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002416instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002417
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002418
Guido van Rossumed233a51992-06-23 09:07:03 +00002419/* s.fileno() method */
2420
Guido van Rossum73624e91994-10-10 17:59:00 +00002421static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002422sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002425}
2426
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002427PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002428"fileno() -> integer\n\
2429\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002430Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002431
Guido van Rossumed233a51992-06-23 09:07:03 +00002432
Guido van Rossumc89705d1992-11-26 08:54:07 +00002433/* s.getsockname() method */
2434
Guido van Rossum73624e91994-10-10 17:59:00 +00002435static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002436sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 sock_addr_t addrbuf;
2439 int res;
2440 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 if (!getsockaddrlen(s, &addrlen))
2443 return NULL;
2444 memset(&addrbuf, 0, addrlen);
2445 Py_BEGIN_ALLOW_THREADS
2446 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2447 Py_END_ALLOW_THREADS
2448 if (res < 0)
2449 return s->errorhandler();
2450 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2451 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002452}
2453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002454PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002455"getsockname() -> address info\n\
2456\n\
2457Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002459
Guido van Rossumc89705d1992-11-26 08:54:07 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002462/* s.getpeername() method */
2463
Guido van Rossum73624e91994-10-10 17:59:00 +00002464static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002465sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 sock_addr_t addrbuf;
2468 int res;
2469 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 if (!getsockaddrlen(s, &addrlen))
2472 return NULL;
2473 memset(&addrbuf, 0, addrlen);
2474 Py_BEGIN_ALLOW_THREADS
2475 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2476 Py_END_ALLOW_THREADS
2477 if (res < 0)
2478 return s->errorhandler();
2479 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2480 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002481}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484"getpeername() -> address info\n\
2485\n\
2486Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002487info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002488
Guido van Rossumb6775db1994-08-01 11:34:53 +00002489#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002490
2491
Guido van Rossum30a685f1991-06-27 15:51:29 +00002492/* s.listen(n) method */
2493
Guido van Rossum73624e91994-10-10 17:59:00 +00002494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 int backlog;
2498 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002499
Serhiy Storchaka78980432013-01-15 01:12:17 +02002500 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 if (backlog == -1 && PyErr_Occurred())
2502 return NULL;
2503 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002504 /* To avoid problems on systems that don't allow a negative backlog
2505 * (which doesn't make sense anyway) we force a minimum value of 0. */
2506 if (backlog < 0)
2507 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 res = listen(s->sock_fd, backlog);
2509 Py_END_ALLOW_THREADS
2510 if (res < 0)
2511 return s->errorhandler();
2512 Py_INCREF(Py_None);
2513 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002514}
2515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002516PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002517"listen(backlog)\n\
2518\n\
2519Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002520least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2521unaccepted connections that the system will allow before refusing new\n\
2522connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002523
2524
Thomas Wouters477c8d52006-05-27 19:21:47 +00002525/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002526 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002527 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002528 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002529 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002530 * also possible that we return a number of bytes smaller than the request
2531 * bytes.
2532 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002533
Antoine Pitrou19467d22010-08-17 19:33:30 +00002534static Py_ssize_t
2535sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002536{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002537 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 int remaining;
2541 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002542#endif
2543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 if (!IS_SELECTABLE(s)) {
2545 select_error();
2546 return -1;
2547 }
2548 if (len == 0) {
2549 /* If 0 bytes were requested, do nothing. */
2550 return 0;
2551 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552
2553#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002554 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002556 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 if (!timeout)
2558 outlen = recv(s->sock_fd, cbuf, len, flags);
2559 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 if (timeout == 1) {
2562 PyErr_SetString(socket_timeout, "timed out");
2563 return -1;
2564 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002565 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 if (outlen < 0) {
2567 /* Note: the call to errorhandler() ALWAYS indirectly returned
2568 NULL, so ignore its return value */
2569 s->errorhandler();
2570 return -1;
2571 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002572#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 read_buf = cbuf;
2574 remaining = len;
2575 while (remaining != 0) {
2576 unsigned int segment;
2577 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 segment = remaining /SEGMENT_SIZE;
2580 if (segment != 0) {
2581 segment = SEGMENT_SIZE;
2582 }
2583 else {
2584 segment = remaining;
2585 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002587 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002589 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (!timeout)
2591 nread = recv(s->sock_fd, read_buf, segment, flags);
2592 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 if (timeout == 1) {
2594 PyErr_SetString(socket_timeout, "timed out");
2595 return -1;
2596 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002597 END_SELECT_LOOP(s)
2598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 if (nread < 0) {
2600 s->errorhandler();
2601 return -1;
2602 }
2603 if (nread != remaining) {
2604 read_buf += nread;
2605 break;
2606 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 remaining -= segment;
2609 read_buf += segment;
2610 }
2611 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002612#endif /* !__VMS */
2613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002615}
2616
Guido van Rossum48a680c2001-03-02 06:34:14 +00002617
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002618/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002619
Guido van Rossum73624e91994-10-10 17:59:00 +00002620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002621sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002622{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002623 Py_ssize_t recvlen, outlen;
2624 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002626
Antoine Pitrou19467d22010-08-17 19:33:30 +00002627 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 if (recvlen < 0) {
2631 PyErr_SetString(PyExc_ValueError,
2632 "negative buffersize in recv");
2633 return NULL;
2634 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 /* Allocate a new string. */
2637 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2638 if (buf == NULL)
2639 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 /* Call the guts */
2642 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2643 if (outlen < 0) {
2644 /* An error occurred, release the string and return an
2645 error. */
2646 Py_DECREF(buf);
2647 return NULL;
2648 }
2649 if (outlen != recvlen) {
2650 /* We did not read as many bytes as we anticipated, resize the
2651 string if possible and be successful. */
2652 _PyBytes_Resize(&buf, outlen);
2653 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002656}
2657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002658PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002659"recv(buffersize[, flags]) -> data\n\
2660\n\
2661Receive up to buffersize bytes from the socket. For the optional flags\n\
2662argument, see the Unix manual. When no data is available, block until\n\
2663at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002664the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002665
Guido van Rossum30a685f1991-06-27 15:51:29 +00002666
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002667/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002668
Thomas Wouters477c8d52006-05-27 19:21:47 +00002669static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002670sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673
Antoine Pitrou19467d22010-08-17 19:33:30 +00002674 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 Py_buffer pbuf;
2676 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002677 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002680 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 &pbuf, &recvlen, &flags))
2682 return NULL;
2683 buf = pbuf.buf;
2684 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 if (recvlen < 0) {
2687 PyBuffer_Release(&pbuf);
2688 PyErr_SetString(PyExc_ValueError,
2689 "negative buffersize in recv_into");
2690 return NULL;
2691 }
2692 if (recvlen == 0) {
2693 /* If nbytes was not specified, use the buffer's length */
2694 recvlen = buflen;
2695 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 /* Check if the buffer is large enough */
2698 if (buflen < recvlen) {
2699 PyBuffer_Release(&pbuf);
2700 PyErr_SetString(PyExc_ValueError,
2701 "buffer too small for requested bytes");
2702 return NULL;
2703 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 /* Call the guts */
2706 readlen = sock_recv_guts(s, buf, recvlen, flags);
2707 if (readlen < 0) {
2708 /* Return an error. */
2709 PyBuffer_Release(&pbuf);
2710 return NULL;
2711 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 PyBuffer_Release(&pbuf);
2714 /* Return the number of bytes read. Note that we do not do anything
2715 special here in the case that readlen < recvlen. */
2716 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002717}
2718
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002719PyDoc_STRVAR(recv_into_doc,
2720"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002721\n\
2722A version of recv() that stores its data into a buffer rather than creating \n\
2723a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2724is not specified (or 0), receive up to the size available in the given buffer.\n\
2725\n\
2726See recv() for documentation about the flags.");
2727
2728
2729/*
Christian Heimes99170a52007-12-19 02:07:34 +00002730 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2731 * into a char buffer. If you have any inc/def ref to do to the objects that
2732 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002733 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002734 * that it is also possible that we return a number of bytes smaller than the
2735 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002736 *
2737 * 'addr' is a return value for the address object. Note that you must decref
2738 * it yourself.
2739 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002740static Py_ssize_t
2741sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 sock_addr_t addrbuf;
2745 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002746 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 if (!getsockaddrlen(s, &addrlen))
2752 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (!IS_SELECTABLE(s)) {
2755 select_error();
2756 return -1;
2757 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002758
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002759 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 Py_BEGIN_ALLOW_THREADS
2761 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002762 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002764#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 n = recvfrom(s->sock_fd, cbuf, len, flags,
2766 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 n = recvfrom(s->sock_fd, cbuf, len, flags,
2769 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 }
2772 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 if (timeout == 1) {
2775 PyErr_SetString(socket_timeout, "timed out");
2776 return -1;
2777 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002778 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 if (n < 0) {
2780 s->errorhandler();
2781 return -1;
2782 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2785 addrlen, s->sock_proto)))
2786 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002789}
2790
2791/* s.recvfrom(nbytes [,flags]) method */
2792
2793static PyObject *
2794sock_recvfrom(PySocketSockObject *s, PyObject *args)
2795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 PyObject *buf = NULL;
2797 PyObject *addr = NULL;
2798 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002799 int flags = 0;
2800 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002801
Antoine Pitrou19467d22010-08-17 19:33:30 +00002802 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 if (recvlen < 0) {
2806 PyErr_SetString(PyExc_ValueError,
2807 "negative buffersize in recvfrom");
2808 return NULL;
2809 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2812 if (buf == NULL)
2813 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2816 recvlen, flags, &addr);
2817 if (outlen < 0) {
2818 goto finally;
2819 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 if (outlen != recvlen) {
2822 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002823 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002825 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 goto finally;
2827 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002830
2831finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 Py_XDECREF(buf);
2833 Py_XDECREF(addr);
2834 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002835}
2836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002837PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2839\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002840Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002841
Thomas Wouters477c8d52006-05-27 19:21:47 +00002842
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002843/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002844
2845static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002846sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002849
Antoine Pitrou19467d22010-08-17 19:33:30 +00002850 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 Py_buffer pbuf;
2852 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002853 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002856
Antoine Pitrou19467d22010-08-17 19:33:30 +00002857 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 kwlist, &pbuf,
2859 &recvlen, &flags))
2860 return NULL;
2861 buf = pbuf.buf;
2862 buflen = pbuf.len;
2863 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 if (recvlen < 0) {
2866 PyBuffer_Release(&pbuf);
2867 PyErr_SetString(PyExc_ValueError,
2868 "negative buffersize in recvfrom_into");
2869 return NULL;
2870 }
2871 if (recvlen == 0) {
2872 /* If nbytes was not specified, use the buffer's length */
2873 recvlen = buflen;
2874 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2877 if (readlen < 0) {
2878 PyBuffer_Release(&pbuf);
2879 /* Return an error */
2880 Py_XDECREF(addr);
2881 return NULL;
2882 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 PyBuffer_Release(&pbuf);
2885 /* Return the number of bytes read and the address. Note that we do
2886 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002887 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002888}
2889
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002890PyDoc_STRVAR(recvfrom_into_doc,
2891"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002892\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002893Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002894
2895
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002896/* The sendmsg() and recvmsg[_into]() methods require a working
2897 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2898#ifdef CMSG_LEN
2899/*
2900 * Call recvmsg() with the supplied iovec structures, flags, and
2901 * ancillary data buffer size (controllen). Returns the tuple return
2902 * value for recvmsg() or recvmsg_into(), with the first item provided
2903 * by the supplied makeval() function. makeval() will be called with
2904 * the length read and makeval_data as arguments, and must return a
2905 * new reference (which will be decrefed if there is a subsequent
2906 * error). On error, closes any file descriptors received via
2907 * SCM_RIGHTS.
2908 */
2909static PyObject *
2910sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2911 int flags, Py_ssize_t controllen,
2912 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2913{
2914 ssize_t bytes_received = -1;
2915 int timeout;
2916 sock_addr_t addrbuf;
2917 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002918 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002919 PyObject *cmsg_list = NULL, *retval = NULL;
2920 void *controlbuf = NULL;
2921 struct cmsghdr *cmsgh;
2922 size_t cmsgdatalen = 0;
2923 int cmsg_status;
2924
2925 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2926 ignored" when the socket is connected (Linux fills them in
2927 anyway for AF_UNIX sockets at least). Normally msg_namelen
2928 seems to be set to 0 if there's no address, but try to
2929 initialize msg_name to something that won't be mistaken for a
2930 real address if that doesn't happen. */
2931 if (!getsockaddrlen(s, &addrbuflen))
2932 return NULL;
2933 memset(&addrbuf, 0, addrbuflen);
2934 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2935
2936 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2937 PyErr_SetString(PyExc_ValueError,
2938 "invalid ancillary data buffer length");
2939 return NULL;
2940 }
2941 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2942 return PyErr_NoMemory();
2943
2944 /* Make the system call. */
2945 if (!IS_SELECTABLE(s)) {
2946 select_error();
2947 goto finally;
2948 }
2949
2950 BEGIN_SELECT_LOOP(s)
2951 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002952 msg.msg_name = SAS2SA(&addrbuf);
2953 msg.msg_namelen = addrbuflen;
2954 msg.msg_iov = iov;
2955 msg.msg_iovlen = iovlen;
2956 msg.msg_control = controlbuf;
2957 msg.msg_controllen = controllen;
2958 timeout = internal_select_ex(s, 0, interval);
2959 if (!timeout)
2960 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2961 Py_END_ALLOW_THREADS;
2962 if (timeout == 1) {
2963 PyErr_SetString(socket_timeout, "timed out");
2964 goto finally;
2965 }
2966 END_SELECT_LOOP(s)
2967
2968 if (bytes_received < 0) {
2969 s->errorhandler();
2970 goto finally;
2971 }
2972
2973 /* Make list of (level, type, data) tuples from control messages. */
2974 if ((cmsg_list = PyList_New(0)) == NULL)
2975 goto err_closefds;
2976 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2977 implementations didn't do so. */
2978 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2979 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2980 PyObject *bytes, *tuple;
2981 int tmp;
2982
2983 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2984 if (cmsg_status != 0) {
2985 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2986 "received malformed or improperly-truncated "
2987 "ancillary data", 1) == -1)
2988 goto err_closefds;
2989 }
2990 if (cmsg_status < 0)
2991 break;
2992 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002993 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002994 goto err_closefds;
2995 }
2996
2997 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2998 cmsgdatalen);
2999 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3000 (int)cmsgh->cmsg_type, bytes);
3001 if (tuple == NULL)
3002 goto err_closefds;
3003 tmp = PyList_Append(cmsg_list, tuple);
3004 Py_DECREF(tuple);
3005 if (tmp != 0)
3006 goto err_closefds;
3007
3008 if (cmsg_status != 0)
3009 break;
3010 }
3011
3012 retval = Py_BuildValue("NOiN",
3013 (*makeval)(bytes_received, makeval_data),
3014 cmsg_list,
3015 (int)msg.msg_flags,
3016 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3017 ((msg.msg_namelen > addrbuflen) ?
3018 addrbuflen : msg.msg_namelen),
3019 s->sock_proto));
3020 if (retval == NULL)
3021 goto err_closefds;
3022
3023finally:
3024 Py_XDECREF(cmsg_list);
3025 PyMem_Free(controlbuf);
3026 return retval;
3027
3028err_closefds:
3029#ifdef SCM_RIGHTS
3030 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3031 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3032 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3033 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3034 if (cmsg_status < 0)
3035 break;
3036 if (cmsgh->cmsg_level == SOL_SOCKET &&
3037 cmsgh->cmsg_type == SCM_RIGHTS) {
3038 size_t numfds;
3039 int *fdp;
3040
3041 numfds = cmsgdatalen / sizeof(int);
3042 fdp = (int *)CMSG_DATA(cmsgh);
3043 while (numfds-- > 0)
3044 close(*fdp++);
3045 }
3046 if (cmsg_status != 0)
3047 break;
3048 }
3049#endif /* SCM_RIGHTS */
3050 goto finally;
3051}
3052
3053
3054static PyObject *
3055makeval_recvmsg(ssize_t received, void *data)
3056{
3057 PyObject **buf = data;
3058
3059 if (received < PyBytes_GET_SIZE(*buf))
3060 _PyBytes_Resize(buf, received);
3061 Py_XINCREF(*buf);
3062 return *buf;
3063}
3064
3065/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3066
3067static PyObject *
3068sock_recvmsg(PySocketSockObject *s, PyObject *args)
3069{
3070 Py_ssize_t bufsize, ancbufsize = 0;
3071 int flags = 0;
3072 struct iovec iov;
3073 PyObject *buf = NULL, *retval = NULL;
3074
3075 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3076 return NULL;
3077
3078 if (bufsize < 0) {
3079 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3080 return NULL;
3081 }
3082 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3083 return NULL;
3084 iov.iov_base = PyBytes_AS_STRING(buf);
3085 iov.iov_len = bufsize;
3086
3087 /* Note that we're passing a pointer to *our pointer* to the bytes
3088 object here (&buf); makeval_recvmsg() may incref the object, or
3089 deallocate it and set our pointer to NULL. */
3090 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3091 &makeval_recvmsg, &buf);
3092 Py_XDECREF(buf);
3093 return retval;
3094}
3095
3096PyDoc_STRVAR(recvmsg_doc,
3097"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3098\n\
3099Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3100socket. The ancbufsize argument sets the size in bytes of the\n\
3101internal buffer used to receive the ancillary data; it defaults to 0,\n\
3102meaning that no ancillary data will be received. Appropriate buffer\n\
3103sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3104CMSG_LEN(), and items which do not fit into the buffer might be\n\
3105truncated or discarded. The flags argument defaults to 0 and has the\n\
3106same meaning as for recv().\n\
3107\n\
3108The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3109The data item is a bytes object holding the non-ancillary data\n\
3110received. The ancdata item is a list of zero or more tuples\n\
3111(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3112(control messages) received: cmsg_level and cmsg_type are integers\n\
3113specifying the protocol level and protocol-specific type respectively,\n\
3114and cmsg_data is a bytes object holding the associated data. The\n\
3115msg_flags item is the bitwise OR of various flags indicating\n\
3116conditions on the received message; see your system documentation for\n\
3117details. If the receiving socket is unconnected, address is the\n\
3118address of the sending socket, if available; otherwise, its value is\n\
3119unspecified.\n\
3120\n\
3121If recvmsg() raises an exception after the system call returns, it\n\
3122will first attempt to close any file descriptors received via the\n\
3123SCM_RIGHTS mechanism.");
3124
3125
3126static PyObject *
3127makeval_recvmsg_into(ssize_t received, void *data)
3128{
3129 return PyLong_FromSsize_t(received);
3130}
3131
3132/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3133
3134static PyObject *
3135sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3136{
3137 Py_ssize_t ancbufsize = 0;
3138 int flags = 0;
3139 struct iovec *iovs = NULL;
3140 Py_ssize_t i, nitems, nbufs = 0;
3141 Py_buffer *bufs = NULL;
3142 PyObject *buffers_arg, *fast, *retval = NULL;
3143
3144 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3145 &buffers_arg, &ancbufsize, &flags))
3146 return NULL;
3147
3148 if ((fast = PySequence_Fast(buffers_arg,
3149 "recvmsg_into() argument 1 must be an "
3150 "iterable")) == NULL)
3151 return NULL;
3152 nitems = PySequence_Fast_GET_SIZE(fast);
3153 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003154 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003155 goto finally;
3156 }
3157
3158 /* Fill in an iovec for each item, and save the Py_buffer
3159 structs to release afterwards. */
3160 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3161 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3162 PyErr_NoMemory();
3163 goto finally;
3164 }
3165 for (; nbufs < nitems; nbufs++) {
3166 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3167 "w*;recvmsg_into() argument 1 must be an iterable "
3168 "of single-segment read-write buffers",
3169 &bufs[nbufs]))
3170 goto finally;
3171 iovs[nbufs].iov_base = bufs[nbufs].buf;
3172 iovs[nbufs].iov_len = bufs[nbufs].len;
3173 }
3174
3175 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3176 &makeval_recvmsg_into, NULL);
3177finally:
3178 for (i = 0; i < nbufs; i++)
3179 PyBuffer_Release(&bufs[i]);
3180 PyMem_Free(bufs);
3181 PyMem_Free(iovs);
3182 Py_DECREF(fast);
3183 return retval;
3184}
3185
3186PyDoc_STRVAR(recvmsg_into_doc,
3187"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3188\n\
3189Receive normal data and ancillary data from the socket, scattering the\n\
3190non-ancillary data into a series of buffers. The buffers argument\n\
3191must be an iterable of objects that export writable buffers\n\
3192(e.g. bytearray objects); these will be filled with successive chunks\n\
3193of the non-ancillary data until it has all been written or there are\n\
3194no more buffers. The ancbufsize argument sets the size in bytes of\n\
3195the internal buffer used to receive the ancillary data; it defaults to\n\
31960, meaning that no ancillary data will be received. Appropriate\n\
3197buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3198or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3199truncated or discarded. The flags argument defaults to 0 and has the\n\
3200same meaning as for recv().\n\
3201\n\
3202The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3203The nbytes item is the total number of bytes of non-ancillary data\n\
3204written into the buffers. The ancdata item is a list of zero or more\n\
3205tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3206data (control messages) received: cmsg_level and cmsg_type are\n\
3207integers specifying the protocol level and protocol-specific type\n\
3208respectively, and cmsg_data is a bytes object holding the associated\n\
3209data. The msg_flags item is the bitwise OR of various flags\n\
3210indicating conditions on the received message; see your system\n\
3211documentation for details. If the receiving socket is unconnected,\n\
3212address is the address of the sending socket, if available; otherwise,\n\
3213its value is unspecified.\n\
3214\n\
3215If recvmsg_into() raises an exception after the system call returns,\n\
3216it will first attempt to close any file descriptors received via the\n\
3217SCM_RIGHTS mechanism.");
3218#endif /* CMSG_LEN */
3219
3220
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003221/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003222
Guido van Rossum73624e91994-10-10 17:59:00 +00003223static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003224sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003227 Py_ssize_t len, n = -1;
3228 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3232 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 if (!IS_SELECTABLE(s)) {
3235 PyBuffer_Release(&pbuf);
3236 return select_error();
3237 }
3238 buf = pbuf.buf;
3239 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003240
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003241 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003243 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003245#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003247#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003252 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 PyErr_SetString(socket_timeout, "timed out");
3254 return NULL;
3255 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003256 END_SELECT_LOOP(s)
3257
3258 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 if (n < 0)
3260 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003261 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003262}
3263
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003264PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003265"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003266\n\
3267Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003268argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003270
3271
3272/* s.sendall(data [,flags]) method */
3273
3274static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003275sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003278 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003279 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3283 return NULL;
3284 buf = pbuf.buf;
3285 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 if (!IS_SELECTABLE(s)) {
3288 PyBuffer_Release(&pbuf);
3289 return select_error();
3290 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003293 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 timeout = internal_select(s, 1);
3295 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003296 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003297#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003298 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003299#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003300 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003301#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003302 }
3303 Py_END_ALLOW_THREADS
3304 if (timeout == 1) {
3305 PyBuffer_Release(&pbuf);
3306 PyErr_SetString(socket_timeout, "timed out");
3307 return NULL;
3308 }
3309 /* PyErr_CheckSignals() might change errno */
3310 saved_errno = errno;
3311 /* We must run our signal handlers before looping again.
3312 send() can return a successful partial write when it is
3313 interrupted, so we can't restrict ourselves to EINTR. */
3314 if (PyErr_CheckSignals()) {
3315 PyBuffer_Release(&pbuf);
3316 return NULL;
3317 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003319 /* If interrupted, try again */
3320 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003322 else
3323 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 }
3325 buf += n;
3326 len -= n;
3327 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (n < 0)
3331 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 Py_INCREF(Py_None);
3334 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003335}
3336
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003337PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003338"sendall(data[, flags])\n\
3339\n\
3340Send a data string to the socket. For the optional flags\n\
3341argument, see the Unix manual. This calls send() repeatedly\n\
3342until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003343to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003344
Guido van Rossum30a685f1991-06-27 15:51:29 +00003345
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003346/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003347
Guido van Rossum73624e91994-10-10 17:59:00 +00003348static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003349sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 Py_buffer pbuf;
3352 PyObject *addro;
3353 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003354 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 sock_addr_t addrbuf;
3356 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003359 arglen = PyTuple_Size(args);
3360 switch (arglen) {
3361 case 2:
3362 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3363 break;
3364 case 3:
3365 PyArg_ParseTuple(args, "y*iO:sendto",
3366 &pbuf, &flags, &addro);
3367 break;
3368 default:
3369 PyErr_Format(PyExc_TypeError,
3370 "sendto() takes 2 or 3 arguments (%d given)",
3371 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003372 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003374 if (PyErr_Occurred())
3375 return NULL;
3376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 buf = pbuf.buf;
3378 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 if (!IS_SELECTABLE(s)) {
3381 PyBuffer_Release(&pbuf);
3382 return select_error();
3383 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3386 PyBuffer_Release(&pbuf);
3387 return NULL;
3388 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003389
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003390 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003392 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 if (!timeout)
3394 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3395 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003398 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 PyErr_SetString(socket_timeout, "timed out");
3400 return NULL;
3401 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003402 END_SELECT_LOOP(s)
3403 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 if (n < 0)
3405 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003406 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003407}
3408
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003409PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003410"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003411\n\
3412Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003413For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003414
Guido van Rossum30a685f1991-06-27 15:51:29 +00003415
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003416/* The sendmsg() and recvmsg[_into]() methods require a working
3417 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3418#ifdef CMSG_LEN
3419/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3420
3421static PyObject *
3422sock_sendmsg(PySocketSockObject *s, PyObject *args)
3423{
3424 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3425 Py_buffer *databufs = NULL;
3426 struct iovec *iovs = NULL;
3427 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003428 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003429 struct cmsginfo {
3430 int level;
3431 int type;
3432 Py_buffer data;
3433 } *cmsgs = NULL;
3434 void *controlbuf = NULL;
3435 size_t controllen, controllen_last;
3436 ssize_t bytes_sent = -1;
3437 int addrlen, timeout, flags = 0;
3438 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3439 *cmsg_fast = NULL, *retval = NULL;
3440
3441 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3442 &data_arg, &cmsg_arg, &flags, &addr_arg))
3443 return NULL;
3444
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003445 /* Parse destination address. */
3446 if (addr_arg != NULL && addr_arg != Py_None) {
3447 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3448 goto finally;
3449 msg.msg_name = &addrbuf;
3450 msg.msg_namelen = addrlen;
3451 }
3452
3453 /* Fill in an iovec for each message part, and save the Py_buffer
3454 structs to release afterwards. */
3455 if ((data_fast = PySequence_Fast(data_arg,
3456 "sendmsg() argument 1 must be an "
3457 "iterable")) == NULL)
3458 goto finally;
3459 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3460 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003461 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003462 goto finally;
3463 }
3464 msg.msg_iovlen = ndataparts;
3465 if (ndataparts > 0 &&
3466 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3467 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3468 PyErr_NoMemory();
3469 goto finally;
3470 }
3471 for (; ndatabufs < ndataparts; ndatabufs++) {
3472 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3473 "y*;sendmsg() argument 1 must be an iterable of "
3474 "buffer-compatible objects",
3475 &databufs[ndatabufs]))
3476 goto finally;
3477 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3478 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3479 }
3480
3481 if (cmsg_arg == NULL)
3482 ncmsgs = 0;
3483 else {
3484 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3485 "sendmsg() argument 2 must be an "
3486 "iterable")) == NULL)
3487 goto finally;
3488 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3489 }
3490
3491#ifndef CMSG_SPACE
3492 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003493 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003494 "sending multiple control messages is not supported "
3495 "on this system");
3496 goto finally;
3497 }
3498#endif
3499 /* Save level, type and Py_buffer for each control message,
3500 and calculate total size. */
3501 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3502 PyErr_NoMemory();
3503 goto finally;
3504 }
3505 controllen = controllen_last = 0;
3506 while (ncmsgbufs < ncmsgs) {
3507 size_t bufsize, space;
3508
3509 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3510 "(iiy*):[sendmsg() ancillary data items]",
3511 &cmsgs[ncmsgbufs].level,
3512 &cmsgs[ncmsgbufs].type,
3513 &cmsgs[ncmsgbufs].data))
3514 goto finally;
3515 bufsize = cmsgs[ncmsgbufs++].data.len;
3516
3517#ifdef CMSG_SPACE
3518 if (!get_CMSG_SPACE(bufsize, &space)) {
3519#else
3520 if (!get_CMSG_LEN(bufsize, &space)) {
3521#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003522 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003523 goto finally;
3524 }
3525 controllen += space;
3526 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003527 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003528 goto finally;
3529 }
3530 controllen_last = controllen;
3531 }
3532
3533 /* Construct ancillary data block from control message info. */
3534 if (ncmsgbufs > 0) {
3535 struct cmsghdr *cmsgh = NULL;
3536
3537 if ((msg.msg_control = controlbuf =
3538 PyMem_Malloc(controllen)) == NULL) {
3539 PyErr_NoMemory();
3540 goto finally;
3541 }
3542 msg.msg_controllen = controllen;
3543
3544 /* Need to zero out the buffer as a workaround for glibc's
3545 CMSG_NXTHDR() implementation. After getting the pointer to
3546 the next header, it checks its (uninitialized) cmsg_len
3547 member to see if the "message" fits in the buffer, and
3548 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003549 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003550 memset(controlbuf, 0, controllen);
3551
3552 for (i = 0; i < ncmsgbufs; i++) {
3553 size_t msg_len, data_len = cmsgs[i].data.len;
3554 int enough_space = 0;
3555
3556 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3557 if (cmsgh == NULL) {
3558 PyErr_Format(PyExc_RuntimeError,
3559 "unexpected NULL result from %s()",
3560 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3561 goto finally;
3562 }
3563 if (!get_CMSG_LEN(data_len, &msg_len)) {
3564 PyErr_SetString(PyExc_RuntimeError,
3565 "item size out of range for CMSG_LEN()");
3566 goto finally;
3567 }
3568 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3569 size_t space;
3570
3571 cmsgh->cmsg_len = msg_len;
3572 if (get_cmsg_data_space(&msg, cmsgh, &space))
3573 enough_space = (space >= data_len);
3574 }
3575 if (!enough_space) {
3576 PyErr_SetString(PyExc_RuntimeError,
3577 "ancillary data does not fit in calculated "
3578 "space");
3579 goto finally;
3580 }
3581 cmsgh->cmsg_level = cmsgs[i].level;
3582 cmsgh->cmsg_type = cmsgs[i].type;
3583 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3584 }
3585 }
3586
3587 /* Make the system call. */
3588 if (!IS_SELECTABLE(s)) {
3589 select_error();
3590 goto finally;
3591 }
3592
3593 BEGIN_SELECT_LOOP(s)
3594 Py_BEGIN_ALLOW_THREADS;
3595 timeout = internal_select_ex(s, 1, interval);
3596 if (!timeout)
3597 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3598 Py_END_ALLOW_THREADS;
3599 if (timeout == 1) {
3600 PyErr_SetString(socket_timeout, "timed out");
3601 goto finally;
3602 }
3603 END_SELECT_LOOP(s)
3604
3605 if (bytes_sent < 0) {
3606 s->errorhandler();
3607 goto finally;
3608 }
3609 retval = PyLong_FromSsize_t(bytes_sent);
3610
3611finally:
3612 PyMem_Free(controlbuf);
3613 for (i = 0; i < ncmsgbufs; i++)
3614 PyBuffer_Release(&cmsgs[i].data);
3615 PyMem_Free(cmsgs);
3616 Py_XDECREF(cmsg_fast);
3617 for (i = 0; i < ndatabufs; i++)
3618 PyBuffer_Release(&databufs[i]);
3619 PyMem_Free(databufs);
3620 PyMem_Free(iovs);
3621 Py_XDECREF(data_fast);
3622 return retval;
3623}
3624
3625PyDoc_STRVAR(sendmsg_doc,
3626"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3627\n\
3628Send normal and ancillary data to the socket, gathering the\n\
3629non-ancillary data from a series of buffers and concatenating it into\n\
3630a single message. The buffers argument specifies the non-ancillary\n\
3631data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3632The ancdata argument specifies the ancillary data (control messages)\n\
3633as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3634cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3635protocol level and protocol-specific type respectively, and cmsg_data\n\
3636is a buffer-compatible object holding the associated data. The flags\n\
3637argument defaults to 0 and has the same meaning as for send(). If\n\
3638address is supplied and not None, it sets a destination address for\n\
3639the message. The return value is the number of bytes of non-ancillary\n\
3640data sent.");
3641#endif /* CMSG_LEN */
3642
3643
Guido van Rossum30a685f1991-06-27 15:51:29 +00003644/* s.shutdown(how) method */
3645
Guido van Rossum73624e91994-10-10 17:59:00 +00003646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003647sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 int how;
3650 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003651
Serhiy Storchaka78980432013-01-15 01:12:17 +02003652 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 if (how == -1 && PyErr_Occurred())
3654 return NULL;
3655 Py_BEGIN_ALLOW_THREADS
3656 res = shutdown(s->sock_fd, how);
3657 Py_END_ALLOW_THREADS
3658 if (res < 0)
3659 return s->errorhandler();
3660 Py_INCREF(Py_None);
3661 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003662}
3663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003664PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003665"shutdown(flag)\n\
3666\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003667Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3668of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003669
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003670#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003671static PyObject*
3672sock_ioctl(PySocketSockObject *s, PyObject *arg)
3673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674 unsigned long cmd = SIO_RCVALL;
3675 PyObject *argO;
3676 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3679 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 switch (cmd) {
3682 case SIO_RCVALL: {
3683 unsigned int option = RCVALL_ON;
3684 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3685 return NULL;
3686 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3687 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3688 return set_error();
3689 }
3690 return PyLong_FromUnsignedLong(recv); }
3691 case SIO_KEEPALIVE_VALS: {
3692 struct tcp_keepalive ka;
3693 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3694 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3695 return NULL;
3696 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3697 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3698 return set_error();
3699 }
3700 return PyLong_FromUnsignedLong(recv); }
3701 default:
3702 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3703 return NULL;
3704 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003705}
3706PyDoc_STRVAR(sock_ioctl_doc,
3707"ioctl(cmd, option) -> long\n\
3708\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003709Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3710SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3711SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003712#endif
3713
3714#if defined(MS_WINDOWS)
3715static PyObject*
3716sock_share(PySocketSockObject *s, PyObject *arg)
3717{
3718 WSAPROTOCOL_INFO info;
3719 DWORD processId;
3720 int result;
3721
3722 if (!PyArg_ParseTuple(arg, "I", &processId))
3723 return NULL;
3724
3725 Py_BEGIN_ALLOW_THREADS
3726 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3727 Py_END_ALLOW_THREADS
3728 if (result == SOCKET_ERROR)
3729 return set_error();
3730 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3731}
3732PyDoc_STRVAR(sock_share_doc,
3733"share(process_id) -> bytes\n\
3734\n\
3735Share the socket with another process. The target process id\n\
3736must be provided and the resulting bytes object passed to the target\n\
3737process. There the shared socket can be instantiated by calling\n\
3738socket.fromshare().");
3739
Christian Heimesfaf2f632008-01-06 16:59:19 +00003740
3741#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003742
3743/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003744
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003745static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3747 accept_doc},
3748 {"bind", (PyCFunction)sock_bind, METH_O,
3749 bind_doc},
3750 {"close", (PyCFunction)sock_close, METH_NOARGS,
3751 close_doc},
3752 {"connect", (PyCFunction)sock_connect, METH_O,
3753 connect_doc},
3754 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3755 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003756 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3757 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3759 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003760#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 {"getpeername", (PyCFunction)sock_getpeername,
3762 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 {"getsockname", (PyCFunction)sock_getsockname,
3765 METH_NOARGS, getsockname_doc},
3766 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3767 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003768#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3770 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003771#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003772#if defined(MS_WINDOWS)
3773 {"share", (PyCFunction)sock_share, METH_VARARGS,
3774 sock_share_doc},
3775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 {"listen", (PyCFunction)sock_listen, METH_O,
3777 listen_doc},
3778 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3779 recv_doc},
3780 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3781 recv_into_doc},
3782 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3783 recvfrom_doc},
3784 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3785 recvfrom_into_doc},
3786 {"send", (PyCFunction)sock_send, METH_VARARGS,
3787 send_doc},
3788 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3789 sendall_doc},
3790 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3791 sendto_doc},
3792 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3793 setblocking_doc},
3794 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3795 settimeout_doc},
3796 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3797 gettimeout_doc},
3798 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3799 setsockopt_doc},
3800 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3801 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003802#ifdef CMSG_LEN
3803 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3804 recvmsg_doc},
3805 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3806 recvmsg_into_doc,},
3807 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3808 sendmsg_doc},
3809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003811};
3812
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003813/* SockObject members */
3814static PyMemberDef sock_memberlist[] = {
3815 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3816 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3817 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3818 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3819 {0},
3820};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003821
Guido van Rossum73624e91994-10-10 17:59:00 +00003822/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003823 First close the file description. */
3824
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003825static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003826sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003827{
Antoine Pitroue033e062010-10-29 10:38:18 +00003828 if (s->sock_fd != -1) {
3829 PyObject *exc, *val, *tb;
3830 Py_ssize_t old_refcount = Py_REFCNT(s);
3831 ++Py_REFCNT(s);
3832 PyErr_Fetch(&exc, &val, &tb);
3833 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3834 "unclosed %R", s))
3835 /* Spurious errors can appear at shutdown */
3836 if (PyErr_ExceptionMatches(PyExc_Warning))
3837 PyErr_WriteUnraisable((PyObject *) s);
3838 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003839 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003840 Py_REFCNT(s) = old_refcount;
3841 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003842 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003843}
3844
Guido van Rossum30a685f1991-06-27 15:51:29 +00003845
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003847sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003848{
Fred Drakea04eaad2000-06-30 02:46:07 +00003849#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 if (s->sock_fd > LONG_MAX) {
3851 /* this can occur on Win64, and actually there is a special
3852 ugly printf formatter for decimal pointer length integer
3853 printing, only bother if necessary*/
3854 PyErr_SetString(PyExc_OverflowError,
3855 "no printf formatter to display "
3856 "the socket descriptor in decimal");
3857 return NULL;
3858 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003860 return PyUnicode_FromFormat(
3861 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3862 (long)s->sock_fd, s->sock_family,
3863 s->sock_type,
3864 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003865}
3866
3867
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003868/* Create a new, uninitialized socket object. */
3869
3870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003871sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003873 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003875 new = type->tp_alloc(type, 0);
3876 if (new != NULL) {
3877 ((PySocketSockObject *)new)->sock_fd = -1;
3878 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3879 ((PySocketSockObject *)new)->errorhandler = &set_error;
3880 }
3881 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003882}
3883
3884
3885/* Initialize a new socket object. */
3886
3887/*ARGSUSED*/
3888static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003889sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 PySocketSockObject *s = (PySocketSockObject *)self;
3892 PyObject *fdobj = NULL;
3893 SOCKET_T fd = INVALID_SOCKET;
3894 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3895 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003897 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3898 "|iiiO:socket", keywords,
3899 &family, &type, &proto, &fdobj))
3900 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003903#ifdef MS_WINDOWS
3904 /* recreate a socket that was duplicated */
3905 if (PyBytes_Check(fdobj)) {
3906 WSAPROTOCOL_INFO info;
3907 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3908 PyErr_Format(PyExc_ValueError,
3909 "socket descriptor string has wrong size, "
3910 "should be %zu bytes.", sizeof(info));
3911 return -1;
3912 }
3913 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3914 Py_BEGIN_ALLOW_THREADS
3915 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3916 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3917 Py_END_ALLOW_THREADS
3918 if (fd == INVALID_SOCKET) {
3919 set_error();
3920 return -1;
3921 }
3922 family = info.iAddressFamily;
3923 type = info.iSocketType;
3924 proto = info.iProtocol;
3925 }
3926 else
3927#endif
3928 {
3929 fd = PyLong_AsSocket_t(fdobj);
3930 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3931 return -1;
3932 if (fd == INVALID_SOCKET) {
3933 PyErr_SetString(PyExc_ValueError,
3934 "can't use invalid socket value");
3935 return -1;
3936 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003937 }
3938 }
3939 else {
3940 Py_BEGIN_ALLOW_THREADS
3941 fd = socket(family, type, proto);
3942 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 if (fd == INVALID_SOCKET) {
3945 set_error();
3946 return -1;
3947 }
3948 }
3949 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003952
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003953}
3954
3955
Guido van Rossumb6775db1994-08-01 11:34:53 +00003956/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003957
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003958static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3960 "_socket.socket", /* tp_name */
3961 sizeof(PySocketSockObject), /* tp_basicsize */
3962 0, /* tp_itemsize */
3963 (destructor)sock_dealloc, /* tp_dealloc */
3964 0, /* tp_print */
3965 0, /* tp_getattr */
3966 0, /* tp_setattr */
3967 0, /* tp_reserved */
3968 (reprfunc)sock_repr, /* tp_repr */
3969 0, /* tp_as_number */
3970 0, /* tp_as_sequence */
3971 0, /* tp_as_mapping */
3972 0, /* tp_hash */
3973 0, /* tp_call */
3974 0, /* tp_str */
3975 PyObject_GenericGetAttr, /* tp_getattro */
3976 0, /* tp_setattro */
3977 0, /* tp_as_buffer */
3978 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3979 sock_doc, /* tp_doc */
3980 0, /* tp_traverse */
3981 0, /* tp_clear */
3982 0, /* tp_richcompare */
3983 0, /* tp_weaklistoffset */
3984 0, /* tp_iter */
3985 0, /* tp_iternext */
3986 sock_methods, /* tp_methods */
3987 sock_memberlist, /* tp_members */
3988 0, /* tp_getset */
3989 0, /* tp_base */
3990 0, /* tp_dict */
3991 0, /* tp_descr_get */
3992 0, /* tp_descr_set */
3993 0, /* tp_dictoffset */
3994 sock_initobj, /* tp_init */
3995 PyType_GenericAlloc, /* tp_alloc */
3996 sock_new, /* tp_new */
3997 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003998};
3999
Guido van Rossum30a685f1991-06-27 15:51:29 +00004000
Guido van Rossum81194471991-07-27 21:42:02 +00004001/* Python interface to gethostname(). */
4002
4003/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004004static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004005socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004006{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004007#ifdef MS_WINDOWS
4008 /* Don't use winsock's gethostname, as this returns the ANSI
4009 version of the hostname, whereas we need a Unicode string.
4010 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004011 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004012 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004013 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004014 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004015
4016 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004017 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004018
4019 if (GetLastError() != ERROR_MORE_DATA)
4020 return PyErr_SetFromWindowsErr(0);
4021
4022 if (size == 0)
4023 return PyUnicode_New(0, 0);
4024
4025 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4026 names */
4027 name = PyMem_Malloc(size * sizeof(wchar_t));
4028 if (!name)
4029 return NULL;
4030 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4031 name,
4032 &size))
4033 {
4034 PyMem_Free(name);
4035 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004036 }
Victor Stinner74168972011-11-17 01:11:36 +01004037
4038 result = PyUnicode_FromWideChar(name, size);
4039 PyMem_Free(name);
4040 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004041#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 char buf[1024];
4043 int res;
4044 Py_BEGIN_ALLOW_THREADS
4045 res = gethostname(buf, (int) sizeof buf - 1);
4046 Py_END_ALLOW_THREADS
4047 if (res < 0)
4048 return set_error();
4049 buf[sizeof buf - 1] = '\0';
4050 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004051#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004052}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004053
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004054PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004055"gethostname() -> string\n\
4056\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004057Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004058
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004059#ifdef HAVE_SETHOSTNAME
4060PyDoc_STRVAR(sethostname_doc,
4061"sethostname(name)\n\n\
4062Sets the hostname to name.");
4063
4064static PyObject *
4065socket_sethostname(PyObject *self, PyObject *args)
4066{
4067 PyObject *hnobj;
4068 Py_buffer buf;
4069 int res, flag = 0;
4070
4071 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4072 PyErr_Clear();
4073 if (!PyArg_ParseTuple(args, "O&:sethostname",
4074 PyUnicode_FSConverter, &hnobj))
4075 return NULL;
4076 flag = 1;
4077 }
4078 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4079 if (!res) {
4080 res = sethostname(buf.buf, buf.len);
4081 PyBuffer_Release(&buf);
4082 }
4083 if (flag)
4084 Py_DECREF(hnobj);
4085 if (res)
4086 return set_error();
4087 Py_RETURN_NONE;
4088}
4089#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004090
Guido van Rossum30a685f1991-06-27 15:51:29 +00004091/* Python interface to gethostbyname(name). */
4092
4093/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004094static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004095socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004097 char *name;
4098 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004099 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004100
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004101 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 return NULL;
4103 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004104 goto finally;
4105 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4106finally:
4107 PyMem_Free(name);
4108 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004109}
4110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004111PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004112"gethostbyname(host) -> address\n\
4113\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004114Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004115
4116
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004117/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4118
4119static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004120gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 char **pch;
4123 PyObject *rtn_tuple = (PyObject *)NULL;
4124 PyObject *name_list = (PyObject *)NULL;
4125 PyObject *addr_list = (PyObject *)NULL;
4126 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 if (h == NULL) {
4129 /* Let's get real error message to return */
4130 set_herror(h_errno);
4131 return NULL;
4132 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 if (h->h_addrtype != af) {
4135 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004136 errno = EAFNOSUPPORT;
4137 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 return NULL;
4139 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 case AF_INET:
4144 if (alen < sizeof(struct sockaddr_in))
4145 return NULL;
4146 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004147
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004148#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 case AF_INET6:
4150 if (alen < sizeof(struct sockaddr_in6))
4151 return NULL;
4152 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004153#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 if ((name_list = PyList_New(0)) == NULL)
4158 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 if ((addr_list = PyList_New(0)) == NULL)
4161 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 /* SF #1511317: h_aliases can be NULL */
4164 if (h->h_aliases) {
4165 for (pch = h->h_aliases; *pch != NULL; pch++) {
4166 int status;
4167 tmp = PyUnicode_FromString(*pch);
4168 if (tmp == NULL)
4169 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 status = PyList_Append(name_list, tmp);
4172 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 if (status)
4175 goto err;
4176 }
4177 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4180 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 case AF_INET:
4185 {
4186 struct sockaddr_in sin;
4187 memset(&sin, 0, sizeof(sin));
4188 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004189#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4193 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 if (pch == h->h_addr_list && alen >= sizeof(sin))
4196 memcpy((char *) addr, &sin, sizeof(sin));
4197 break;
4198 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004199
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004200#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 case AF_INET6:
4202 {
4203 struct sockaddr_in6 sin6;
4204 memset(&sin6, 0, sizeof(sin6));
4205 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004206#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4210 tmp = makeipaddr((struct sockaddr *)&sin6,
4211 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004213 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4214 memcpy((char *) addr, &sin6, sizeof(sin6));
4215 break;
4216 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004217#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004220 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221 "unsupported address family");
4222 return NULL;
4223 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 if (tmp == NULL)
4226 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 status = PyList_Append(addr_list, tmp);
4229 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004231 if (status)
4232 goto err;
4233 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004236
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004237 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 Py_XDECREF(name_list);
4239 Py_XDECREF(addr_list);
4240 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004241}
4242
4243
4244/* Python interface to gethostbyname_ex(name). */
4245
4246/*ARGSUSED*/
4247static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004248socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004250 char *name;
4251 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004252 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004254 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004255#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004257#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004259#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 char buf[16384];
4261 int buf_len = (sizeof buf) - 1;
4262 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004263#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004264#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004266#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004267#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004268
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004269 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004271 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004272 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004274#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004275#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004276 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004278#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004280#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 memset((void *) &data, '\0', sizeof(data));
4282 result = gethostbyname_r(name, &hp_allocated, &data);
4283 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004284#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004285#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004286#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004290#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 Py_END_ALLOW_THREADS
4292 /* Some C libraries would require addr.__ss_family instead of
4293 addr.ss_family.
4294 Therefore, we cast the sockaddr_storage into sockaddr to
4295 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004296 sa = SAS2SA(&addr);
4297 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004299#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004301#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004302finally:
4303 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004305}
4306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004307PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004308"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4309\n\
4310Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004311for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004312
4313
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004314/* Python interface to gethostbyaddr(IP). */
4315
4316/*ARGSUSED*/
4317static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004318socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004319{
Charles-François Natali8b759652011-12-23 16:44:51 +01004320 sock_addr_t addr;
4321 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 char *ip_num;
4323 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004324 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004325#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004327#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004329#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 /* glibcs up to 2.10 assume that the buf argument to
4331 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4332 does not ensure. The attribute below instructs the compiler
4333 to maintain this alignment. */
4334 char buf[16384] Py_ALIGNED(8);
4335 int buf_len = (sizeof buf) - 1;
4336 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004337#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004338#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004340#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004341#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 char *ap;
4343 int al;
4344 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004345
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004346 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 return NULL;
4348 af = AF_UNSPEC;
4349 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004350 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 af = sa->sa_family;
4352 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004353 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 switch (af) {
4355 case AF_INET:
4356 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4357 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4358 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004359#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 case AF_INET6:
4361 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4362 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4363 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004366 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004367 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 }
4369 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004370#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004371#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004372 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 &hp_allocated, buf, buf_len,
4374 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004375#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 h = gethostbyaddr_r(ap, al, af,
4377 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004378#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 memset((void *) &data, '\0', sizeof(data));
4380 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4381 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004382#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004383#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004384#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004388#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004390 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004391#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004393#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004394finally:
4395 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004396 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004397}
4398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004399PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004400"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4401\n\
4402Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004403for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004404
Guido van Rossum30a685f1991-06-27 15:51:29 +00004405
4406/* Python interface to getservbyname(name).
4407 This only returns the port number, since the other info is already
4408 known or not useful (like the list of aliases). */
4409
4410/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004411static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004412socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 char *name, *proto=NULL;
4415 struct servent *sp;
4416 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4417 return NULL;
4418 Py_BEGIN_ALLOW_THREADS
4419 sp = getservbyname(name, proto);
4420 Py_END_ALLOW_THREADS
4421 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004422 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 return NULL;
4424 }
4425 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004426}
4427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004428PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004429"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004430\n\
4431Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004432The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4433otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004434
Guido van Rossum30a685f1991-06-27 15:51:29 +00004435
Barry Warsaw11b91a02004-06-28 00:50:43 +00004436/* Python interface to getservbyport(port).
4437 This only returns the service name, since the other info is already
4438 known or not useful (like the list of aliases). */
4439
4440/*ARGSUSED*/
4441static PyObject *
4442socket_getservbyport(PyObject *self, PyObject *args)
4443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 int port;
4445 char *proto=NULL;
4446 struct servent *sp;
4447 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4448 return NULL;
4449 if (port < 0 || port > 0xffff) {
4450 PyErr_SetString(
4451 PyExc_OverflowError,
4452 "getservbyport: port must be 0-65535.");
4453 return NULL;
4454 }
4455 Py_BEGIN_ALLOW_THREADS
4456 sp = getservbyport(htons((short)port), proto);
4457 Py_END_ALLOW_THREADS
4458 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004459 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 return NULL;
4461 }
4462 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004463}
4464
4465PyDoc_STRVAR(getservbyport_doc,
4466"getservbyport(port[, protocolname]) -> string\n\
4467\n\
4468Return the service name from a port number and protocol name.\n\
4469The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4470otherwise any protocol will match.");
4471
Guido van Rossum3901d851996-12-19 16:35:04 +00004472/* Python interface to getprotobyname(name).
4473 This only returns the protocol number, since the other info is
4474 already known or not useful (like the list of aliases). */
4475
4476/*ARGSUSED*/
4477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004478socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004480 char *name;
4481 struct protoent *sp;
4482 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4483 return NULL;
4484 Py_BEGIN_ALLOW_THREADS
4485 sp = getprotobyname(name);
4486 Py_END_ALLOW_THREADS
4487 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004488 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 return NULL;
4490 }
4491 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004492}
4493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004494PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004495"getprotobyname(name) -> integer\n\
4496\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004497Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004498
Guido van Rossum3901d851996-12-19 16:35:04 +00004499
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004500#ifndef NO_DUP
4501/* dup() function for socket fds */
4502
4503static PyObject *
4504socket_dup(PyObject *self, PyObject *fdobj)
4505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 SOCKET_T fd, newfd;
4507 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004508
4509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 fd = PyLong_AsSocket_t(fdobj);
4511 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4512 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 newfd = dup_socket(fd);
4515 if (newfd == INVALID_SOCKET)
4516 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 newfdobj = PyLong_FromSocket_t(newfd);
4519 if (newfdobj == NULL)
4520 SOCKETCLOSE(newfd);
4521 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004522}
4523
4524PyDoc_STRVAR(dup_doc,
4525"dup(integer) -> integer\n\
4526\n\
4527Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4528sockets; on some platforms os.dup() won't work for socket file descriptors.");
4529#endif
4530
4531
Dave Cole331708b2004-08-09 04:51:41 +00004532#ifdef HAVE_SOCKETPAIR
4533/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004534 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004535 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004536
4537/*ARGSUSED*/
4538static PyObject *
4539socket_socketpair(PyObject *self, PyObject *args)
4540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 PySocketSockObject *s0 = NULL, *s1 = NULL;
4542 SOCKET_T sv[2];
4543 int family, type = SOCK_STREAM, proto = 0;
4544 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004545
4546#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004548#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4552 &family, &type, &proto))
4553 return NULL;
4554 /* Create a pair of socket fds */
4555 if (socketpair(family, type, proto, sv) < 0)
4556 return set_error();
4557 s0 = new_sockobject(sv[0], family, type, proto);
4558 if (s0 == NULL)
4559 goto finally;
4560 s1 = new_sockobject(sv[1], family, type, proto);
4561 if (s1 == NULL)
4562 goto finally;
4563 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004564
4565finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 if (res == NULL) {
4567 if (s0 == NULL)
4568 SOCKETCLOSE(sv[0]);
4569 if (s1 == NULL)
4570 SOCKETCLOSE(sv[1]);
4571 }
4572 Py_XDECREF(s0);
4573 Py_XDECREF(s1);
4574 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004575}
4576
4577PyDoc_STRVAR(socketpair_doc,
4578"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4579\n\
4580Create a pair of socket objects from the sockets returned by the platform\n\
4581socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004582The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004583AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004584
4585#endif /* HAVE_SOCKETPAIR */
4586
4587
Guido van Rossum006bf911996-06-12 04:04:55 +00004588static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004589socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4594 return NULL;
4595 }
4596 if (x1 < 0) {
4597 PyErr_SetString(PyExc_OverflowError,
4598 "can't convert negative number to unsigned long");
4599 return NULL;
4600 }
4601 x2 = (unsigned int)ntohs((unsigned short)x1);
4602 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004603}
4604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004605PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606"ntohs(integer) -> integer\n\
4607\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004608Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004609
4610
Guido van Rossum006bf911996-06-12 04:04:55 +00004611static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004612socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 if (PyLong_Check(arg)) {
4617 x = PyLong_AsUnsignedLong(arg);
4618 if (x == (unsigned long) -1 && PyErr_Occurred())
4619 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004620#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 {
4622 unsigned long y;
4623 /* only want the trailing 32 bits */
4624 y = x & 0xFFFFFFFFUL;
4625 if (y ^ x)
4626 return PyErr_Format(PyExc_OverflowError,
4627 "long int larger than 32 bits");
4628 x = y;
4629 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 }
4632 else
4633 return PyErr_Format(PyExc_TypeError,
4634 "expected int/long, %s found",
4635 Py_TYPE(arg)->tp_name);
4636 if (x == (unsigned long) -1 && PyErr_Occurred())
4637 return NULL;
4638 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004639}
4640
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004641PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004642"ntohl(integer) -> integer\n\
4643\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004644Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004645
4646
Guido van Rossum006bf911996-06-12 04:04:55 +00004647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004648socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4653 return NULL;
4654 }
4655 if (x1 < 0) {
4656 PyErr_SetString(PyExc_OverflowError,
4657 "can't convert negative number to unsigned long");
4658 return NULL;
4659 }
4660 x2 = (unsigned int)htons((unsigned short)x1);
4661 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004662}
4663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004664PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004665"htons(integer) -> integer\n\
4666\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004667Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004668
4669
Guido van Rossum006bf911996-06-12 04:04:55 +00004670static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004671socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 if (PyLong_Check(arg)) {
4676 x = PyLong_AsUnsignedLong(arg);
4677 if (x == (unsigned long) -1 && PyErr_Occurred())
4678 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004679#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 {
4681 unsigned long y;
4682 /* only want the trailing 32 bits */
4683 y = x & 0xFFFFFFFFUL;
4684 if (y ^ x)
4685 return PyErr_Format(PyExc_OverflowError,
4686 "long int larger than 32 bits");
4687 x = y;
4688 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 }
4691 else
4692 return PyErr_Format(PyExc_TypeError,
4693 "expected int/long, %s found",
4694 Py_TYPE(arg)->tp_name);
4695 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004696}
4697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004698PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004699"htonl(integer) -> integer\n\
4700\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004701Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004702
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004703/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004705PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004706"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004707\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004708Convert 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 +00004709binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004710
4711static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004712socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004713{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004714#ifndef INADDR_NONE
4715#define INADDR_NONE (-1)
4716#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004717#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004719#endif
4720
4721#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004722#if (SIZEOF_INT != 4)
4723#error "Not sure if in_addr_t exists and int is not 32-bits."
4724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 /* Have to use inet_addr() instead */
4726 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4731 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004732
Tim Peters1df9fdd2003-02-13 03:13:40 +00004733
4734#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004735
4736#ifdef USE_INET_ATON_WEAKLINK
4737 if (inet_aton != NULL) {
4738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 if (inet_aton(ip_addr, &buf))
4740 return PyBytes_FromStringAndSize((char *)(&buf),
4741 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004742
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004743 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 "illegal IP address string passed to inet_aton");
4745 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004746
Thomas Wouters477c8d52006-05-27 19:21:47 +00004747#ifdef USE_INET_ATON_WEAKLINK
4748 } else {
4749#endif
4750
4751#endif
4752
4753#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 /* special-case this address as inet_addr might return INADDR_NONE
4756 * for this */
4757 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4758 packed_addr = 0xFFFFFFFF;
4759 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004764 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 "illegal IP address string passed to inet_aton");
4766 return NULL;
4767 }
4768 }
4769 return PyBytes_FromStringAndSize((char *) &packed_addr,
4770 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004771
4772#ifdef USE_INET_ATON_WEAKLINK
4773 }
4774#endif
4775
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004776#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004777}
4778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004779PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004780"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004781\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004782Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004783
4784static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004785socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 char *packed_str;
4788 int addr_len;
4789 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4792 return NULL;
4793 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004796 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 "packed IP wrong length for inet_ntoa");
4798 return NULL;
4799 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004804}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004805
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004806#ifdef HAVE_INET_PTON
4807
4808PyDoc_STRVAR(inet_pton_doc,
4809"inet_pton(af, ip) -> packed IP address string\n\
4810\n\
4811Convert an IP address from string format to a packed string suitable\n\
4812for use with low-level network functions.");
4813
4814static PyObject *
4815socket_inet_pton(PyObject *self, PyObject *args)
4816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 int af;
4818 char* ip;
4819 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004820#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004822#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4826 return NULL;
4827 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004828
Martin v. Löwis04697e82004-06-02 12:35:29 +00004829#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004831 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 "can't use AF_INET6, IPv6 is disabled");
4833 return NULL;
4834 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004835#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 retval = inet_pton(af, ip, packed);
4838 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004839 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 return NULL;
4841 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004842 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 "illegal IP address string passed to inet_pton");
4844 return NULL;
4845 } else if (af == AF_INET) {
4846 return PyBytes_FromStringAndSize(packed,
4847 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004848#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 } else if (af == AF_INET6) {
4850 return PyBytes_FromStringAndSize(packed,
4851 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004854 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 return NULL;
4856 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004857}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004858
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004859PyDoc_STRVAR(inet_ntop_doc,
4860"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4861\n\
4862Convert a packed IP address of the given family to string format.");
4863
4864static PyObject *
4865socket_inet_ntop(PyObject *self, PyObject *args)
4866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 int af;
4868 char* packed;
4869 int len;
4870 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004871#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004873#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004875#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4878 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4881 return NULL;
4882 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 if (af == AF_INET) {
4885 if (len != sizeof(struct in_addr)) {
4886 PyErr_SetString(PyExc_ValueError,
4887 "invalid length of packed IP address string");
4888 return NULL;
4889 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004890#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 } else if (af == AF_INET6) {
4892 if (len != sizeof(struct in6_addr)) {
4893 PyErr_SetString(PyExc_ValueError,
4894 "invalid length of packed IP address string");
4895 return NULL;
4896 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 } else {
4899 PyErr_Format(PyExc_ValueError,
4900 "unknown address family %d", af);
4901 return NULL;
4902 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 retval = inet_ntop(af, packed, ip, sizeof(ip));
4905 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004906 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 return NULL;
4908 } else {
4909 return PyUnicode_FromString(retval);
4910 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 /* NOTREACHED */
4913 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4914 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004915}
4916
4917#endif /* HAVE_INET_PTON */
4918
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004919/* Python interface to getaddrinfo(host, port). */
4920
4921/*ARGSUSED*/
4922static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004923socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004924{
Victor Stinner77af1722011-05-26 14:05:59 +02004925 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004926 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 struct addrinfo hints, *res;
4928 struct addrinfo *res0 = NULL;
4929 PyObject *hobj = NULL;
4930 PyObject *pobj = (PyObject *)NULL;
4931 char pbuf[30];
4932 char *hptr, *pptr;
4933 int family, socktype, protocol, flags;
4934 int error;
4935 PyObject *all = (PyObject *)NULL;
4936 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 family = socktype = protocol = flags = 0;
4939 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004940 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004941 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 &protocol, &flags)) {
4943 return NULL;
4944 }
4945 if (hobj == Py_None) {
4946 hptr = NULL;
4947 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004948 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004949
4950 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 if (!idna)
4952 return NULL;
4953 assert(PyBytes_Check(idna));
4954 hptr = PyBytes_AS_STRING(idna);
4955 } else if (PyBytes_Check(hobj)) {
4956 hptr = PyBytes_AsString(hobj);
4957 } else {
4958 PyErr_SetString(PyExc_TypeError,
4959 "getaddrinfo() argument 1 must be string or None");
4960 return NULL;
4961 }
4962 if (PyLong_CheckExact(pobj)) {
4963 long value = PyLong_AsLong(pobj);
4964 if (value == -1 && PyErr_Occurred())
4965 goto err;
4966 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4967 pptr = pbuf;
4968 } else if (PyUnicode_Check(pobj)) {
4969 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004970 if (pptr == NULL)
4971 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004973 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 } else if (pobj == Py_None) {
4975 pptr = (char *)NULL;
4976 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004977 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 goto err;
4979 }
4980 memset(&hints, 0, sizeof(hints));
4981 hints.ai_family = family;
4982 hints.ai_socktype = socktype;
4983 hints.ai_protocol = protocol;
4984 hints.ai_flags = flags;
4985 Py_BEGIN_ALLOW_THREADS
4986 ACQUIRE_GETADDRINFO_LOCK
4987 error = getaddrinfo(hptr, pptr, &hints, &res0);
4988 Py_END_ALLOW_THREADS
4989 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4990 if (error) {
4991 set_gaierror(error);
4992 goto err;
4993 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 if ((all = PyList_New(0)) == NULL)
4996 goto err;
4997 for (res = res0; res; res = res->ai_next) {
4998 PyObject *single;
4999 PyObject *addr =
5000 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5001 if (addr == NULL)
5002 goto err;
5003 single = Py_BuildValue("iiisO", res->ai_family,
5004 res->ai_socktype, res->ai_protocol,
5005 res->ai_canonname ? res->ai_canonname : "",
5006 addr);
5007 Py_DECREF(addr);
5008 if (single == NULL)
5009 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 if (PyList_Append(all, single))
5012 goto err;
5013 Py_XDECREF(single);
5014 }
5015 Py_XDECREF(idna);
5016 if (res0)
5017 freeaddrinfo(res0);
5018 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005019 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 Py_XDECREF(all);
5021 Py_XDECREF(idna);
5022 if (res0)
5023 freeaddrinfo(res0);
5024 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005025}
5026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005027PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005028"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5029 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005030\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005031Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005032
5033/* Python interface to getnameinfo(sa, flags). */
5034
5035/*ARGSUSED*/
5036static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005037socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 PyObject *sa = (PyObject *)NULL;
5040 int flags;
5041 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005042 int port;
5043 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5045 struct addrinfo hints, *res = NULL;
5046 int error;
5047 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 flags = flowinfo = scope_id = 0;
5050 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5051 return NULL;
5052 if (!PyTuple_Check(sa)) {
5053 PyErr_SetString(PyExc_TypeError,
5054 "getnameinfo() argument 1 must be a tuple");
5055 return NULL;
5056 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005057 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 &hostp, &port, &flowinfo, &scope_id))
5059 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005060 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005061 PyErr_SetString(PyExc_OverflowError,
5062 "getsockaddrarg: flowinfo must be 0-1048575.");
5063 return NULL;
5064 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5066 memset(&hints, 0, sizeof(hints));
5067 hints.ai_family = AF_UNSPEC;
5068 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005069 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 Py_BEGIN_ALLOW_THREADS
5071 ACQUIRE_GETADDRINFO_LOCK
5072 error = getaddrinfo(hostp, pbuf, &hints, &res);
5073 Py_END_ALLOW_THREADS
5074 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5075 if (error) {
5076 set_gaierror(error);
5077 goto fail;
5078 }
5079 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005080 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 "sockaddr resolved to multiple addresses");
5082 goto fail;
5083 }
5084 switch (res->ai_family) {
5085 case AF_INET:
5086 {
5087 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005088 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 "IPv4 sockaddr must be 2 tuple");
5090 goto fail;
5091 }
5092 break;
5093 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005094#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 case AF_INET6:
5096 {
5097 struct sockaddr_in6 *sin6;
5098 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005099 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 sin6->sin6_scope_id = scope_id;
5101 break;
5102 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005105 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5107 if (error) {
5108 set_gaierror(error);
5109 goto fail;
5110 }
5111 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005112
5113fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 if (res)
5115 freeaddrinfo(res);
5116 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005117}
5118
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005119PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005120"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005121\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005122Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005123
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005124
5125/* Python API to getting and setting the default timeout value. */
5126
5127static PyObject *
5128socket_getdefaulttimeout(PyObject *self)
5129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 if (defaulttimeout < 0.0) {
5131 Py_INCREF(Py_None);
5132 return Py_None;
5133 }
5134 else
5135 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005136}
5137
5138PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005139"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005140\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005141Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005142A value of None indicates that new socket objects have no timeout.\n\
5143When the socket module is first imported, the default is None.");
5144
5145static PyObject *
5146socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 if (arg == Py_None)
5151 timeout = -1.0;
5152 else {
5153 timeout = PyFloat_AsDouble(arg);
5154 if (timeout < 0.0) {
5155 if (!PyErr_Occurred())
5156 PyErr_SetString(PyExc_ValueError,
5157 "Timeout value out of range");
5158 return NULL;
5159 }
5160 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 Py_INCREF(Py_None);
5165 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005166}
5167
5168PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005169"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005170\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005171Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005172A value of None indicates that new socket objects have no timeout.\n\
5173When the socket module is first imported, the default is None.");
5174
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005175#ifdef HAVE_IF_NAMEINDEX
5176/* Python API for getting interface indices and names */
5177
5178static PyObject *
5179socket_if_nameindex(PyObject *self, PyObject *arg)
5180{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005181 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005182 int i;
5183 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005184
Charles-François Natali60713592011-05-20 16:55:06 +02005185 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005186 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005187 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005188 return NULL;
5189 }
5190
5191 list = PyList_New(0);
5192 if (list == NULL) {
5193 if_freenameindex(ni);
5194 return NULL;
5195 }
5196
Charles-François Natali60713592011-05-20 16:55:06 +02005197 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5198 PyObject *ni_tuple = Py_BuildValue("IO&",
5199 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005200
5201 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5202 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005203 Py_DECREF(list);
5204 if_freenameindex(ni);
5205 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005206 }
5207 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005208 }
5209
5210 if_freenameindex(ni);
5211 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005212}
5213
5214PyDoc_STRVAR(if_nameindex_doc,
5215"if_nameindex()\n\
5216\n\
5217Returns a list of network interface information (index, name) tuples.");
5218
Charles-François Natali60713592011-05-20 16:55:06 +02005219static PyObject *
5220socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005221{
Charles-François Natali60713592011-05-20 16:55:06 +02005222 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005223 unsigned long index;
5224
Charles-François Natali60713592011-05-20 16:55:06 +02005225 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5226 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005227 return NULL;
5228
Charles-François Natali60713592011-05-20 16:55:06 +02005229 index = if_nametoindex(PyBytes_AS_STRING(oname));
5230 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005231 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005232 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005233 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005234 return NULL;
5235 }
5236
5237 return PyLong_FromUnsignedLong(index);
5238}
5239
5240PyDoc_STRVAR(if_nametoindex_doc,
5241"if_nametoindex(if_name)\n\
5242\n\
5243Returns the interface index corresponding to the interface name if_name.");
5244
Charles-François Natali60713592011-05-20 16:55:06 +02005245static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005246socket_if_indextoname(PyObject *self, PyObject *arg)
5247{
Charles-François Natali60713592011-05-20 16:55:06 +02005248 unsigned long index;
5249 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005250
Charles-François Natali60713592011-05-20 16:55:06 +02005251 index = PyLong_AsUnsignedLong(arg);
5252 if (index == (unsigned long) -1)
5253 return NULL;
5254
5255 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005256 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005257 return NULL;
5258 }
5259
Charles-François Natali60713592011-05-20 16:55:06 +02005260 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005261}
5262
5263PyDoc_STRVAR(if_indextoname_doc,
5264"if_indextoname(if_index)\n\
5265\n\
5266Returns the interface name corresponding to the interface index if_index.");
5267
5268#endif /* HAVE_IF_NAMEINDEX */
5269
5270
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005271#ifdef CMSG_LEN
5272/* Python interface to CMSG_LEN(length). */
5273
5274static PyObject *
5275socket_CMSG_LEN(PyObject *self, PyObject *args)
5276{
5277 Py_ssize_t length;
5278 size_t result;
5279
5280 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5281 return NULL;
5282 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5283 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5284 return NULL;
5285 }
5286 return PyLong_FromSize_t(result);
5287}
5288
5289PyDoc_STRVAR(CMSG_LEN_doc,
5290"CMSG_LEN(length) -> control message length\n\
5291\n\
5292Return the total length, without trailing padding, of an ancillary\n\
5293data item with associated data of the given length. This value can\n\
5294often be used as the buffer size for recvmsg() to receive a single\n\
5295item of ancillary data, but RFC 3542 requires portable applications to\n\
5296use CMSG_SPACE() and thus include space for padding, even when the\n\
5297item will be the last in the buffer. Raises OverflowError if length\n\
5298is outside the permissible range of values.");
5299
5300
5301#ifdef CMSG_SPACE
5302/* Python interface to CMSG_SPACE(length). */
5303
5304static PyObject *
5305socket_CMSG_SPACE(PyObject *self, PyObject *args)
5306{
5307 Py_ssize_t length;
5308 size_t result;
5309
5310 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5311 return NULL;
5312 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5313 PyErr_SetString(PyExc_OverflowError,
5314 "CMSG_SPACE() argument out of range");
5315 return NULL;
5316 }
5317 return PyLong_FromSize_t(result);
5318}
5319
5320PyDoc_STRVAR(CMSG_SPACE_doc,
5321"CMSG_SPACE(length) -> buffer size\n\
5322\n\
5323Return the buffer size needed for recvmsg() to receive an ancillary\n\
5324data item with associated data of the given length, along with any\n\
5325trailing padding. The buffer space needed to receive multiple items\n\
5326is the sum of the CMSG_SPACE() values for their associated data\n\
5327lengths. Raises OverflowError if length is outside the permissible\n\
5328range of values.");
5329#endif /* CMSG_SPACE */
5330#endif /* CMSG_LEN */
5331
5332
Guido van Rossum30a685f1991-06-27 15:51:29 +00005333/* List of functions exported by this module. */
5334
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005335static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 {"gethostbyname", socket_gethostbyname,
5337 METH_VARARGS, gethostbyname_doc},
5338 {"gethostbyname_ex", socket_gethostbyname_ex,
5339 METH_VARARGS, ghbn_ex_doc},
5340 {"gethostbyaddr", socket_gethostbyaddr,
5341 METH_VARARGS, gethostbyaddr_doc},
5342 {"gethostname", socket_gethostname,
5343 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005344#ifdef HAVE_SETHOSTNAME
5345 {"sethostname", socket_sethostname,
5346 METH_VARARGS, sethostname_doc},
5347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 {"getservbyname", socket_getservbyname,
5349 METH_VARARGS, getservbyname_doc},
5350 {"getservbyport", socket_getservbyport,
5351 METH_VARARGS, getservbyport_doc},
5352 {"getprotobyname", socket_getprotobyname,
5353 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005354#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 {"dup", socket_dup,
5356 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005357#endif
Dave Cole331708b2004-08-09 04:51:41 +00005358#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 {"socketpair", socket_socketpair,
5360 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 {"ntohs", socket_ntohs,
5363 METH_VARARGS, ntohs_doc},
5364 {"ntohl", socket_ntohl,
5365 METH_O, ntohl_doc},
5366 {"htons", socket_htons,
5367 METH_VARARGS, htons_doc},
5368 {"htonl", socket_htonl,
5369 METH_O, htonl_doc},
5370 {"inet_aton", socket_inet_aton,
5371 METH_VARARGS, inet_aton_doc},
5372 {"inet_ntoa", socket_inet_ntoa,
5373 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005374#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 {"inet_pton", socket_inet_pton,
5376 METH_VARARGS, inet_pton_doc},
5377 {"inet_ntop", socket_inet_ntop,
5378 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005379#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005380 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5381 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 {"getnameinfo", socket_getnameinfo,
5383 METH_VARARGS, getnameinfo_doc},
5384 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5385 METH_NOARGS, getdefaulttimeout_doc},
5386 {"setdefaulttimeout", socket_setdefaulttimeout,
5387 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005388#ifdef HAVE_IF_NAMEINDEX
5389 {"if_nameindex", socket_if_nameindex,
5390 METH_NOARGS, if_nameindex_doc},
5391 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005392 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005393 {"if_indextoname", socket_if_indextoname,
5394 METH_O, if_indextoname_doc},
5395#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005396#ifdef CMSG_LEN
5397 {"CMSG_LEN", socket_CMSG_LEN,
5398 METH_VARARGS, CMSG_LEN_doc},
5399#ifdef CMSG_SPACE
5400 {"CMSG_SPACE", socket_CMSG_SPACE,
5401 METH_VARARGS, CMSG_SPACE_doc},
5402#endif
5403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005405};
5406
Guido van Rossum30a685f1991-06-27 15:51:29 +00005407
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005408#ifdef MS_WINDOWS
5409#define OS_INIT_DEFINED
5410
5411/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005412
5413static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005414os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005417}
5418
5419static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005420os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 WSADATA WSAData;
5423 int ret;
5424 ret = WSAStartup(0x0101, &WSAData);
5425 switch (ret) {
5426 case 0: /* No error */
5427 Py_AtExit(os_cleanup);
5428 return 1; /* Success */
5429 case WSASYSNOTREADY:
5430 PyErr_SetString(PyExc_ImportError,
5431 "WSAStartup failed: network not ready");
5432 break;
5433 case WSAVERNOTSUPPORTED:
5434 case WSAEINVAL:
5435 PyErr_SetString(
5436 PyExc_ImportError,
5437 "WSAStartup failed: requested version not supported");
5438 break;
5439 default:
5440 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5441 break;
5442 }
5443 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005444}
5445
Guido van Rossum8d665e61996-06-26 18:22:49 +00005446#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005447
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005448
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005449
5450#ifndef OS_INIT_DEFINED
5451static int
5452os_init(void)
5453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005455}
5456#endif
5457
5458
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005459/* C API table - always add new things to the end for binary
5460 compatibility. */
5461static
5462PySocketModule_APIObject PySocketModuleAPI =
5463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005465 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005467};
5468
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005469
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005470/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005471
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005472 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005473 "socket.py" which implements some additional functionality.
5474 The import of "_socket" may fail with an ImportError exception if
5475 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005476 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005477 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005478*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005480PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005481"Implementation module for socket operations.\n\
5482\n\
5483See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005484
Martin v. Löwis1a214512008-06-11 05:26:20 +00005485static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 PyModuleDef_HEAD_INIT,
5487 PySocket_MODULE_NAME,
5488 socket_doc,
5489 -1,
5490 socket_methods,
5491 NULL,
5492 NULL,
5493 NULL,
5494 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005495};
5496
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005497PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005498PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005499{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 if (!os_init())
5503 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 Py_TYPE(&sock_type) = &PyType_Type;
5506 m = PyModule_Create(&socketmodule);
5507 if (m == NULL)
5508 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005509
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005510 Py_INCREF(PyExc_OSError);
5511 PySocketModuleAPI.error = PyExc_OSError;
5512 Py_INCREF(PyExc_OSError);
5513 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005515 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 if (socket_herror == NULL)
5517 return NULL;
5518 Py_INCREF(socket_herror);
5519 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005520 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 NULL);
5522 if (socket_gaierror == NULL)
5523 return NULL;
5524 Py_INCREF(socket_gaierror);
5525 PyModule_AddObject(m, "gaierror", socket_gaierror);
5526 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005527 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 if (socket_timeout == NULL)
5529 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005530 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 Py_INCREF(socket_timeout);
5532 PyModule_AddObject(m, "timeout", socket_timeout);
5533 Py_INCREF((PyObject *)&sock_type);
5534 if (PyModule_AddObject(m, "SocketType",
5535 (PyObject *)&sock_type) != 0)
5536 return NULL;
5537 Py_INCREF((PyObject *)&sock_type);
5538 if (PyModule_AddObject(m, "socket",
5539 (PyObject *)&sock_type) != 0)
5540 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005541
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005542#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005544#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 Py_INCREF(has_ipv6);
5548 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 /* Export C API */
5551 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5552 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5553 ) != 0)
5554 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005557#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005561#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005563#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005564#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005566#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005567#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 /* Amateur Radio AX.25 */
5569 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005570#endif
5571#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005573#endif
5574#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 /* Appletalk DDP */
5576 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005577#endif
5578#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 /* Amateur radio NetROM */
5580 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005581#endif
5582#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 /* Multiprotocol bridge */
5584 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005585#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005586#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 /* ATM PVCs */
5588 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005589#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005590#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 /* Reserved for Werner's ATM */
5592 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005593#endif
5594#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 /* Reserved for X.25 project */
5596 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005597#endif
5598#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005600#endif
5601#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 /* Amateur Radio X.25 PLP */
5603 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005604#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005605#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 /* Reserved for DECnet project */
5607 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005608#endif
5609#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 /* Reserved for 802.2LLC project */
5611 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005612#endif
5613#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 /* Security callback pseudo AF */
5615 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005616#endif
5617#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 /* PF_KEY key management API */
5619 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005620#endif
5621#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 /* */
5623 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5624 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005625#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005627#endif
5628#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5632 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005633#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005635#endif
5636#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005638#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005639#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005641#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005642#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005644#endif
5645#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005649#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005651#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005652#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005654#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005655#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005656#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 /* Alias to emulate 4.4BSD */
5658 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005659#endif
5660#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 /* Ash */
5662 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005663#endif
5664#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 /* Acorn Econet */
5666 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005667#endif
5668#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 /* ATM SVCs */
5670 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005671#endif
5672#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 /* Linux SNA Project (nutters!) */
5674 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005675#endif
5676#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 /* IRDA sockets */
5678 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005679#endif
5680#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 /* PPPoX sockets */
5682 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005683#endif
5684#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 /* Wanpipe API Sockets */
5686 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005687#endif
5688#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 /* Linux LLC */
5690 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005691#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005692
Hye-Shik Chang81268602004-02-02 06:05:24 +00005693#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5695 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5696 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5697 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005698#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005700#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005701#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005702#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5706 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5709 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5710 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005711#endif
5712
Charles-François Natali47413c12011-10-06 19:47:44 +02005713#ifdef AF_CAN
5714 /* Controller Area Network */
5715 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5716#endif
5717#ifdef PF_CAN
5718 /* Controller Area Network */
5719 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5720#endif
5721
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005722/* Reliable Datagram Sockets */
5723#ifdef AF_RDS
5724 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5725#endif
5726#ifdef PF_RDS
5727 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5728#endif
5729
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005730/* Kernel event messages */
5731#ifdef PF_SYSTEM
5732 PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
5733#endif
5734#ifdef AF_SYSTEM
5735 PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
5736#endif
5737
Antoine Pitroub156a462010-10-27 20:13:57 +00005738#ifdef AF_PACKET
5739 PyModule_AddIntMacro(m, AF_PACKET);
5740#endif
5741#ifdef PF_PACKET
5742 PyModule_AddIntMacro(m, PF_PACKET);
5743#endif
5744#ifdef PACKET_HOST
5745 PyModule_AddIntMacro(m, PACKET_HOST);
5746#endif
5747#ifdef PACKET_BROADCAST
5748 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5749#endif
5750#ifdef PACKET_MULTICAST
5751 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5752#endif
5753#ifdef PACKET_OTHERHOST
5754 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5755#endif
5756#ifdef PACKET_OUTGOING
5757 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5758#endif
5759#ifdef PACKET_LOOPBACK
5760 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5761#endif
5762#ifdef PACKET_FASTROUTE
5763 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005764#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005765
Christian Heimes043d6f62008-01-07 17:19:16 +00005766#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 /* for addresses */
5770 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5771 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5772 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5775 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5776 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 /* for setsockopt() */
5779 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5780 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5781 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5782 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5783 TIPC_DEST_DROPPABLE);
5784 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5787 TIPC_LOW_IMPORTANCE);
5788 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5789 TIPC_MEDIUM_IMPORTANCE);
5790 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5791 TIPC_HIGH_IMPORTANCE);
5792 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5793 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 /* for subscriptions */
5796 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5797 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005798#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 /* doesn't seem to be available everywhere */
5800 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5803 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5804 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5805 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5806 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5807 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005808#endif
5809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 /* Socket types */
5811 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5812 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005813/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5815 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005816#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005818#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005819#ifdef SOCK_CLOEXEC
5820 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5821#endif
5822#ifdef SOCK_NONBLOCK
5823 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5824#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826#ifdef SO_DEBUG
5827 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829#ifdef SO_ACCEPTCONN
5830 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832#ifdef SO_REUSEADDR
5833 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005834#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005835#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005837#endif
5838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839#ifdef SO_KEEPALIVE
5840 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842#ifdef SO_DONTROUTE
5843 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845#ifdef SO_BROADCAST
5846 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848#ifdef SO_USELOOPBACK
5849 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851#ifdef SO_LINGER
5852 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854#ifdef SO_OOBINLINE
5855 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857#ifdef SO_REUSEPORT
5858 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860#ifdef SO_SNDBUF
5861 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863#ifdef SO_RCVBUF
5864 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866#ifdef SO_SNDLOWAT
5867 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869#ifdef SO_RCVLOWAT
5870 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872#ifdef SO_SNDTIMEO
5873 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875#ifdef SO_RCVTIMEO
5876 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878#ifdef SO_ERROR
5879 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881#ifdef SO_TYPE
5882 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884#ifdef SO_SETFIB
5885 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005886#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005887#ifdef SO_PASSCRED
5888 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5889#endif
5890#ifdef SO_PEERCRED
5891 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5892#endif
5893#ifdef LOCAL_PEERCRED
5894 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5895#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005896#ifdef SO_BINDTODEVICE
5897 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5898#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 /* Maximum number of connections for "listen" */
5901#ifdef SOMAXCONN
5902 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005905#endif
5906
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005907 /* Ancilliary message types */
5908#ifdef SCM_RIGHTS
5909 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5910#endif
5911#ifdef SCM_CREDENTIALS
5912 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5913#endif
5914#ifdef SCM_CREDS
5915 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5916#endif
5917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 /* Flags for send, recv */
5919#ifdef MSG_OOB
5920 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922#ifdef MSG_PEEK
5923 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925#ifdef MSG_DONTROUTE
5926 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928#ifdef MSG_DONTWAIT
5929 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931#ifdef MSG_EOR
5932 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934#ifdef MSG_TRUNC
5935 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937#ifdef MSG_CTRUNC
5938 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940#ifdef MSG_WAITALL
5941 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943#ifdef MSG_BTAG
5944 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946#ifdef MSG_ETAG
5947 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005948#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005949#ifdef MSG_NOSIGNAL
5950 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5951#endif
5952#ifdef MSG_NOTIFICATION
5953 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5954#endif
5955#ifdef MSG_CMSG_CLOEXEC
5956 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5957#endif
5958#ifdef MSG_ERRQUEUE
5959 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5960#endif
5961#ifdef MSG_CONFIRM
5962 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5963#endif
5964#ifdef MSG_MORE
5965 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5966#endif
5967#ifdef MSG_EOF
5968 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5969#endif
5970#ifdef MSG_BCAST
5971 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5972#endif
5973#ifdef MSG_MCAST
5974 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5975#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05005976#ifdef MSG_FASTOPEN
5977 PyModule_AddIntConstant(m, "MSG_FASTOPEN", MSG_FASTOPEN);
5978#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 /* Protocol level and numbers, usable for [gs]etsockopt */
5981#ifdef SOL_SOCKET
5982 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984#ifdef SOL_IP
5985 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005986#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989#ifdef SOL_IPX
5990 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992#ifdef SOL_AX25
5993 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995#ifdef SOL_ATALK
5996 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998#ifdef SOL_NETROM
5999 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001#ifdef SOL_ROSE
6002 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004#ifdef SOL_TCP
6005 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006006#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009#ifdef SOL_UDP
6010 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006011#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006013#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006014#ifdef SOL_CAN_BASE
6015 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
6016#endif
6017#ifdef SOL_CAN_RAW
6018 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
6019 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
6020#endif
6021#ifdef HAVE_LINUX_CAN_H
6022 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
6023 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
6024 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
6025
6026 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
6027 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
6028 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
6029#endif
6030#ifdef HAVE_LINUX_CAN_RAW_H
6031 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
6032 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
6033 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
6034 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
6035#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006036#ifdef HAVE_LINUX_CAN_BCM_H
6037 PyModule_AddIntConstant(m, "CAN_BCM", CAN_BCM);
6038 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6039 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6040 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6041 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6042 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6043 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6044 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6045 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6046 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6047 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6048 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6049 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6050#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006051#ifdef SOL_RDS
6052 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
6053#endif
6054#ifdef RDS_CANCEL_SENT_TO
6055 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
6056#endif
6057#ifdef RDS_GET_MR
6058 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
6059#endif
6060#ifdef RDS_FREE_MR
6061 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
6062#endif
6063#ifdef RDS_RECVERR
6064 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
6065#endif
6066#ifdef RDS_CONG_MONITOR
6067 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
6068#endif
6069#ifdef RDS_GET_MR_FOR_DEST
6070 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
6071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072#ifdef IPPROTO_IP
6073 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006074#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077#ifdef IPPROTO_HOPOPTS
6078 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080#ifdef IPPROTO_ICMP
6081 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006082#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006084#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085#ifdef IPPROTO_IGMP
6086 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006087#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088#ifdef IPPROTO_GGP
6089 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091#ifdef IPPROTO_IPV4
6092 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094#ifdef IPPROTO_IPV6
6095 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006096#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097#ifdef IPPROTO_IPIP
6098 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100#ifdef IPPROTO_TCP
6101 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006102#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105#ifdef IPPROTO_EGP
6106 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108#ifdef IPPROTO_PUP
6109 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111#ifdef IPPROTO_UDP
6112 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006113#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116#ifdef IPPROTO_IDP
6117 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119#ifdef IPPROTO_HELLO
6120 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122#ifdef IPPROTO_ND
6123 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125#ifdef IPPROTO_TP
6126 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006127#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128#ifdef IPPROTO_IPV6
6129 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131#ifdef IPPROTO_ROUTING
6132 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134#ifdef IPPROTO_FRAGMENT
6135 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137#ifdef IPPROTO_RSVP
6138 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140#ifdef IPPROTO_GRE
6141 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143#ifdef IPPROTO_ESP
6144 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146#ifdef IPPROTO_AH
6147 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149#ifdef IPPROTO_MOBILE
6150 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152#ifdef IPPROTO_ICMPV6
6153 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155#ifdef IPPROTO_NONE
6156 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158#ifdef IPPROTO_DSTOPTS
6159 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161#ifdef IPPROTO_XTP
6162 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164#ifdef IPPROTO_EON
6165 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167#ifdef IPPROTO_PIM
6168 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170#ifdef IPPROTO_IPCOMP
6171 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006172#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173#ifdef IPPROTO_VRRP
6174 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006175#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006176#ifdef IPPROTO_SCTP
6177 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179#ifdef IPPROTO_BIP
6180 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006181#endif
6182/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183#ifdef IPPROTO_RAW
6184 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006185#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188#ifdef IPPROTO_MAX
6189 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006190#endif
6191
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006192#ifdef SYSPROTO_CONTROL
6193 PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
6194#endif
6195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 /* Some port configuration */
6197#ifdef IPPORT_RESERVED
6198 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006199#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202#ifdef IPPORT_USERRESERVED
6203 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006204#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006206#endif
6207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 /* Some reserved IP v.4 addresses */
6209#ifdef INADDR_ANY
6210 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006211#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214#ifdef INADDR_BROADCAST
6215 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006216#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219#ifdef INADDR_LOOPBACK
6220 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006221#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef INADDR_UNSPEC_GROUP
6225 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006226#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef INADDR_ALLHOSTS_GROUP
6230 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6231 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006232#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235#ifdef INADDR_MAX_LOCAL_GROUP
6236 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6237 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006238#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241#ifdef INADDR_NONE
6242 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006243#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006245#endif
6246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 /* IPv4 [gs]etsockopt options */
6248#ifdef IP_OPTIONS
6249 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251#ifdef IP_HDRINCL
6252 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254#ifdef IP_TOS
6255 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257#ifdef IP_TTL
6258 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006260#ifdef IP_RECVOPTS
6261 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263#ifdef IP_RECVRETOPTS
6264 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266#ifdef IP_RECVDSTADDR
6267 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269#ifdef IP_RETOPTS
6270 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272#ifdef IP_MULTICAST_IF
6273 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275#ifdef IP_MULTICAST_TTL
6276 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278#ifdef IP_MULTICAST_LOOP
6279 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281#ifdef IP_ADD_MEMBERSHIP
6282 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef IP_DROP_MEMBERSHIP
6285 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef IP_DEFAULT_MULTICAST_TTL
6288 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6289 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291#ifdef IP_DEFAULT_MULTICAST_LOOP
6292 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6293 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295#ifdef IP_MAX_MEMBERSHIPS
6296 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006297#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006298#ifdef IP_TRANSPARENT
6299 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6300#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6303#ifdef IPV6_JOIN_GROUP
6304 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306#ifdef IPV6_LEAVE_GROUP
6307 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309#ifdef IPV6_MULTICAST_HOPS
6310 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312#ifdef IPV6_MULTICAST_IF
6313 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315#ifdef IPV6_MULTICAST_LOOP
6316 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318#ifdef IPV6_UNICAST_HOPS
6319 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006322#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006326#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006327 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006328#endif
6329#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006331#endif
6332#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006334#endif
6335#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006337#endif
6338#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006340#endif
6341#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006343#endif
6344#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006346#endif
6347#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006349#endif
6350#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006352#endif
6353#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006355#endif
6356#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006358#endif
6359#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006361#endif
6362#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006364#endif
6365#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006367#endif
6368#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006370#endif
6371#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006373#endif
6374#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006376#endif
6377#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006379#endif
6380#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006382#endif
6383#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006385#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387 /* TCP options */
6388#ifdef TCP_NODELAY
6389 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391#ifdef TCP_MAXSEG
6392 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394#ifdef TCP_CORK
6395 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397#ifdef TCP_KEEPIDLE
6398 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400#ifdef TCP_KEEPINTVL
6401 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403#ifdef TCP_KEEPCNT
6404 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406#ifdef TCP_SYNCNT
6407 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409#ifdef TCP_LINGER2
6410 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412#ifdef TCP_DEFER_ACCEPT
6413 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415#ifdef TCP_WINDOW_CLAMP
6416 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418#ifdef TCP_INFO
6419 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421#ifdef TCP_QUICKACK
6422 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006423#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006424#ifdef TCP_FASTOPEN
6425 PyModule_AddIntConstant(m, "TCP_FASTOPEN", TCP_FASTOPEN);
6426#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 /* IPX options */
6429#ifdef IPX_TYPE
6430 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006431#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006432
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006433/* Reliable Datagram Sockets */
6434#ifdef RDS_CMSG_RDMA_ARGS
6435 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6436#endif
6437#ifdef RDS_CMSG_RDMA_DEST
6438 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6439#endif
6440#ifdef RDS_CMSG_RDMA_MAP
6441 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6442#endif
6443#ifdef RDS_CMSG_RDMA_STATUS
6444 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6445#endif
6446#ifdef RDS_CMSG_RDMA_UPDATE
6447 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6448#endif
6449#ifdef RDS_RDMA_READWRITE
6450 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6451#endif
6452#ifdef RDS_RDMA_FENCE
6453 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6454#endif
6455#ifdef RDS_RDMA_INVALIDATE
6456 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6457#endif
6458#ifdef RDS_RDMA_USE_ONCE
6459 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6460#endif
6461#ifdef RDS_RDMA_DONTWAIT
6462 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6463#endif
6464#ifdef RDS_RDMA_NOTIFY_ME
6465 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6466#endif
6467#ifdef RDS_RDMA_SILENT
6468 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6469#endif
6470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006472#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006474#endif
6475#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006477#endif
6478#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006480#endif
6481#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006483#endif
6484#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006486#endif
6487#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006489#endif
6490#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006492#endif
6493#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006495#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006496#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006498#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006499#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006501#endif
6502#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006504#endif
6505#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006507#endif
6508#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006510#endif
6511#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006513#endif
6514#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006516#endif
6517#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006518 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006519#endif
6520#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006522#endif
6523#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006525#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006526#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006528#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006529#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006530 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006531#endif
6532#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006534#endif
6535#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006537#endif
6538#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006540#endif
6541#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006543#endif
6544#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006546#endif
6547#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006549#endif
6550#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006552#endif
6553#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006555#endif
6556#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006558#endif
6559#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006561#endif
6562#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006564#endif
6565#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006567#endif
6568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006570#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006572#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006576#endif
6577#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006579#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006581#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006583#endif
6584#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006586#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006588#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006590#endif
6591
Christian Heimesfaf2f632008-01-06 16:59:19 +00006592#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 {
6594 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6595 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6596 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006597 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 PyObject *tmp;
6599 tmp = PyLong_FromUnsignedLong(codes[i]);
6600 if (tmp == NULL)
6601 return NULL;
6602 PyModule_AddObject(m, names[i], tmp);
6603 }
6604 }
6605 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6606 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6607 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006608#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006610#endif
6611#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006613#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006614#endif /* _MSTCPIP_ */
6615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006617#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006621}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006622
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006623
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006624#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006625#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006626
6627/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006628/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006629
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006630int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006631inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006634#if (SIZEOF_INT != 4)
6635#error "Not sure if in_addr_t exists and int is not 32-bits."
6636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 unsigned int packed_addr;
6638 packed_addr = inet_addr(src);
6639 if (packed_addr == INADDR_NONE)
6640 return 0;
6641 memcpy(dst, &packed_addr, 4);
6642 return 1;
6643 }
6644 /* Should set errno to EAFNOSUPPORT */
6645 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006646}
6647
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006648const char *
6649inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 if (af == AF_INET) {
6652 struct in_addr packed_addr;
6653 if (size < 16)
6654 /* Should set errno to ENOSPC. */
6655 return NULL;
6656 memcpy(&packed_addr, src, sizeof(packed_addr));
6657 return strncpy(dst, inet_ntoa(packed_addr), size);
6658 }
6659 /* Should set errno to EAFNOSUPPORT */
6660 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006661}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006662
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006663#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006664#endif