blob: 32b4eba2f2e3eee2ea8fc4a4986e5c80bf5836de [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
Guido van Rossum27e177d1995-03-16 15:43:47 +000018- socket.error: exception raised for socket specific errors
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
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227# define INCL_DOS
228# define INCL_DOSERRORS
229# define INCL_NOPMAPI
230# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000231#endif
232
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000233#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000234/* make sure that the reentrant (gethostbyaddr_r etc)
235 functions are declared correctly if compiling with
236 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237
Thomas Wouters477c8d52006-05-27 19:21:47 +0000238/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000240#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000243#undef _XOPEN_SOURCE
244#include <sys/socket.h>
245#include <sys/types.h>
246#include <netinet/in.h>
247#ifdef _SS_ALIGNSIZE
248#define HAVE_GETADDRINFO 1
249#define HAVE_GETNAMEINFO 1
250#endif
251
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252#define HAVE_INET_PTON
253#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000254#endif
255
Thomas Wouters477c8d52006-05-27 19:21:47 +0000256/* Irix 6.5 fails to define this variable at all. This is needed
257 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000258 are just busted. Same thing for Solaris. */
259#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000260#define INET_ADDRSTRLEN 16
261#endif
262
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000265#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000266#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700268#ifdef HAVE_SYS_SOCKET_H
269#include <sys/socket.h>
270#endif
271
272#ifdef HAVE_NET_IF_H
273#include <net/if.h>
274#endif
275
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000276/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000278#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
280/* Addressing includes */
281
Guido van Rossum6f489d91996-06-28 20:15:15 +0000282#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
284/* Non-MS WINDOWS includes */
285# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000286# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000287
Guido van Rossum9376b741999-09-15 22:01:40 +0000288/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000289# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000291typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000293# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000295
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000298#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301# ifdef HAVE_FCNTL_H
302# include <fcntl.h>
303# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304
Jeremy Hylton22308652001-02-02 03:23:09 +0000305#endif
306
Skip Montanaro7befb992004-02-10 16:50:21 +0000307#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000308
309#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000311#endif
312
Neal Norwitz39d22e52002-11-02 19:55:21 +0000313#ifndef O_NONBLOCK
314# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000315#endif
316
Trent Micka708d6e2004-09-07 17:48:26 +0000317/* include Python's addrinfo.h unless it causes trouble */
318#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
319 /* Do not include addinfo.h on some newer IRIX versions.
320 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
321 * for example, but not by 6.5.10.
322 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000323#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000324 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
325 * EAI_* constants are defined in (the already included) ws2tcpip.h.
326 */
327#else
328# include "addrinfo.h"
329#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000330
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000331#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000332#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000333int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000334const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000335#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000336#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000337
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000338#ifdef __APPLE__
339/* On OS X, getaddrinfo returns no error indication of lookup
340 failure, so we must use the emulation instead of the libinfo
341 implementation. Unfortunately, performing an autoconf test
342 for this bug would require DNS access for the machine performing
343 the configuration, which is not acceptable. Therefore, we
344 determine the bug just by checking for __APPLE__. If this bug
345 gets ever fixed, perhaps checking for sys/version.h would be
346 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000347#ifndef HAVE_GETNAMEINFO
348/* This bug seems to be fixed in Jaguar. Ths easiest way I could
349 Find to check for Jaguar is that it has getnameinfo(), which
350 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000352#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000353
354#ifdef HAVE_INET_ATON
355#define USE_INET_ATON_WEAKLINK
356#endif
357
Jack Jansen84262fb2002-07-02 14:40:42 +0000358#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000359
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000360/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000361#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000362/* avoid clashes with the C library definition of the symbol. */
363#define getaddrinfo fake_getaddrinfo
364#define gai_strerror fake_gai_strerror
365#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000366#include "getaddrinfo.c"
367#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000368#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000369#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000370#include "getnameinfo.c"
371#endif
372
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000373#ifdef MS_WINDOWS
374/* On Windows a socket is really a handle not an fd */
375static SOCKET
376dup_socket(SOCKET handle)
377{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000378 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000379
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000380 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000382
383 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Antoine Pitrou9a54a262012-04-01 01:14:39 +0200384 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000385}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000386#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000387#else
388/* On Unix we can use dup to duplicate the file descriptor of a socket*/
389#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000390#endif
391
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000392#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000393#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000394#define EAFNOSUPPORT WSAEAFNOSUPPORT
395#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000396#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000397
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000398#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000399#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000400#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000401#endif
402
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000403#ifndef SOCKETCLOSE
404#define SOCKETCLOSE close
405#endif
406
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000407#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#define USE_BLUETOOTH 1
409#if defined(__FreeBSD__)
410#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
411#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000412#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000413#define SOL_HCI SOL_HCI_RAW
414#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000415#define sockaddr_l2 sockaddr_l2cap
416#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000417#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000418#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
419#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000420#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000421#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define sockaddr_l2 sockaddr_bt
423#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000426#define SOL_HCI BTPROTO_HCI
427#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000428#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
429#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000430#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000431#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000432#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000433#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
434#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000435#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000436#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
437#endif
438#endif
439
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000440#ifdef __VMS
441/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
442#define SEGMENT_SIZE (32 * 1024 -1)
443#endif
444
Charles-François Natali8b759652011-12-23 16:44:51 +0100445/* Convert "sock_addr_t *" to "struct sockaddr *". */
446#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447
Martin v. Löwise9416172003-05-03 10:12:45 +0000448/*
449 * Constants for getnameinfo()
450 */
451#if !defined(NI_MAXHOST)
452#define NI_MAXHOST 1025
453#endif
454#if !defined(NI_MAXSERV)
455#define NI_MAXSERV 32
456#endif
457
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000458#ifndef INVALID_SOCKET /* MS defines this */
459#define INVALID_SOCKET (-1)
460#endif
461
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000462/* XXX There's a problem here: *static* functions are not supposed to have
463 a Py prefix (or use CapitalizedWords). Later... */
464
Guido van Rossum30a685f1991-06-27 15:51:29 +0000465/* Global variable holding the exception type for errors detected
466 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000467static PyObject *socket_herror;
468static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000469static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000470
Tim Peters643a7fc2002-02-17 04:13:21 +0000471/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000472 The sock_type variable contains pointers to various functions,
473 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000474 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000475static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000476
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000477#if defined(HAVE_POLL_H)
478#include <poll.h>
479#elif defined(HAVE_SYS_POLL_H)
480#include <sys/poll.h>
481#endif
482
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000483/* Largest value to try to store in a socklen_t (used when handling
484 ancillary data). POSIX requires socklen_t to hold at least
485 (2**31)-1 and recommends against storing larger values, but
486 socklen_t was originally int in the BSD interface, so to be on the
487 safe side we use the smaller of (2**31)-1 and INT_MAX. */
488#if INT_MAX > 0x7fffffff
489#define SOCKLEN_T_LIMIT 0x7fffffff
490#else
491#define SOCKLEN_T_LIMIT INT_MAX
492#endif
493
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200494#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000495/* Instead of select(), we'll use poll() since poll() works on any fd. */
496#define IS_SELECTABLE(s) 1
497/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000498#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200499/* If there's no timeout left, we don't have to call select, so it's a safe,
500 * little white lie. */
501#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000502#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503
504static PyObject*
505select_error(void)
506{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200507 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000509}
510
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000511#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000512#ifndef WSAEAGAIN
513#define WSAEAGAIN WSAEWOULDBLOCK
514#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000515#define CHECK_ERRNO(expected) \
516 (WSAGetLastError() == WSA ## expected)
517#else
518#define CHECK_ERRNO(expected) \
519 (errno == expected)
520#endif
521
Guido van Rossum30a685f1991-06-27 15:51:29 +0000522/* Convenience function to raise an error according to errno
523 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524
Guido van Rossum73624e91994-10-10 17:59:00 +0000525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000526set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000528#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 int err_no = WSAGetLastError();
530 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
531 recognizes the error codes used by both GetLastError() and
532 WSAGetLastError */
533 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200534 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000535#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000536
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000537#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (sock_errno() != NO_ERROR) {
539 APIRET rc;
540 ULONG msglen;
541 char outbuf[100];
542 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 /* Retrieve socket-related error message from MPTN.MSG file */
545 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
546 myerrorcode - SOCBASEERR + 26,
547 "mptn.msg",
548 &msglen);
549 if (rc == NO_ERROR) {
550 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* OS/2 doesn't guarantee a terminator */
553 outbuf[msglen] = '\0';
554 if (strlen(outbuf) > 0) {
555 /* If non-empty msg, trim CRLF */
556 char *lastc = &outbuf[ strlen(outbuf)-1 ];
557 while (lastc > outbuf &&
Antoine Pitrou4de74572013-02-09 23:11:27 +0100558 Py_ISSPACE(Py_CHARMASK(*lastc))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* Trim trailing whitespace (CRLF) */
560 *lastc-- = '\0';
561 }
562 }
563 v = Py_BuildValue("(is)", myerrorcode, outbuf);
564 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200565 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 Py_DECREF(v);
567 }
568 return NULL;
569 }
570 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000571#endif
572
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200573 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574}
575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000578set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581
582#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 if (v != NULL) {
588 PyErr_SetObject(socket_herror, v);
589 Py_DECREF(v);
590 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593}
594
595
596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwis272cb402002-03-01 08:31:07 +0000601#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 /* EAI_SYSTEM is not available on Windows XP. */
603 if (error == EAI_SYSTEM)
604 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000605#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000607#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (v != NULL) {
613 PyErr_SetObject(socket_gaierror, v);
614 Py_DECREF(v);
615 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618}
619
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620#ifdef __VMS
621/* Function to send in segments */
622static int
623sendsegmented(int sock_fd, char *buf, int len, int flags)
624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 int n = 0;
626 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 while (remaining > 0) {
629 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
632 n = send(sock_fd, buf, segment, flags);
633 if (n < 0) {
634 return n;
635 }
636 remaining -= segment;
637 buf += segment;
638 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000641}
642#endif
643
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000644/* Function to perform the setting of socket blocking mode
645 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646static int
647internal_setblocking(PySocketSockObject *s, int block)
648{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000652#ifdef SOCK_NONBLOCK
653 if (block)
654 s->sock_type &= (~SOCK_NONBLOCK);
655 else
656 s->sock_type |= SOCK_NONBLOCK;
657#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660#ifndef MS_WINDOWS
661#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 block = !block;
663 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000664#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 block = !block;
666 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
669 if (block)
670 delay_flag &= (~O_NONBLOCK);
671 else
672 delay_flag |= O_NONBLOCK;
673 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674#endif /* !PYOS_OS2 */
675#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 block = !block;
677 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 /* Since these don't return anything */
682 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683}
684
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000685/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000686 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000687 This does not raise an exception; we'll let our caller do that
688 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000690static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000691internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* Nothing to do unless we're in timeout mode (not non-blocking) */
696 if (s->sock_timeout <= 0.0)
697 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* Guard against closed socket */
700 if (s->sock_fd < 0)
701 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000702
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000703 /* Handling this condition here simplifies the select loops */
704 if (interval < 0.0)
705 return 1;
706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 /* Prefer poll, if available, since you can poll() any fd
708 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000709#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 {
711 struct pollfd pollfd;
712 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 pollfd.fd = s->sock_fd;
715 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000718 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 n = poll(&pollfd, 1, timeout);
720 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 {
723 /* Construct the arguments to select */
724 fd_set fds;
725 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000726 tv.tv_sec = (int)interval;
727 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 FD_ZERO(&fds);
729 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 /* See if the socket is ready */
732 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000733 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
734 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000736 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
737 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000739#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 if (n < 0)
742 return -1;
743 if (n == 0)
744 return 1;
745 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000746}
747
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000748static int
749internal_select(PySocketSockObject *s, int writing)
750{
751 return internal_select_ex(s, writing, s->sock_timeout);
752}
753
754/*
755 Two macros for automatic retry of select() in case of false positives
756 (for example, select() could indicate a socket is ready for reading
757 but the data then discarded by the OS because of a wrong checksum).
758 Here is an example of use:
759
760 BEGIN_SELECT_LOOP(s)
761 Py_BEGIN_ALLOW_THREADS
762 timeout = internal_select_ex(s, 0, interval);
763 if (!timeout)
764 outlen = recv(s->sock_fd, cbuf, len, flags);
765 Py_END_ALLOW_THREADS
766 if (timeout == 1) {
767 PyErr_SetString(socket_timeout, "timed out");
768 return -1;
769 }
770 END_SELECT_LOOP(s)
771*/
772
773#define BEGIN_SELECT_LOOP(s) \
774 { \
775 _PyTime_timeval now, deadline = {0, 0}; \
776 double interval = s->sock_timeout; \
777 int has_timeout = s->sock_timeout > 0.0; \
778 if (has_timeout) { \
779 _PyTime_gettimeofday(&now); \
780 deadline = now; \
781 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
782 } \
783 while (1) { \
784 errno = 0; \
785
786#define END_SELECT_LOOP(s) \
787 if (!has_timeout || \
788 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
789 break; \
790 _PyTime_gettimeofday(&now); \
791 interval = _PyTime_INTERVAL(now, deadline); \
792 } \
793 } \
794
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795/* Initialize a new socket object. */
796
Tim Petersa12b4cf2002-07-18 22:38:44 +0000797static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000798
Martin v. Löwis1a214512008-06-11 05:26:20 +0000799static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000800init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 s->sock_fd = fd;
804 s->sock_family = family;
805 s->sock_type = type;
806 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000809#ifdef SOCK_NONBLOCK
810 if (type & SOCK_NONBLOCK)
811 s->sock_timeout = 0.0;
812 else
813#endif
814 {
815 s->sock_timeout = defaulttimeout;
816 if (defaulttimeout >= 0.0)
817 internal_setblocking(s, 0);
818 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000819
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000820}
821
822
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823/* Create a new socket object.
824 This just creates the object and initializes it.
825 If the creation fails, return NULL and set an exception (implicit
826 in NEWOBJ()). */
827
Guido van Rossum73624e91994-10-10 17:59:00 +0000828static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000829new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 PySocketSockObject *s;
832 s = (PySocketSockObject *)
833 PyType_GenericNew(&sock_type, NULL, NULL);
834 if (s != NULL)
835 init_sockobject(s, fd, family, type, proto);
836 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837}
838
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
Guido van Rossum48a680c2001-03-02 06:34:14 +0000840/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000841 thread to be in gethostbyname or getaddrinfo */
842#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200843static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000844#endif
845
846
Guido van Rossum30a685f1991-06-27 15:51:29 +0000847/* Convert a string specifying a host name or one of a few symbolic
848 names to a numeric IP address. This usually calls gethostbyname()
849 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851 an error occurred; then an exception is raised. */
852
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000854setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 struct addrinfo hints, *res;
857 int error;
858 int d1, d2, d3, d4;
859 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
862 if (name[0] == '\0') {
863 int siz;
864 memset(&hints, 0, sizeof(hints));
865 hints.ai_family = af;
866 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
867 hints.ai_flags = AI_PASSIVE;
868 Py_BEGIN_ALLOW_THREADS
869 ACQUIRE_GETADDRINFO_LOCK
870 error = getaddrinfo(NULL, "0", &hints, &res);
871 Py_END_ALLOW_THREADS
872 /* We assume that those thread-unsafe getaddrinfo() versions
873 *are* safe regarding their return value, ie. that a
874 subsequent call to getaddrinfo() does not destroy the
875 outcome of the first call. */
876 RELEASE_GETADDRINFO_LOCK
877 if (error) {
878 set_gaierror(error);
879 return -1;
880 }
881 switch (res->ai_family) {
882 case AF_INET:
883 siz = 4;
884 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000885#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 case AF_INET6:
887 siz = 16;
888 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 default:
891 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200892 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 "unsupported address family");
894 return -1;
895 }
896 if (res->ai_next) {
897 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200898 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 "wildcard resolved to multiple address");
900 return -1;
901 }
902 if (res->ai_addrlen < addr_ret_size)
903 addr_ret_size = res->ai_addrlen;
904 memcpy(addr_ret, res->ai_addr, addr_ret_size);
905 freeaddrinfo(res);
906 return siz;
907 }
908 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
909 struct sockaddr_in *sin;
910 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200911 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 "address family mismatched");
913 return -1;
914 }
915 sin = (struct sockaddr_in *)addr_ret;
916 memset((void *) sin, '\0', sizeof(*sin));
917 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000918#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 sin->sin_addr.s_addr = INADDR_BROADCAST;
922 return sizeof(sin->sin_addr);
923 }
924 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
925 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
926 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
927 struct sockaddr_in *sin;
928 sin = (struct sockaddr_in *)addr_ret;
929 sin->sin_addr.s_addr = htonl(
930 ((long) d1 << 24) | ((long) d2 << 16) |
931 ((long) d3 << 8) | ((long) d4 << 0));
932 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000933#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 return 4;
937 }
938 memset(&hints, 0, sizeof(hints));
939 hints.ai_family = af;
940 Py_BEGIN_ALLOW_THREADS
941 ACQUIRE_GETADDRINFO_LOCK
942 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000943#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 if (error == EAI_NONAME && af == AF_UNSPEC) {
945 /* On Tru64 V5.1, numeric-to-addr conversion fails
946 if no address family is given. Assume IPv4 for now.*/
947 hints.ai_family = AF_INET;
948 error = getaddrinfo(name, NULL, &hints, &res);
949 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 Py_END_ALLOW_THREADS
952 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
953 if (error) {
954 set_gaierror(error);
955 return -1;
956 }
957 if (res->ai_addrlen < addr_ret_size)
958 addr_ret_size = res->ai_addrlen;
959 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
960 freeaddrinfo(res);
961 switch (addr_ret->sa_family) {
962 case AF_INET:
963 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000964#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 case AF_INET6:
966 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200969 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 return -1;
971 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972}
973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975/* Create a string object representing an IP address.
976 This is always a string of the form 'dd.dd.dd.dd' (with variable
977 size numbers). */
978
Guido van Rossum73624e91994-10-10 17:59:00 +0000979static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000980makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 char buf[NI_MAXHOST];
983 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
986 NI_NUMERICHOST);
987 if (error) {
988 set_gaierror(error);
989 return NULL;
990 }
991 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000992}
993
994
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000995#ifdef USE_BLUETOOTH
996/* Convert a string representation of a Bluetooth address into a numeric
997 address. Returns the length (6), or raises an exception and returns -1 if
998 an error occurred. */
999
1000static int
1001setbdaddr(char *name, bdaddr_t *bdaddr)
1002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 unsigned int b0, b1, b2, b3, b4, b5;
1004 char ch;
1005 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1008 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1009 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1010 bdaddr->b[0] = b0;
1011 bdaddr->b[1] = b1;
1012 bdaddr->b[2] = b2;
1013 bdaddr->b[3] = b3;
1014 bdaddr->b[4] = b4;
1015 bdaddr->b[5] = b5;
1016 return 6;
1017 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001018 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 return -1;
1020 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001021}
1022
1023/* Create a string representation of the Bluetooth address. This is always a
1024 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1025 value (zero padded if necessary). */
1026
1027static PyObject *
1028makebdaddr(bdaddr_t *bdaddr)
1029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1033 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1034 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1035 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001036}
1037#endif
1038
1039
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040/* Create an object representing the given socket address,
1041 suitable for passing it back to bind(), connect() etc.
1042 The family field of the sockaddr structure is inspected
1043 to determine what kind of address it really is. */
1044
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001046static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001047makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 if (addrlen == 0) {
1050 /* No address -- may be recvfrom() from known socket */
1051 Py_INCREF(Py_None);
1052 return Py_None;
1053 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case AF_INET:
1058 {
1059 struct sockaddr_in *a;
1060 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1061 PyObject *ret = NULL;
1062 if (addrobj) {
1063 a = (struct sockaddr_in *)addr;
1064 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1065 Py_DECREF(addrobj);
1066 }
1067 return ret;
1068 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001069
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001070#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case AF_UNIX:
1072 {
1073 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1076 addrlen -= offsetof(struct sockaddr_un, sun_path);
1077 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1078 }
1079 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001080#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 {
1082 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001083 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 }
1085 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001086#endif /* AF_UNIX */
1087
Martin v. Löwis11017b12006-01-14 18:12:57 +00001088#if defined(AF_NETLINK)
1089 case AF_NETLINK:
1090 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1092 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001093 }
1094#endif /* AF_NETLINK */
1095
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001096#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 case AF_INET6:
1098 {
1099 struct sockaddr_in6 *a;
1100 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1101 PyObject *ret = NULL;
1102 if (addrobj) {
1103 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001104 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 addrobj,
1106 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001107 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 a->sin6_scope_id);
1109 Py_DECREF(addrobj);
1110 }
1111 return ret;
1112 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001113#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001114
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001115#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 case AF_BLUETOOTH:
1117 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 case BTPROTO_L2CAP:
1120 {
1121 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1122 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1123 PyObject *ret = NULL;
1124 if (addrobj) {
1125 ret = Py_BuildValue("Oi",
1126 addrobj,
1127 _BT_L2_MEMB(a, psm));
1128 Py_DECREF(addrobj);
1129 }
1130 return ret;
1131 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 case BTPROTO_RFCOMM:
1134 {
1135 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1136 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1137 PyObject *ret = NULL;
1138 if (addrobj) {
1139 ret = Py_BuildValue("Oi",
1140 addrobj,
1141 _BT_RC_MEMB(a, channel));
1142 Py_DECREF(addrobj);
1143 }
1144 return ret;
1145 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 case BTPROTO_HCI:
1148 {
1149 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001150#if defined(__NetBSD__) || defined(__DragonFly__)
1151 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1152#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 PyObject *ret = NULL;
1154 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1155 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001158
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 case BTPROTO_SCO:
1161 {
1162 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1163 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165#endif
1166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 default:
1168 PyErr_SetString(PyExc_ValueError,
1169 "Unknown Bluetooth protocol");
1170 return NULL;
1171 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001172#endif
1173
Antoine Pitroub156a462010-10-27 20:13:57 +00001174#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 case AF_PACKET:
1176 {
1177 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1178 char *ifname = "";
1179 struct ifreq ifr;
1180 /* need to look up interface name give index */
1181 if (a->sll_ifindex) {
1182 ifr.ifr_ifindex = a->sll_ifindex;
1183 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1184 ifname = ifr.ifr_name;
1185 }
1186 return Py_BuildValue("shbhy#",
1187 ifname,
1188 ntohs(a->sll_protocol),
1189 a->sll_pkttype,
1190 a->sll_hatype,
1191 a->sll_addr,
1192 a->sll_halen);
1193 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001194#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001195
Christian Heimes043d6f62008-01-07 17:19:16 +00001196#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 case AF_TIPC:
1198 {
1199 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1200 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1201 return Py_BuildValue("IIIII",
1202 a->addrtype,
1203 a->addr.nameseq.type,
1204 a->addr.nameseq.lower,
1205 a->addr.nameseq.upper,
1206 a->scope);
1207 } else if (a->addrtype == TIPC_ADDR_NAME) {
1208 return Py_BuildValue("IIIII",
1209 a->addrtype,
1210 a->addr.name.name.type,
1211 a->addr.name.name.instance,
1212 a->addr.name.name.instance,
1213 a->scope);
1214 } else if (a->addrtype == TIPC_ADDR_ID) {
1215 return Py_BuildValue("IIIII",
1216 a->addrtype,
1217 a->addr.id.node,
1218 a->addr.id.ref,
1219 0,
1220 a->scope);
1221 } else {
1222 PyErr_SetString(PyExc_ValueError,
1223 "Invalid address type");
1224 return NULL;
1225 }
1226 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001227#endif
1228
Charles-François Natalib4062e82014-02-08 22:54:11 +01001229#ifdef HAVE_LINUX_CAN_H
Charles-François Natali47413c12011-10-06 19:47:44 +02001230 case AF_CAN:
1231 {
1232 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1233 char *ifname = "";
1234 struct ifreq ifr;
1235 /* need to look up interface name given index */
1236 if (a->can_ifindex) {
1237 ifr.ifr_ifindex = a->can_ifindex;
1238 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1239 ifname = ifr.ifr_name;
1240 }
1241
1242 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1243 ifname,
1244 a->can_family);
1245 }
1246#endif
1247
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001248#ifdef PF_SYSTEM
1249 case PF_SYSTEM:
1250 switch(proto) {
1251#ifdef SYSPROTO_CONTROL
1252 case SYSPROTO_CONTROL:
1253 {
1254 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1255 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1256 }
1257#endif
1258 default:
1259 PyErr_SetString(PyExc_ValueError,
1260 "Invalid address type");
1261 return 0;
1262 }
1263#endif
1264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 default:
1268 /* If we don't know the address family, don't raise an
1269 exception -- return it as an (int, bytes) tuple. */
1270 return Py_BuildValue("iy#",
1271 addr->sa_family,
1272 addr->sa_data,
1273 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001276}
1277
Guido van Rossum30a685f1991-06-27 15:51:29 +00001278
1279/* Parse a socket address argument according to the socket object's
1280 address family. Return 1 if the address was in the proper format,
1281 0 of not. The address is returned through addr_ret, its length
1282 through len_ret. */
1283
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001284static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001285getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001289
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001290#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 case AF_UNIX:
1292 {
1293 struct sockaddr_un* addr;
1294 char *path;
1295 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001296 int retval = 0;
1297
1298 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1299 allow embedded nulls on Linux. */
1300 if (PyUnicode_Check(args)) {
1301 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1302 return 0;
1303 }
1304 else
1305 Py_INCREF(args);
1306 if (!PyArg_Parse(args, "y#", &path, &len))
1307 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 if (len > 0 && path[0] == 0) {
1312 /* Linux abstract namespace extension */
1313 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001314 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001316 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 }
1318 }
1319 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001320#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 {
1322 /* regular NULL-terminated string */
1323 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001324 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001326 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 }
1328 addr->sun_path[len] = 0;
1329 }
1330 addr->sun_family = s->sock_family;
1331 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001332#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001334#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001336#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001337 retval = 1;
1338 unix_out:
1339 Py_DECREF(args);
1340 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001342#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343
Martin v. Löwis11017b12006-01-14 18:12:57 +00001344#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 case AF_NETLINK:
1346 {
1347 struct sockaddr_nl* addr;
1348 int pid, groups;
1349 addr = (struct sockaddr_nl *)addr_ret;
1350 if (!PyTuple_Check(args)) {
1351 PyErr_Format(
1352 PyExc_TypeError,
1353 "getsockaddrarg: "
1354 "AF_NETLINK address must be tuple, not %.500s",
1355 Py_TYPE(args)->tp_name);
1356 return 0;
1357 }
1358 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1359 return 0;
1360 addr->nl_family = AF_NETLINK;
1361 addr->nl_pid = pid;
1362 addr->nl_groups = groups;
1363 *len_ret = sizeof(*addr);
1364 return 1;
1365 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001366#endif
1367
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001368#ifdef AF_RDS
1369 case AF_RDS:
1370 /* RDS sockets use sockaddr_in: fall-through */
1371#endif
1372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 case AF_INET:
1374 {
1375 struct sockaddr_in* addr;
1376 char *host;
1377 int port, result;
1378 if (!PyTuple_Check(args)) {
1379 PyErr_Format(
1380 PyExc_TypeError,
1381 "getsockaddrarg: "
1382 "AF_INET address must be tuple, not %.500s",
1383 Py_TYPE(args)->tp_name);
1384 return 0;
1385 }
1386 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1387 "idna", &host, &port))
1388 return 0;
1389 addr=(struct sockaddr_in*)addr_ret;
1390 result = setipaddr(host, (struct sockaddr *)addr,
1391 sizeof(*addr), AF_INET);
1392 PyMem_Free(host);
1393 if (result < 0)
1394 return 0;
1395 if (port < 0 || port > 0xffff) {
1396 PyErr_SetString(
1397 PyExc_OverflowError,
1398 "getsockaddrarg: port must be 0-65535.");
1399 return 0;
1400 }
1401 addr->sin_family = AF_INET;
1402 addr->sin_port = htons((short)port);
1403 *len_ret = sizeof *addr;
1404 return 1;
1405 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001407#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 case AF_INET6:
1409 {
1410 struct sockaddr_in6* addr;
1411 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001412 int port, result;
1413 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 flowinfo = scope_id = 0;
1415 if (!PyTuple_Check(args)) {
1416 PyErr_Format(
1417 PyExc_TypeError,
1418 "getsockaddrarg: "
1419 "AF_INET6 address must be tuple, not %.500s",
1420 Py_TYPE(args)->tp_name);
1421 return 0;
1422 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001423 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 "idna", &host, &port, &flowinfo,
1425 &scope_id)) {
1426 return 0;
1427 }
1428 addr = (struct sockaddr_in6*)addr_ret;
1429 result = setipaddr(host, (struct sockaddr *)addr,
1430 sizeof(*addr), AF_INET6);
1431 PyMem_Free(host);
1432 if (result < 0)
1433 return 0;
1434 if (port < 0 || port > 0xffff) {
1435 PyErr_SetString(
1436 PyExc_OverflowError,
1437 "getsockaddrarg: port must be 0-65535.");
1438 return 0;
1439 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001440 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001441 PyErr_SetString(
1442 PyExc_OverflowError,
1443 "getsockaddrarg: flowinfo must be 0-1048575.");
1444 return 0;
1445 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 addr->sin6_family = s->sock_family;
1447 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001448 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 addr->sin6_scope_id = scope_id;
1450 *len_ret = sizeof *addr;
1451 return 1;
1452 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001453#endif
1454
Hye-Shik Chang81268602004-02-02 06:05:24 +00001455#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 case AF_BLUETOOTH:
1457 {
1458 switch (s->sock_proto) {
1459 case BTPROTO_L2CAP:
1460 {
1461 struct sockaddr_l2 *addr;
1462 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 addr = (struct sockaddr_l2 *)addr_ret;
1465 memset(addr, 0, sizeof(struct sockaddr_l2));
1466 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1467 if (!PyArg_ParseTuple(args, "si", &straddr,
1468 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001469 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 "wrong format");
1471 return 0;
1472 }
1473 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1474 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 *len_ret = sizeof *addr;
1477 return 1;
1478 }
1479 case BTPROTO_RFCOMM:
1480 {
1481 struct sockaddr_rc *addr;
1482 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 addr = (struct sockaddr_rc *)addr_ret;
1485 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1486 if (!PyArg_ParseTuple(args, "si", &straddr,
1487 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001488 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 "wrong format");
1490 return 0;
1491 }
1492 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1493 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 *len_ret = sizeof *addr;
1496 return 1;
1497 }
1498 case BTPROTO_HCI:
1499 {
1500 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001501#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001502 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001503
Alexander Belopolskye239d232010-12-08 23:31:48 +00001504 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001505 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001506 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001507 "wrong format");
1508 return 0;
1509 }
1510 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1511 return 0;
1512#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1514 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001515 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 "wrong format");
1517 return 0;
1518 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 *len_ret = sizeof *addr;
1521 return 1;
1522 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001523#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 case BTPROTO_SCO:
1525 {
1526 struct sockaddr_sco *addr;
1527 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 addr = (struct sockaddr_sco *)addr_ret;
1530 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1531 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001532 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 "wrong format");
1534 return 0;
1535 }
1536 straddr = PyBytes_AS_STRING(args);
1537 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1538 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 *len_ret = sizeof *addr;
1541 return 1;
1542 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001545 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 return 0;
1547 }
1548 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001549#endif
1550
Antoine Pitroub156a462010-10-27 20:13:57 +00001551#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 case AF_PACKET:
1553 {
1554 struct sockaddr_ll* addr;
1555 struct ifreq ifr;
1556 char *interfaceName;
1557 int protoNumber;
1558 int hatype = 0;
1559 int pkttype = 0;
1560 char *haddr = NULL;
1561 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 if (!PyTuple_Check(args)) {
1564 PyErr_Format(
1565 PyExc_TypeError,
1566 "getsockaddrarg: "
1567 "AF_PACKET address must be tuple, not %.500s",
1568 Py_TYPE(args)->tp_name);
1569 return 0;
1570 }
1571 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1572 &protoNumber, &pkttype, &hatype,
1573 &haddr, &halen))
1574 return 0;
1575 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1576 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1577 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1578 s->errorhandler();
1579 return 0;
1580 }
1581 if (halen > 8) {
1582 PyErr_SetString(PyExc_ValueError,
1583 "Hardware address must be 8 bytes or less");
1584 return 0;
1585 }
1586 if (protoNumber < 0 || protoNumber > 0xffff) {
1587 PyErr_SetString(
1588 PyExc_OverflowError,
1589 "getsockaddrarg: protoNumber must be 0-65535.");
1590 return 0;
1591 }
1592 addr = (struct sockaddr_ll*)addr_ret;
1593 addr->sll_family = AF_PACKET;
1594 addr->sll_protocol = htons((short)protoNumber);
1595 addr->sll_ifindex = ifr.ifr_ifindex;
1596 addr->sll_pkttype = pkttype;
1597 addr->sll_hatype = hatype;
1598 if (halen != 0) {
1599 memcpy(&addr->sll_addr, haddr, halen);
1600 }
1601 addr->sll_halen = halen;
1602 *len_ret = sizeof *addr;
1603 return 1;
1604 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001605#endif
1606
Christian Heimes043d6f62008-01-07 17:19:16 +00001607#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 case AF_TIPC:
1609 {
1610 unsigned int atype, v1, v2, v3;
1611 unsigned int scope = TIPC_CLUSTER_SCOPE;
1612 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 if (!PyTuple_Check(args)) {
1615 PyErr_Format(
1616 PyExc_TypeError,
1617 "getsockaddrarg: "
1618 "AF_TIPC address must be tuple, not %.500s",
1619 Py_TYPE(args)->tp_name);
1620 return 0;
1621 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 if (!PyArg_ParseTuple(args,
1624 "IIII|I;Invalid TIPC address format",
1625 &atype, &v1, &v2, &v3, &scope))
1626 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 addr = (struct sockaddr_tipc *) addr_ret;
1629 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 addr->family = AF_TIPC;
1632 addr->scope = scope;
1633 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 if (atype == TIPC_ADDR_NAMESEQ) {
1636 addr->addr.nameseq.type = v1;
1637 addr->addr.nameseq.lower = v2;
1638 addr->addr.nameseq.upper = v3;
1639 } else if (atype == TIPC_ADDR_NAME) {
1640 addr->addr.name.name.type = v1;
1641 addr->addr.name.name.instance = v2;
1642 } else if (atype == TIPC_ADDR_ID) {
1643 addr->addr.id.node = v1;
1644 addr->addr.id.ref = v2;
1645 } else {
1646 /* Shouldn't happen */
1647 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1648 return 0;
1649 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 return 1;
1654 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001655#endif
1656
Charles-François Natalib4062e82014-02-08 22:54:11 +01001657#ifdef HAVE_LINUX_CAN_H
Charles-François Natali47413c12011-10-06 19:47:44 +02001658 case AF_CAN:
1659 switch (s->sock_proto) {
1660 case CAN_RAW:
1661 {
1662 struct sockaddr_can *addr;
1663 PyObject *interfaceName;
1664 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001665 Py_ssize_t len;
1666
Benjamin Peterson18b71912013-05-16 15:29:44 -05001667 addr = (struct sockaddr_can *)addr_ret;
1668
Charles-François Natali47413c12011-10-06 19:47:44 +02001669 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1670 &interfaceName))
1671 return 0;
1672
1673 len = PyBytes_GET_SIZE(interfaceName);
1674
1675 if (len == 0) {
1676 ifr.ifr_ifindex = 0;
1677 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001678 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1679 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001680 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1681 s->errorhandler();
1682 Py_DECREF(interfaceName);
1683 return 0;
1684 }
1685 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001686 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001687 "AF_CAN interface name too long");
1688 Py_DECREF(interfaceName);
1689 return 0;
1690 }
1691
1692 addr->can_family = AF_CAN;
1693 addr->can_ifindex = ifr.ifr_ifindex;
1694
1695 *len_ret = sizeof(*addr);
1696 Py_DECREF(interfaceName);
1697 return 1;
1698 }
1699 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001700 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001701 "getsockaddrarg: unsupported CAN protocol");
1702 return 0;
1703 }
1704#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001705
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001706#ifdef PF_SYSTEM
1707 case PF_SYSTEM:
1708 switch (s->sock_proto) {
1709#ifdef SYSPROTO_CONTROL
1710 case SYSPROTO_CONTROL:
1711 {
1712 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001713
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001714 addr = (struct sockaddr_ctl *)addr_ret;
1715 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001716 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001717
1718 if (PyUnicode_Check(args)) {
1719 struct ctl_info info;
1720 PyObject *ctl_name;
1721
1722 if (!PyArg_Parse(args, "O&",
1723 PyUnicode_FSConverter, &ctl_name)) {
1724 return 0;
1725 }
1726
1727 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1728 PyErr_SetString(PyExc_ValueError,
1729 "provided string is too long");
1730 Py_DECREF(ctl_name);
1731 return 0;
1732 }
1733 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1734 sizeof(info.ctl_name));
1735 Py_DECREF(ctl_name);
1736
1737 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1738 PyErr_SetString(PyExc_OSError,
1739 "cannot find kernel control with provided name");
1740 return 0;
1741 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001742
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001743 addr->sc_id = info.ctl_id;
1744 addr->sc_unit = 0;
1745 } else if (!PyArg_ParseTuple(args, "II",
1746 &(addr->sc_id), &(addr->sc_unit))) {
1747 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1748 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001749
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001750 return 0;
1751 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001752
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001753 *len_ret = sizeof(*addr);
1754 return 1;
1755 }
1756#endif
1757 default:
1758 PyErr_SetString(PyExc_OSError,
1759 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1760 return 0;
1761 }
1762#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001767 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001771}
1772
Guido van Rossum30a685f1991-06-27 15:51:29 +00001773
Guido van Rossum48a680c2001-03-02 06:34:14 +00001774/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001775 Return 1 if the family is known, 0 otherwise. The length is returned
1776 through len_ret. */
1777
1778static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001779getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001782
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001783#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 case AF_UNIX:
1785 {
1786 *len_ret = sizeof (struct sockaddr_un);
1787 return 1;
1788 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001789#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001790#if defined(AF_NETLINK)
1791 case AF_NETLINK:
1792 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 *len_ret = sizeof (struct sockaddr_nl);
1794 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001795 }
1796#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001797
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001798#ifdef AF_RDS
1799 case AF_RDS:
1800 /* RDS sockets use sockaddr_in: fall-through */
1801#endif
1802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 case AF_INET:
1804 {
1805 *len_ret = sizeof (struct sockaddr_in);
1806 return 1;
1807 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001808
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001809#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 case AF_INET6:
1811 {
1812 *len_ret = sizeof (struct sockaddr_in6);
1813 return 1;
1814 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001815#endif
1816
Hye-Shik Chang81268602004-02-02 06:05:24 +00001817#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 case AF_BLUETOOTH:
1819 {
1820 switch(s->sock_proto)
1821 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 case BTPROTO_L2CAP:
1824 *len_ret = sizeof (struct sockaddr_l2);
1825 return 1;
1826 case BTPROTO_RFCOMM:
1827 *len_ret = sizeof (struct sockaddr_rc);
1828 return 1;
1829 case BTPROTO_HCI:
1830 *len_ret = sizeof (struct sockaddr_hci);
1831 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001832#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 case BTPROTO_SCO:
1834 *len_ret = sizeof (struct sockaddr_sco);
1835 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001838 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 "unknown BT protocol");
1840 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 }
1843 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001844#endif
1845
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001846#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 case AF_PACKET:
1848 {
1849 *len_ret = sizeof (struct sockaddr_ll);
1850 return 1;
1851 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001852#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001853
Christian Heimes043d6f62008-01-07 17:19:16 +00001854#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 case AF_TIPC:
1856 {
1857 *len_ret = sizeof (struct sockaddr_tipc);
1858 return 1;
1859 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001860#endif
1861
Charles-François Natalib4062e82014-02-08 22:54:11 +01001862#ifdef HAVE_LINUX_CAN_H
Charles-François Natali47413c12011-10-06 19:47:44 +02001863 case AF_CAN:
1864 {
1865 *len_ret = sizeof (struct sockaddr_can);
1866 return 1;
1867 }
1868#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001869
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001870#ifdef PF_SYSTEM
1871 case PF_SYSTEM:
1872 switch(s->sock_proto) {
1873#ifdef SYSPROTO_CONTROL
1874 case SYSPROTO_CONTROL:
1875 *len_ret = sizeof (struct sockaddr_ctl);
1876 return 1;
1877#endif
1878 default:
1879 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1880 "unknown PF_SYSTEM protocol");
1881 return 0;
1882 }
1883#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001888 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001892}
1893
1894
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001895/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1896 Currently, these methods are only compiled if the RFC 2292/3542
1897 CMSG_LEN() macro is available. Older systems seem to have used
1898 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1899 it may be possible to define CMSG_LEN() that way if it's not
1900 provided. Some architectures might need extra padding after the
1901 cmsghdr, however, and CMSG_LEN() would have to take account of
1902 this. */
1903#ifdef CMSG_LEN
1904/* If length is in range, set *result to CMSG_LEN(length) and return
1905 true; otherwise, return false. */
1906static int
1907get_CMSG_LEN(size_t length, size_t *result)
1908{
1909 size_t tmp;
1910
1911 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1912 return 0;
1913 tmp = CMSG_LEN(length);
1914 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1915 return 0;
1916 *result = tmp;
1917 return 1;
1918}
1919
1920#ifdef CMSG_SPACE
1921/* If length is in range, set *result to CMSG_SPACE(length) and return
1922 true; otherwise, return false. */
1923static int
1924get_CMSG_SPACE(size_t length, size_t *result)
1925{
1926 size_t tmp;
1927
1928 /* Use CMSG_SPACE(1) here in order to take account of the padding
1929 necessary before *and* after the data. */
1930 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1931 return 0;
1932 tmp = CMSG_SPACE(length);
1933 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1934 return 0;
1935 *result = tmp;
1936 return 1;
1937}
1938#endif
1939
1940/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1941 pointer in msg->msg_control with at least "space" bytes after it,
1942 and its cmsg_len member inside the buffer. */
1943static int
1944cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1945{
1946 size_t cmsg_offset;
1947 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1948 sizeof(cmsgh->cmsg_len));
1949
Charles-François Natali466517d2011-08-28 18:23:43 +02001950 /* Note that POSIX allows msg_controllen to be of signed type. */
1951 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001952 return 0;
1953 if (space < cmsg_len_end)
1954 space = cmsg_len_end;
1955 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1956 return (cmsg_offset <= (size_t)-1 - space &&
1957 cmsg_offset + space <= msg->msg_controllen);
1958}
1959
1960/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1961 *space to number of bytes following it in the buffer and return
1962 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1963 msg->msg_controllen are valid. */
1964static int
1965get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1966{
1967 size_t data_offset;
1968 char *data_ptr;
1969
1970 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1971 return 0;
1972 data_offset = data_ptr - (char *)msg->msg_control;
1973 if (data_offset > msg->msg_controllen)
1974 return 0;
1975 *space = msg->msg_controllen - data_offset;
1976 return 1;
1977}
1978
1979/* If cmsgh is invalid or not contained in the buffer pointed to by
1980 msg->msg_control, return -1. If cmsgh is valid and its associated
1981 data is entirely contained in the buffer, set *data_len to the
1982 length of the associated data and return 0. If only part of the
1983 associated data is contained in the buffer but cmsgh is otherwise
1984 valid, set *data_len to the length contained in the buffer and
1985 return 1. */
1986static int
1987get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1988{
1989 size_t space, cmsg_data_len;
1990
1991 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1992 cmsgh->cmsg_len < CMSG_LEN(0))
1993 return -1;
1994 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1995 if (!get_cmsg_data_space(msg, cmsgh, &space))
1996 return -1;
1997 if (space >= cmsg_data_len) {
1998 *data_len = cmsg_data_len;
1999 return 0;
2000 }
2001 *data_len = space;
2002 return 1;
2003}
2004#endif /* CMSG_LEN */
2005
2006
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002007/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002008
Guido van Rossum73624e91994-10-10 17:59:00 +00002009static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002010sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 sock_addr_t addrbuf;
2013 SOCKET_T newfd = INVALID_SOCKET;
2014 socklen_t addrlen;
2015 PyObject *sock = NULL;
2016 PyObject *addr = NULL;
2017 PyObject *res = NULL;
2018 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 if (!getsockaddrlen(s, &addrlen))
2020 return NULL;
2021 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 if (!IS_SELECTABLE(s))
2024 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002025
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002026 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002028 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002029 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002031 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 if (timeout == 1) {
2035 PyErr_SetString(socket_timeout, "timed out");
2036 return NULL;
2037 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002038 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 if (newfd == INVALID_SOCKET)
2041 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 sock = PyLong_FromSocket_t(newfd);
2044 if (sock == NULL) {
2045 SOCKETCLOSE(newfd);
2046 goto finally;
2047 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2050 addrlen, s->sock_proto);
2051 if (addr == NULL)
2052 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002055
Guido van Rossum67f7a382002-06-06 21:08:16 +00002056finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 Py_XDECREF(sock);
2058 Py_XDECREF(addr);
2059 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002060}
2061
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002062PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002063"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002064\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002065Wait for an incoming connection. Return a new socket file descriptor\n\
2066representing the connection, and the address of the client.\n\
2067For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002068
Guido van Rossum11ba0942002-06-13 15:07:44 +00002069/* s.setblocking(flag) method. Argument:
2070 False -- non-blocking mode; same as settimeout(0)
2071 True -- blocking mode; same as settimeout(None)
2072*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002073
Guido van Rossum73624e91994-10-10 17:59:00 +00002074static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002075sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002076{
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02002077 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 block = PyLong_AsLong(arg);
2080 if (block == -1 && PyErr_Occurred())
2081 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 s->sock_timeout = block ? -1.0 : 0.0;
2084 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 Py_INCREF(Py_None);
2087 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002088}
Guido van Rossume4485b01994-09-07 14:32:49 +00002089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002090PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002091"setblocking(flag)\n\
2092\n\
2093Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002094setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002096
Guido van Rossum11ba0942002-06-13 15:07:44 +00002097/* s.settimeout(timeout) method. Argument:
2098 None -- no timeout, blocking mode; same as setblocking(True)
2099 0.0 -- non-blocking mode; same as setblocking(False)
2100 > 0 -- timeout mode; operations time out after timeout seconds
2101 < 0 -- illegal; raises an exception
2102*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002104sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (arg == Py_None)
2109 timeout = -1.0;
2110 else {
2111 timeout = PyFloat_AsDouble(arg);
2112 if (timeout < 0.0) {
2113 if (!PyErr_Occurred())
2114 PyErr_SetString(PyExc_ValueError,
2115 "Timeout value out of range");
2116 return NULL;
2117 }
2118 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 s->sock_timeout = timeout;
2121 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 Py_INCREF(Py_None);
2124 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002125}
2126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002127PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002128"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002130Set a timeout on socket operations. 'timeout' can be a float,\n\
2131giving in seconds, or None. Setting a timeout of None disables\n\
2132the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002133Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002135/* s.gettimeout() method.
2136 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002137static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002138sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 if (s->sock_timeout < 0.0) {
2141 Py_INCREF(Py_None);
2142 return Py_None;
2143 }
2144 else
2145 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002146}
2147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002148PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002149"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002150\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002151Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002152operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002153operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002154
Guido van Rossumaee08791992-09-08 09:05:33 +00002155/* s.setsockopt() method.
2156 With an integer third argument, sets an integer option.
2157 With a string third argument, sets an option from a buffer;
2158 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002159
Guido van Rossum73624e91994-10-10 17:59:00 +00002160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002161sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 int level;
2164 int optname;
2165 int res;
2166 char *buf;
2167 int buflen;
2168 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 if (PyArg_ParseTuple(args, "iii:setsockopt",
2171 &level, &optname, &flag)) {
2172 buf = (char *) &flag;
2173 buflen = sizeof flag;
2174 }
2175 else {
2176 PyErr_Clear();
2177 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2178 &level, &optname, &buf, &buflen))
2179 return NULL;
2180 }
2181 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2182 if (res < 0)
2183 return s->errorhandler();
2184 Py_INCREF(Py_None);
2185 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002186}
2187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002188PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002189"setsockopt(level, option, value)\n\
2190\n\
2191Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002194
Guido van Rossumaee08791992-09-08 09:05:33 +00002195/* s.getsockopt() method.
2196 With two arguments, retrieves an integer option.
2197 With a third integer argument, retrieves a string buffer of that size;
2198 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002199
Guido van Rossum73624e91994-10-10 17:59:00 +00002200static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002201sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 int level;
2204 int optname;
2205 int res;
2206 PyObject *buf;
2207 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2210 &level, &optname, &buflen))
2211 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (buflen == 0) {
2214 int flag = 0;
2215 socklen_t flagsize = sizeof flag;
2216 res = getsockopt(s->sock_fd, level, optname,
2217 (void *)&flag, &flagsize);
2218 if (res < 0)
2219 return s->errorhandler();
2220 return PyLong_FromLong(flag);
2221 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002222#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 /* socklen_t is unsigned so no negative test is needed,
2224 test buflen == 0 is previously done */
2225 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002226#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002228#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002229 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 "getsockopt buflen out of range");
2231 return NULL;
2232 }
2233 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2234 if (buf == NULL)
2235 return NULL;
2236 res = getsockopt(s->sock_fd, level, optname,
2237 (void *)PyBytes_AS_STRING(buf), &buflen);
2238 if (res < 0) {
2239 Py_DECREF(buf);
2240 return s->errorhandler();
2241 }
2242 _PyBytes_Resize(&buf, buflen);
2243 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002244}
2245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247"getsockopt(level, option[, buffersize]) -> value\n\
2248\n\
2249Get a socket option. See the Unix manual for level and option.\n\
2250If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002251string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002252
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002253
Fred Drake728819a2000-07-01 03:40:12 +00002254/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002255
Guido van Rossum73624e91994-10-10 17:59:00 +00002256static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002257sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 sock_addr_t addrbuf;
2260 int addrlen;
2261 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2264 return NULL;
2265 Py_BEGIN_ALLOW_THREADS
2266 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2267 Py_END_ALLOW_THREADS
2268 if (res < 0)
2269 return s->errorhandler();
2270 Py_INCREF(Py_None);
2271 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002272}
2273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002274PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002275"bind(address)\n\
2276\n\
2277Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002278pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002279sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002280
Guido van Rossum30a685f1991-06-27 15:51:29 +00002281
2282/* s.close() method.
2283 Set the file descriptor to -1 so operations tried subsequently
2284 will surely fail. */
2285
Guido van Rossum73624e91994-10-10 17:59:00 +00002286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002287sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 if ((fd = s->sock_fd) != -1) {
2292 s->sock_fd = -1;
2293 Py_BEGIN_ALLOW_THREADS
2294 (void) SOCKETCLOSE(fd);
2295 Py_END_ALLOW_THREADS
2296 }
2297 Py_INCREF(Py_None);
2298 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002299}
2300
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002301PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002302"close()\n\
2303\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002304Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002305
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002306static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002307sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002308{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002309 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002310 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002311 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002312}
2313
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002314PyDoc_STRVAR(detach_doc,
2315"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002316\n\
2317Close the socket object without closing the underlying file descriptor.\
2318The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002319can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002320
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002321static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002322internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 timeout = 0;
2328 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002329
2330#ifdef MS_WINDOWS
2331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 if (s->sock_timeout > 0.0) {
2333 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2334 IS_SELECTABLE(s)) {
2335 /* This is a mess. Best solution: trust select */
2336 fd_set fds;
2337 fd_set fds_exc;
2338 struct timeval tv;
2339 tv.tv_sec = (int)s->sock_timeout;
2340 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2341 FD_ZERO(&fds);
2342 FD_SET(s->sock_fd, &fds);
2343 FD_ZERO(&fds_exc);
2344 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002345 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2346 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 if (res == 0) {
2348 res = WSAEWOULDBLOCK;
2349 timeout = 1;
2350 } else if (res > 0) {
2351 if (FD_ISSET(s->sock_fd, &fds))
2352 /* The socket is in the writable set - this
2353 means connected */
2354 res = 0;
2355 else {
2356 /* As per MS docs, we need to call getsockopt()
2357 to get the underlying error */
2358 int res_size = sizeof res;
2359 /* It must be in the exception set */
2360 assert(FD_ISSET(s->sock_fd, &fds_exc));
2361 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2362 (char *)&res, &res_size))
2363 /* getsockopt also clears WSAGetLastError,
2364 so reset it back. */
2365 WSASetLastError(res);
2366 else
2367 res = WSAGetLastError();
2368 }
2369 }
2370 /* else if (res < 0) an error occurred */
2371 }
2372 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 if (res < 0)
2375 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002376
2377#else
2378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 if (s->sock_timeout > 0.0) {
2380 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2381 timeout = internal_select(s, 1);
2382 if (timeout == 0) {
2383 /* Bug #1019808: in case of an EINPROGRESS,
2384 use getsockopt(SO_ERROR) to get the real
2385 error. */
2386 socklen_t res_size = sizeof res;
2387 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2388 SO_ERROR, &res, &res_size);
2389 if (res == EISCONN)
2390 res = 0;
2391 errno = res;
2392 }
2393 else if (timeout == -1) {
2394 res = errno; /* had error */
2395 }
2396 else
2397 res = EWOULDBLOCK; /* timed out */
2398 }
2399 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 if (res < 0)
2402 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002403
2404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002408}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002409
Fred Drake728819a2000-07-01 03:40:12 +00002410/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002411
Guido van Rossum73624e91994-10-10 17:59:00 +00002412static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002413sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 sock_addr_t addrbuf;
2416 int addrlen;
2417 int res;
2418 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2421 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 Py_BEGIN_ALLOW_THREADS
2424 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2425 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 if (timeout == 1) {
2428 PyErr_SetString(socket_timeout, "timed out");
2429 return NULL;
2430 }
2431 if (res != 0)
2432 return s->errorhandler();
2433 Py_INCREF(Py_None);
2434 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002435}
2436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002437PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002438"connect(address)\n\
2439\n\
2440Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442
Guido van Rossum30a685f1991-06-27 15:51:29 +00002443
Fred Drake728819a2000-07-01 03:40:12 +00002444/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002445
2446static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002447sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 sock_addr_t addrbuf;
2450 int addrlen;
2451 int res;
2452 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2455 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 Py_BEGIN_ALLOW_THREADS
2458 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2459 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 /* Signals are not errors (though they may raise exceptions). Adapted
2462 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002463#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 if (res == EINTR && PyErr_CheckSignals())
2465 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002466#endif
2467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002469}
2470
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002471PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002472"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002473\n\
2474This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002475instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002476
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002477
Guido van Rossumed233a51992-06-23 09:07:03 +00002478/* s.fileno() method */
2479
Guido van Rossum73624e91994-10-10 17:59:00 +00002480static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002481sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002484}
2485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487"fileno() -> integer\n\
2488\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490
Guido van Rossumed233a51992-06-23 09:07:03 +00002491
Guido van Rossumc89705d1992-11-26 08:54:07 +00002492/* s.getsockname() method */
2493
Guido van Rossum73624e91994-10-10 17:59:00 +00002494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 sock_addr_t addrbuf;
2498 int res;
2499 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 if (!getsockaddrlen(s, &addrlen))
2502 return NULL;
2503 memset(&addrbuf, 0, addrlen);
2504 Py_BEGIN_ALLOW_THREADS
2505 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2506 Py_END_ALLOW_THREADS
2507 if (res < 0)
2508 return s->errorhandler();
2509 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2510 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002511}
2512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002513PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002514"getsockname() -> address info\n\
2515\n\
2516Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002517info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002518
Guido van Rossumc89705d1992-11-26 08:54:07 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002521/* s.getpeername() method */
2522
Guido van Rossum73624e91994-10-10 17:59:00 +00002523static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002524sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 sock_addr_t addrbuf;
2527 int res;
2528 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 if (!getsockaddrlen(s, &addrlen))
2531 return NULL;
2532 memset(&addrbuf, 0, addrlen);
2533 Py_BEGIN_ALLOW_THREADS
2534 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2535 Py_END_ALLOW_THREADS
2536 if (res < 0)
2537 return s->errorhandler();
2538 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2539 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002540}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002541
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002542PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002543"getpeername() -> address info\n\
2544\n\
2545Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002546info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002547
Guido van Rossumb6775db1994-08-01 11:34:53 +00002548#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002549
2550
Guido van Rossum30a685f1991-06-27 15:51:29 +00002551/* s.listen(n) method */
2552
Guido van Rossum73624e91994-10-10 17:59:00 +00002553static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002554sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 int backlog;
2557 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002558
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02002559 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 if (backlog == -1 && PyErr_Occurred())
2561 return NULL;
2562 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002563 /* To avoid problems on systems that don't allow a negative backlog
2564 * (which doesn't make sense anyway) we force a minimum value of 0. */
2565 if (backlog < 0)
2566 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 res = listen(s->sock_fd, backlog);
2568 Py_END_ALLOW_THREADS
2569 if (res < 0)
2570 return s->errorhandler();
2571 Py_INCREF(Py_None);
2572 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576"listen(backlog)\n\
2577\n\
2578Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002579least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2580unaccepted connections that the system will allow before refusing new\n\
2581connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002582
2583
Thomas Wouters477c8d52006-05-27 19:21:47 +00002584/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002585 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002586 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002588 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002589 * also possible that we return a number of bytes smaller than the request
2590 * bytes.
2591 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002592
Antoine Pitrou19467d22010-08-17 19:33:30 +00002593static Py_ssize_t
2594sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002596 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002598#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 int remaining;
2600 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002601#endif
2602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (!IS_SELECTABLE(s)) {
2604 select_error();
2605 return -1;
2606 }
2607 if (len == 0) {
2608 /* If 0 bytes were requested, do nothing. */
2609 return 0;
2610 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002611
2612#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002613 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002615 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 if (!timeout)
2617 outlen = recv(s->sock_fd, cbuf, len, flags);
2618 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 if (timeout == 1) {
2621 PyErr_SetString(socket_timeout, "timed out");
2622 return -1;
2623 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002624 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 if (outlen < 0) {
2626 /* Note: the call to errorhandler() ALWAYS indirectly returned
2627 NULL, so ignore its return value */
2628 s->errorhandler();
2629 return -1;
2630 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002631#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 read_buf = cbuf;
2633 remaining = len;
2634 while (remaining != 0) {
2635 unsigned int segment;
2636 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 segment = remaining /SEGMENT_SIZE;
2639 if (segment != 0) {
2640 segment = SEGMENT_SIZE;
2641 }
2642 else {
2643 segment = remaining;
2644 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002645
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002646 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002648 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (!timeout)
2650 nread = recv(s->sock_fd, read_buf, segment, flags);
2651 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 if (timeout == 1) {
2653 PyErr_SetString(socket_timeout, "timed out");
2654 return -1;
2655 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002656 END_SELECT_LOOP(s)
2657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 if (nread < 0) {
2659 s->errorhandler();
2660 return -1;
2661 }
2662 if (nread != remaining) {
2663 read_buf += nread;
2664 break;
2665 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 remaining -= segment;
2668 read_buf += segment;
2669 }
2670 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671#endif /* !__VMS */
2672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002674}
2675
Guido van Rossum48a680c2001-03-02 06:34:14 +00002676
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002677/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002678
Guido van Rossum73624e91994-10-10 17:59:00 +00002679static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002680sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002681{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002682 Py_ssize_t recvlen, outlen;
2683 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002685
Antoine Pitrou19467d22010-08-17 19:33:30 +00002686 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 if (recvlen < 0) {
2690 PyErr_SetString(PyExc_ValueError,
2691 "negative buffersize in recv");
2692 return NULL;
2693 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 /* Allocate a new string. */
2696 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2697 if (buf == NULL)
2698 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 /* Call the guts */
2701 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2702 if (outlen < 0) {
2703 /* An error occurred, release the string and return an
2704 error. */
2705 Py_DECREF(buf);
2706 return NULL;
2707 }
2708 if (outlen != recvlen) {
2709 /* We did not read as many bytes as we anticipated, resize the
2710 string if possible and be successful. */
2711 _PyBytes_Resize(&buf, outlen);
2712 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002715}
2716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002717PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002718"recv(buffersize[, flags]) -> data\n\
2719\n\
2720Receive up to buffersize bytes from the socket. For the optional flags\n\
2721argument, see the Unix manual. When no data is available, block until\n\
2722at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002723the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002724
Guido van Rossum30a685f1991-06-27 15:51:29 +00002725
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002726/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002727
Thomas Wouters477c8d52006-05-27 19:21:47 +00002728static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002729sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002732
Antoine Pitrou19467d22010-08-17 19:33:30 +00002733 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 Py_buffer pbuf;
2735 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002736 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002739 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 &pbuf, &recvlen, &flags))
2741 return NULL;
2742 buf = pbuf.buf;
2743 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 if (recvlen < 0) {
2746 PyBuffer_Release(&pbuf);
2747 PyErr_SetString(PyExc_ValueError,
2748 "negative buffersize in recv_into");
2749 return NULL;
2750 }
2751 if (recvlen == 0) {
2752 /* If nbytes was not specified, use the buffer's length */
2753 recvlen = buflen;
2754 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 /* Check if the buffer is large enough */
2757 if (buflen < recvlen) {
2758 PyBuffer_Release(&pbuf);
2759 PyErr_SetString(PyExc_ValueError,
2760 "buffer too small for requested bytes");
2761 return NULL;
2762 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 /* Call the guts */
2765 readlen = sock_recv_guts(s, buf, recvlen, flags);
2766 if (readlen < 0) {
2767 /* Return an error. */
2768 PyBuffer_Release(&pbuf);
2769 return NULL;
2770 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 PyBuffer_Release(&pbuf);
2773 /* Return the number of bytes read. Note that we do not do anything
2774 special here in the case that readlen < recvlen. */
2775 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002776}
2777
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002778PyDoc_STRVAR(recv_into_doc,
2779"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002780\n\
2781A version of recv() that stores its data into a buffer rather than creating \n\
2782a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2783is not specified (or 0), receive up to the size available in the given buffer.\n\
2784\n\
2785See recv() for documentation about the flags.");
2786
2787
2788/*
Christian Heimes99170a52007-12-19 02:07:34 +00002789 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2790 * into a char buffer. If you have any inc/def ref to do to the objects that
2791 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002792 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002793 * that it is also possible that we return a number of bytes smaller than the
2794 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002795 *
2796 * 'addr' is a return value for the address object. Note that you must decref
2797 * it yourself.
2798 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002799static Py_ssize_t
2800sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 sock_addr_t addrbuf;
2804 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002805 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 if (!getsockaddrlen(s, &addrlen))
2811 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 if (!IS_SELECTABLE(s)) {
2814 select_error();
2815 return -1;
2816 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002817
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002818 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 Py_BEGIN_ALLOW_THREADS
2820 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002821 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002823#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002824#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 n = recvfrom(s->sock_fd, cbuf, len, flags,
2826 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002827#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 n = recvfrom(s->sock_fd, cbuf, len, flags,
2829 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002830#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002831#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 n = recvfrom(s->sock_fd, cbuf, len, flags,
2833 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 }
2836 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 if (timeout == 1) {
2839 PyErr_SetString(socket_timeout, "timed out");
2840 return -1;
2841 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002842 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 if (n < 0) {
2844 s->errorhandler();
2845 return -1;
2846 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2849 addrlen, s->sock_proto)))
2850 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002853}
2854
2855/* s.recvfrom(nbytes [,flags]) method */
2856
2857static PyObject *
2858sock_recvfrom(PySocketSockObject *s, PyObject *args)
2859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 PyObject *buf = NULL;
2861 PyObject *addr = NULL;
2862 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002863 int flags = 0;
2864 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002865
Antoine Pitrou19467d22010-08-17 19:33:30 +00002866 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 if (recvlen < 0) {
2870 PyErr_SetString(PyExc_ValueError,
2871 "negative buffersize in recvfrom");
2872 return NULL;
2873 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2876 if (buf == NULL)
2877 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2880 recvlen, flags, &addr);
2881 if (outlen < 0) {
2882 goto finally;
2883 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 if (outlen != recvlen) {
2886 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002887 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002889 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 goto finally;
2891 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002894
2895finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 Py_XDECREF(buf);
2897 Py_XDECREF(addr);
2898 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002899}
2900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2903\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002904Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002905
Thomas Wouters477c8d52006-05-27 19:21:47 +00002906
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002907/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002908
2909static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002910sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002913
Antoine Pitrou19467d22010-08-17 19:33:30 +00002914 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 Py_buffer pbuf;
2916 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002917 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002920
Antoine Pitrou19467d22010-08-17 19:33:30 +00002921 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 kwlist, &pbuf,
2923 &recvlen, &flags))
2924 return NULL;
2925 buf = pbuf.buf;
2926 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 if (recvlen < 0) {
2929 PyBuffer_Release(&pbuf);
2930 PyErr_SetString(PyExc_ValueError,
2931 "negative buffersize in recvfrom_into");
2932 return NULL;
2933 }
2934 if (recvlen == 0) {
2935 /* If nbytes was not specified, use the buffer's length */
2936 recvlen = buflen;
Benjamin Petersonfbf648e2014-01-13 22:59:38 -05002937 } else if (recvlen > buflen) {
2938 PyBuffer_Release(&pbuf);
2939 PyErr_SetString(PyExc_ValueError,
2940 "nbytes is greater than the length of the buffer");
2941 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2945 if (readlen < 0) {
2946 PyBuffer_Release(&pbuf);
2947 /* Return an error */
2948 Py_XDECREF(addr);
2949 return NULL;
2950 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 PyBuffer_Release(&pbuf);
2953 /* Return the number of bytes read and the address. Note that we do
2954 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002955 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956}
2957
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002958PyDoc_STRVAR(recvfrom_into_doc,
2959"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002960\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002961Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002962
2963
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002964/* The sendmsg() and recvmsg[_into]() methods require a working
2965 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2966#ifdef CMSG_LEN
2967/*
2968 * Call recvmsg() with the supplied iovec structures, flags, and
2969 * ancillary data buffer size (controllen). Returns the tuple return
2970 * value for recvmsg() or recvmsg_into(), with the first item provided
2971 * by the supplied makeval() function. makeval() will be called with
2972 * the length read and makeval_data as arguments, and must return a
2973 * new reference (which will be decrefed if there is a subsequent
2974 * error). On error, closes any file descriptors received via
2975 * SCM_RIGHTS.
2976 */
2977static PyObject *
2978sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2979 int flags, Py_ssize_t controllen,
2980 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2981{
2982 ssize_t bytes_received = -1;
2983 int timeout;
2984 sock_addr_t addrbuf;
2985 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002986 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002987 PyObject *cmsg_list = NULL, *retval = NULL;
2988 void *controlbuf = NULL;
2989 struct cmsghdr *cmsgh;
2990 size_t cmsgdatalen = 0;
2991 int cmsg_status;
2992
2993 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2994 ignored" when the socket is connected (Linux fills them in
2995 anyway for AF_UNIX sockets at least). Normally msg_namelen
2996 seems to be set to 0 if there's no address, but try to
2997 initialize msg_name to something that won't be mistaken for a
2998 real address if that doesn't happen. */
2999 if (!getsockaddrlen(s, &addrbuflen))
3000 return NULL;
3001 memset(&addrbuf, 0, addrbuflen);
3002 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3003
3004 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3005 PyErr_SetString(PyExc_ValueError,
3006 "invalid ancillary data buffer length");
3007 return NULL;
3008 }
3009 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3010 return PyErr_NoMemory();
3011
3012 /* Make the system call. */
3013 if (!IS_SELECTABLE(s)) {
3014 select_error();
3015 goto finally;
3016 }
3017
3018 BEGIN_SELECT_LOOP(s)
3019 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003020 msg.msg_name = SAS2SA(&addrbuf);
3021 msg.msg_namelen = addrbuflen;
3022 msg.msg_iov = iov;
3023 msg.msg_iovlen = iovlen;
3024 msg.msg_control = controlbuf;
3025 msg.msg_controllen = controllen;
3026 timeout = internal_select_ex(s, 0, interval);
3027 if (!timeout)
3028 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3029 Py_END_ALLOW_THREADS;
3030 if (timeout == 1) {
3031 PyErr_SetString(socket_timeout, "timed out");
3032 goto finally;
3033 }
3034 END_SELECT_LOOP(s)
3035
3036 if (bytes_received < 0) {
3037 s->errorhandler();
3038 goto finally;
3039 }
3040
3041 /* Make list of (level, type, data) tuples from control messages. */
3042 if ((cmsg_list = PyList_New(0)) == NULL)
3043 goto err_closefds;
3044 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3045 implementations didn't do so. */
3046 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3047 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3048 PyObject *bytes, *tuple;
3049 int tmp;
3050
3051 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3052 if (cmsg_status != 0) {
3053 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3054 "received malformed or improperly-truncated "
3055 "ancillary data", 1) == -1)
3056 goto err_closefds;
3057 }
3058 if (cmsg_status < 0)
3059 break;
3060 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003061 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003062 goto err_closefds;
3063 }
3064
3065 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3066 cmsgdatalen);
3067 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3068 (int)cmsgh->cmsg_type, bytes);
3069 if (tuple == NULL)
3070 goto err_closefds;
3071 tmp = PyList_Append(cmsg_list, tuple);
3072 Py_DECREF(tuple);
3073 if (tmp != 0)
3074 goto err_closefds;
3075
3076 if (cmsg_status != 0)
3077 break;
3078 }
3079
3080 retval = Py_BuildValue("NOiN",
3081 (*makeval)(bytes_received, makeval_data),
3082 cmsg_list,
3083 (int)msg.msg_flags,
3084 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3085 ((msg.msg_namelen > addrbuflen) ?
3086 addrbuflen : msg.msg_namelen),
3087 s->sock_proto));
3088 if (retval == NULL)
3089 goto err_closefds;
3090
3091finally:
3092 Py_XDECREF(cmsg_list);
3093 PyMem_Free(controlbuf);
3094 return retval;
3095
3096err_closefds:
3097#ifdef SCM_RIGHTS
3098 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3099 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3100 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3101 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3102 if (cmsg_status < 0)
3103 break;
3104 if (cmsgh->cmsg_level == SOL_SOCKET &&
3105 cmsgh->cmsg_type == SCM_RIGHTS) {
3106 size_t numfds;
3107 int *fdp;
3108
3109 numfds = cmsgdatalen / sizeof(int);
3110 fdp = (int *)CMSG_DATA(cmsgh);
3111 while (numfds-- > 0)
3112 close(*fdp++);
3113 }
3114 if (cmsg_status != 0)
3115 break;
3116 }
3117#endif /* SCM_RIGHTS */
3118 goto finally;
3119}
3120
3121
3122static PyObject *
3123makeval_recvmsg(ssize_t received, void *data)
3124{
3125 PyObject **buf = data;
3126
3127 if (received < PyBytes_GET_SIZE(*buf))
3128 _PyBytes_Resize(buf, received);
3129 Py_XINCREF(*buf);
3130 return *buf;
3131}
3132
3133/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3134
3135static PyObject *
3136sock_recvmsg(PySocketSockObject *s, PyObject *args)
3137{
3138 Py_ssize_t bufsize, ancbufsize = 0;
3139 int flags = 0;
3140 struct iovec iov;
3141 PyObject *buf = NULL, *retval = NULL;
3142
3143 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3144 return NULL;
3145
3146 if (bufsize < 0) {
3147 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3148 return NULL;
3149 }
3150 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3151 return NULL;
3152 iov.iov_base = PyBytes_AS_STRING(buf);
3153 iov.iov_len = bufsize;
3154
3155 /* Note that we're passing a pointer to *our pointer* to the bytes
3156 object here (&buf); makeval_recvmsg() may incref the object, or
3157 deallocate it and set our pointer to NULL. */
3158 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3159 &makeval_recvmsg, &buf);
3160 Py_XDECREF(buf);
3161 return retval;
3162}
3163
3164PyDoc_STRVAR(recvmsg_doc,
3165"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3166\n\
3167Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3168socket. The ancbufsize argument sets the size in bytes of the\n\
3169internal buffer used to receive the ancillary data; it defaults to 0,\n\
3170meaning that no ancillary data will be received. Appropriate buffer\n\
3171sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3172CMSG_LEN(), and items which do not fit into the buffer might be\n\
3173truncated or discarded. The flags argument defaults to 0 and has the\n\
3174same meaning as for recv().\n\
3175\n\
3176The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3177The data item is a bytes object holding the non-ancillary data\n\
3178received. The ancdata item is a list of zero or more tuples\n\
3179(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3180(control messages) received: cmsg_level and cmsg_type are integers\n\
3181specifying the protocol level and protocol-specific type respectively,\n\
3182and cmsg_data is a bytes object holding the associated data. The\n\
3183msg_flags item is the bitwise OR of various flags indicating\n\
3184conditions on the received message; see your system documentation for\n\
3185details. If the receiving socket is unconnected, address is the\n\
3186address of the sending socket, if available; otherwise, its value is\n\
3187unspecified.\n\
3188\n\
3189If recvmsg() raises an exception after the system call returns, it\n\
3190will first attempt to close any file descriptors received via the\n\
3191SCM_RIGHTS mechanism.");
3192
3193
3194static PyObject *
3195makeval_recvmsg_into(ssize_t received, void *data)
3196{
3197 return PyLong_FromSsize_t(received);
3198}
3199
3200/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3201
3202static PyObject *
3203sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3204{
3205 Py_ssize_t ancbufsize = 0;
3206 int flags = 0;
3207 struct iovec *iovs = NULL;
3208 Py_ssize_t i, nitems, nbufs = 0;
3209 Py_buffer *bufs = NULL;
3210 PyObject *buffers_arg, *fast, *retval = NULL;
3211
3212 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3213 &buffers_arg, &ancbufsize, &flags))
3214 return NULL;
3215
3216 if ((fast = PySequence_Fast(buffers_arg,
3217 "recvmsg_into() argument 1 must be an "
3218 "iterable")) == NULL)
3219 return NULL;
3220 nitems = PySequence_Fast_GET_SIZE(fast);
3221 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003222 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003223 goto finally;
3224 }
3225
3226 /* Fill in an iovec for each item, and save the Py_buffer
3227 structs to release afterwards. */
3228 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3229 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3230 PyErr_NoMemory();
3231 goto finally;
3232 }
3233 for (; nbufs < nitems; nbufs++) {
3234 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3235 "w*;recvmsg_into() argument 1 must be an iterable "
3236 "of single-segment read-write buffers",
3237 &bufs[nbufs]))
3238 goto finally;
3239 iovs[nbufs].iov_base = bufs[nbufs].buf;
3240 iovs[nbufs].iov_len = bufs[nbufs].len;
3241 }
3242
3243 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3244 &makeval_recvmsg_into, NULL);
3245finally:
3246 for (i = 0; i < nbufs; i++)
3247 PyBuffer_Release(&bufs[i]);
3248 PyMem_Free(bufs);
3249 PyMem_Free(iovs);
3250 Py_DECREF(fast);
3251 return retval;
3252}
3253
3254PyDoc_STRVAR(recvmsg_into_doc,
3255"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3256\n\
3257Receive normal data and ancillary data from the socket, scattering the\n\
3258non-ancillary data into a series of buffers. The buffers argument\n\
3259must be an iterable of objects that export writable buffers\n\
3260(e.g. bytearray objects); these will be filled with successive chunks\n\
3261of the non-ancillary data until it has all been written or there are\n\
3262no more buffers. The ancbufsize argument sets the size in bytes of\n\
3263the internal buffer used to receive the ancillary data; it defaults to\n\
32640, meaning that no ancillary data will be received. Appropriate\n\
3265buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3266or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3267truncated or discarded. The flags argument defaults to 0 and has the\n\
3268same meaning as for recv().\n\
3269\n\
3270The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3271The nbytes item is the total number of bytes of non-ancillary data\n\
3272written into the buffers. The ancdata item is a list of zero or more\n\
3273tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3274data (control messages) received: cmsg_level and cmsg_type are\n\
3275integers specifying the protocol level and protocol-specific type\n\
3276respectively, and cmsg_data is a bytes object holding the associated\n\
3277data. The msg_flags item is the bitwise OR of various flags\n\
3278indicating conditions on the received message; see your system\n\
3279documentation for details. If the receiving socket is unconnected,\n\
3280address is the address of the sending socket, if available; otherwise,\n\
3281its value is unspecified.\n\
3282\n\
3283If recvmsg_into() raises an exception after the system call returns,\n\
3284it will first attempt to close any file descriptors received via the\n\
3285SCM_RIGHTS mechanism.");
3286#endif /* CMSG_LEN */
3287
3288
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003289/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003290
Guido van Rossum73624e91994-10-10 17:59:00 +00003291static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003292sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003295 Py_ssize_t len, n = -1;
3296 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3300 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 if (!IS_SELECTABLE(s)) {
3303 PyBuffer_Release(&pbuf);
3304 return select_error();
3305 }
3306 buf = pbuf.buf;
3307 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003308
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003309 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003311 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003313#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003320 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 PyErr_SetString(socket_timeout, "timed out");
3322 return NULL;
3323 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003324 END_SELECT_LOOP(s)
3325
3326 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 if (n < 0)
3328 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003329 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003330}
3331
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003332PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003333"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003334\n\
3335Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003336argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003337sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003338
3339
3340/* s.sendall(data [,flags]) method */
3341
3342static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003343sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003346 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003347 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3351 return NULL;
3352 buf = pbuf.buf;
3353 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 if (!IS_SELECTABLE(s)) {
3356 PyBuffer_Release(&pbuf);
3357 return select_error();
3358 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003361 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 timeout = internal_select(s, 1);
3363 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003364 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003365#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003366 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003367#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003368 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003369#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003370 }
3371 Py_END_ALLOW_THREADS
3372 if (timeout == 1) {
3373 PyBuffer_Release(&pbuf);
3374 PyErr_SetString(socket_timeout, "timed out");
3375 return NULL;
3376 }
3377 /* PyErr_CheckSignals() might change errno */
3378 saved_errno = errno;
3379 /* We must run our signal handlers before looping again.
3380 send() can return a successful partial write when it is
3381 interrupted, so we can't restrict ourselves to EINTR. */
3382 if (PyErr_CheckSignals()) {
3383 PyBuffer_Release(&pbuf);
3384 return NULL;
3385 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003387 /* If interrupted, try again */
3388 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003390 else
3391 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 }
3393 buf += n;
3394 len -= n;
3395 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 if (n < 0)
3399 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 Py_INCREF(Py_None);
3402 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003403}
3404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003405PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003406"sendall(data[, flags])\n\
3407\n\
3408Send a data string to the socket. For the optional flags\n\
3409argument, see the Unix manual. This calls send() repeatedly\n\
3410until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003411to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003412
Guido van Rossum30a685f1991-06-27 15:51:29 +00003413
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003414/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003415
Guido van Rossum73624e91994-10-10 17:59:00 +00003416static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003417sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 Py_buffer pbuf;
3420 PyObject *addro;
3421 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003422 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 sock_addr_t addrbuf;
3424 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003427 arglen = PyTuple_Size(args);
3428 switch (arglen) {
3429 case 2:
3430 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3431 break;
3432 case 3:
3433 PyArg_ParseTuple(args, "y*iO:sendto",
3434 &pbuf, &flags, &addro);
3435 break;
3436 default:
3437 PyErr_Format(PyExc_TypeError,
3438 "sendto() takes 2 or 3 arguments (%d given)",
3439 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003440 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003442 if (PyErr_Occurred())
3443 return NULL;
3444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 buf = pbuf.buf;
3446 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 if (!IS_SELECTABLE(s)) {
3449 PyBuffer_Release(&pbuf);
3450 return select_error();
3451 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3454 PyBuffer_Release(&pbuf);
3455 return NULL;
3456 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003457
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003458 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003460 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 if (!timeout)
3462 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3463 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003466 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 PyErr_SetString(socket_timeout, "timed out");
3468 return NULL;
3469 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003470 END_SELECT_LOOP(s)
3471 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003472 if (n < 0)
3473 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003474 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003475}
3476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003477PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003478"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003479\n\
3480Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003481For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003482
Guido van Rossum30a685f1991-06-27 15:51:29 +00003483
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003484/* The sendmsg() and recvmsg[_into]() methods require a working
3485 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3486#ifdef CMSG_LEN
3487/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3488
3489static PyObject *
3490sock_sendmsg(PySocketSockObject *s, PyObject *args)
3491{
3492 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3493 Py_buffer *databufs = NULL;
3494 struct iovec *iovs = NULL;
3495 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003496 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003497 struct cmsginfo {
3498 int level;
3499 int type;
3500 Py_buffer data;
3501 } *cmsgs = NULL;
3502 void *controlbuf = NULL;
3503 size_t controllen, controllen_last;
3504 ssize_t bytes_sent = -1;
3505 int addrlen, timeout, flags = 0;
3506 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3507 *cmsg_fast = NULL, *retval = NULL;
3508
3509 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3510 &data_arg, &cmsg_arg, &flags, &addr_arg))
3511 return NULL;
3512
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003513 /* Parse destination address. */
3514 if (addr_arg != NULL && addr_arg != Py_None) {
3515 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3516 goto finally;
3517 msg.msg_name = &addrbuf;
3518 msg.msg_namelen = addrlen;
3519 }
3520
3521 /* Fill in an iovec for each message part, and save the Py_buffer
3522 structs to release afterwards. */
3523 if ((data_fast = PySequence_Fast(data_arg,
3524 "sendmsg() argument 1 must be an "
3525 "iterable")) == NULL)
3526 goto finally;
3527 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3528 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003529 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003530 goto finally;
3531 }
3532 msg.msg_iovlen = ndataparts;
3533 if (ndataparts > 0 &&
3534 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3535 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3536 PyErr_NoMemory();
3537 goto finally;
3538 }
3539 for (; ndatabufs < ndataparts; ndatabufs++) {
3540 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3541 "y*;sendmsg() argument 1 must be an iterable of "
3542 "buffer-compatible objects",
3543 &databufs[ndatabufs]))
3544 goto finally;
3545 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3546 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3547 }
3548
3549 if (cmsg_arg == NULL)
3550 ncmsgs = 0;
3551 else {
3552 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3553 "sendmsg() argument 2 must be an "
3554 "iterable")) == NULL)
3555 goto finally;
3556 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3557 }
3558
3559#ifndef CMSG_SPACE
3560 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003561 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003562 "sending multiple control messages is not supported "
3563 "on this system");
3564 goto finally;
3565 }
3566#endif
3567 /* Save level, type and Py_buffer for each control message,
3568 and calculate total size. */
3569 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3570 PyErr_NoMemory();
3571 goto finally;
3572 }
3573 controllen = controllen_last = 0;
3574 while (ncmsgbufs < ncmsgs) {
3575 size_t bufsize, space;
3576
3577 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3578 "(iiy*):[sendmsg() ancillary data items]",
3579 &cmsgs[ncmsgbufs].level,
3580 &cmsgs[ncmsgbufs].type,
3581 &cmsgs[ncmsgbufs].data))
3582 goto finally;
3583 bufsize = cmsgs[ncmsgbufs++].data.len;
3584
3585#ifdef CMSG_SPACE
3586 if (!get_CMSG_SPACE(bufsize, &space)) {
3587#else
3588 if (!get_CMSG_LEN(bufsize, &space)) {
3589#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003590 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591 goto finally;
3592 }
3593 controllen += space;
3594 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003595 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003596 goto finally;
3597 }
3598 controllen_last = controllen;
3599 }
3600
3601 /* Construct ancillary data block from control message info. */
3602 if (ncmsgbufs > 0) {
3603 struct cmsghdr *cmsgh = NULL;
3604
3605 if ((msg.msg_control = controlbuf =
3606 PyMem_Malloc(controllen)) == NULL) {
3607 PyErr_NoMemory();
3608 goto finally;
3609 }
3610 msg.msg_controllen = controllen;
3611
3612 /* Need to zero out the buffer as a workaround for glibc's
3613 CMSG_NXTHDR() implementation. After getting the pointer to
3614 the next header, it checks its (uninitialized) cmsg_len
3615 member to see if the "message" fits in the buffer, and
3616 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003617 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003618 memset(controlbuf, 0, controllen);
3619
3620 for (i = 0; i < ncmsgbufs; i++) {
3621 size_t msg_len, data_len = cmsgs[i].data.len;
3622 int enough_space = 0;
3623
3624 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3625 if (cmsgh == NULL) {
3626 PyErr_Format(PyExc_RuntimeError,
3627 "unexpected NULL result from %s()",
3628 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3629 goto finally;
3630 }
3631 if (!get_CMSG_LEN(data_len, &msg_len)) {
3632 PyErr_SetString(PyExc_RuntimeError,
3633 "item size out of range for CMSG_LEN()");
3634 goto finally;
3635 }
3636 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3637 size_t space;
3638
3639 cmsgh->cmsg_len = msg_len;
3640 if (get_cmsg_data_space(&msg, cmsgh, &space))
3641 enough_space = (space >= data_len);
3642 }
3643 if (!enough_space) {
3644 PyErr_SetString(PyExc_RuntimeError,
3645 "ancillary data does not fit in calculated "
3646 "space");
3647 goto finally;
3648 }
3649 cmsgh->cmsg_level = cmsgs[i].level;
3650 cmsgh->cmsg_type = cmsgs[i].type;
3651 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3652 }
3653 }
3654
3655 /* Make the system call. */
3656 if (!IS_SELECTABLE(s)) {
3657 select_error();
3658 goto finally;
3659 }
3660
3661 BEGIN_SELECT_LOOP(s)
3662 Py_BEGIN_ALLOW_THREADS;
3663 timeout = internal_select_ex(s, 1, interval);
3664 if (!timeout)
3665 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3666 Py_END_ALLOW_THREADS;
3667 if (timeout == 1) {
3668 PyErr_SetString(socket_timeout, "timed out");
3669 goto finally;
3670 }
3671 END_SELECT_LOOP(s)
3672
3673 if (bytes_sent < 0) {
3674 s->errorhandler();
3675 goto finally;
3676 }
3677 retval = PyLong_FromSsize_t(bytes_sent);
3678
3679finally:
3680 PyMem_Free(controlbuf);
3681 for (i = 0; i < ncmsgbufs; i++)
3682 PyBuffer_Release(&cmsgs[i].data);
3683 PyMem_Free(cmsgs);
3684 Py_XDECREF(cmsg_fast);
3685 for (i = 0; i < ndatabufs; i++)
3686 PyBuffer_Release(&databufs[i]);
3687 PyMem_Free(databufs);
3688 PyMem_Free(iovs);
3689 Py_XDECREF(data_fast);
3690 return retval;
3691}
3692
3693PyDoc_STRVAR(sendmsg_doc,
3694"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3695\n\
3696Send normal and ancillary data to the socket, gathering the\n\
3697non-ancillary data from a series of buffers and concatenating it into\n\
3698a single message. The buffers argument specifies the non-ancillary\n\
3699data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3700The ancdata argument specifies the ancillary data (control messages)\n\
3701as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3702cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3703protocol level and protocol-specific type respectively, and cmsg_data\n\
3704is a buffer-compatible object holding the associated data. The flags\n\
3705argument defaults to 0 and has the same meaning as for send(). If\n\
3706address is supplied and not None, it sets a destination address for\n\
3707the message. The return value is the number of bytes of non-ancillary\n\
3708data sent.");
3709#endif /* CMSG_LEN */
3710
3711
Guido van Rossum30a685f1991-06-27 15:51:29 +00003712/* s.shutdown(how) method */
3713
Guido van Rossum73624e91994-10-10 17:59:00 +00003714static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003715sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 int how;
3718 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003719
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003720 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 if (how == -1 && PyErr_Occurred())
3722 return NULL;
3723 Py_BEGIN_ALLOW_THREADS
3724 res = shutdown(s->sock_fd, how);
3725 Py_END_ALLOW_THREADS
3726 if (res < 0)
3727 return s->errorhandler();
3728 Py_INCREF(Py_None);
3729 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003730}
3731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003732PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003733"shutdown(flag)\n\
3734\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003735Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3736of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003737
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003738#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003739static PyObject*
3740sock_ioctl(PySocketSockObject *s, PyObject *arg)
3741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 unsigned long cmd = SIO_RCVALL;
3743 PyObject *argO;
3744 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3747 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 switch (cmd) {
3750 case SIO_RCVALL: {
3751 unsigned int option = RCVALL_ON;
3752 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3753 return NULL;
3754 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3755 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3756 return set_error();
3757 }
3758 return PyLong_FromUnsignedLong(recv); }
3759 case SIO_KEEPALIVE_VALS: {
3760 struct tcp_keepalive ka;
3761 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3762 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3763 return NULL;
3764 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3765 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3766 return set_error();
3767 }
3768 return PyLong_FromUnsignedLong(recv); }
3769 default:
3770 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3771 return NULL;
3772 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003773}
3774PyDoc_STRVAR(sock_ioctl_doc,
3775"ioctl(cmd, option) -> long\n\
3776\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003777Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3778SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3779SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003780#endif
3781
3782#if defined(MS_WINDOWS)
3783static PyObject*
3784sock_share(PySocketSockObject *s, PyObject *arg)
3785{
3786 WSAPROTOCOL_INFO info;
3787 DWORD processId;
3788 int result;
3789
3790 if (!PyArg_ParseTuple(arg, "I", &processId))
3791 return NULL;
3792
3793 Py_BEGIN_ALLOW_THREADS
3794 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3795 Py_END_ALLOW_THREADS
3796 if (result == SOCKET_ERROR)
3797 return set_error();
3798 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3799}
3800PyDoc_STRVAR(sock_share_doc,
3801"share(process_id) -> bytes\n\
3802\n\
3803Share the socket with another process. The target process id\n\
3804must be provided and the resulting bytes object passed to the target\n\
3805process. There the shared socket can be instantiated by calling\n\
3806socket.fromshare().");
3807
Christian Heimesfaf2f632008-01-06 16:59:19 +00003808
3809#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003810
3811/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003812
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003813static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3815 accept_doc},
3816 {"bind", (PyCFunction)sock_bind, METH_O,
3817 bind_doc},
3818 {"close", (PyCFunction)sock_close, METH_NOARGS,
3819 close_doc},
3820 {"connect", (PyCFunction)sock_connect, METH_O,
3821 connect_doc},
3822 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3823 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003824 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3825 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003826 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3827 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003828#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 {"getpeername", (PyCFunction)sock_getpeername,
3830 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 {"getsockname", (PyCFunction)sock_getsockname,
3833 METH_NOARGS, getsockname_doc},
3834 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3835 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003836#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3838 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003839#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003840#if defined(MS_WINDOWS)
3841 {"share", (PyCFunction)sock_share, METH_VARARGS,
3842 sock_share_doc},
3843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 {"listen", (PyCFunction)sock_listen, METH_O,
3845 listen_doc},
3846 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3847 recv_doc},
3848 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3849 recv_into_doc},
3850 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3851 recvfrom_doc},
3852 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3853 recvfrom_into_doc},
3854 {"send", (PyCFunction)sock_send, METH_VARARGS,
3855 send_doc},
3856 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3857 sendall_doc},
3858 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3859 sendto_doc},
3860 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3861 setblocking_doc},
3862 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3863 settimeout_doc},
3864 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3865 gettimeout_doc},
3866 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3867 setsockopt_doc},
3868 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3869 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003870#ifdef CMSG_LEN
3871 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3872 recvmsg_doc},
3873 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3874 recvmsg_into_doc,},
3875 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3876 sendmsg_doc},
3877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003879};
3880
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003881/* SockObject members */
3882static PyMemberDef sock_memberlist[] = {
3883 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3884 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3885 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3886 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3887 {0},
3888};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003889
Guido van Rossum73624e91994-10-10 17:59:00 +00003890/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003891 First close the file description. */
3892
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003893static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003894sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003895{
Antoine Pitroue033e062010-10-29 10:38:18 +00003896 if (s->sock_fd != -1) {
3897 PyObject *exc, *val, *tb;
3898 Py_ssize_t old_refcount = Py_REFCNT(s);
3899 ++Py_REFCNT(s);
3900 PyErr_Fetch(&exc, &val, &tb);
3901 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3902 "unclosed %R", s))
3903 /* Spurious errors can appear at shutdown */
3904 if (PyErr_ExceptionMatches(PyExc_Warning))
3905 PyErr_WriteUnraisable((PyObject *) s);
3906 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003908 Py_REFCNT(s) = old_refcount;
3909 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003910 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003911}
3912
Guido van Rossum30a685f1991-06-27 15:51:29 +00003913
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003914static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003915sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003916{
Fred Drakea04eaad2000-06-30 02:46:07 +00003917#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 if (s->sock_fd > LONG_MAX) {
3919 /* this can occur on Win64, and actually there is a special
3920 ugly printf formatter for decimal pointer length integer
3921 printing, only bother if necessary*/
3922 PyErr_SetString(PyExc_OverflowError,
3923 "no printf formatter to display "
3924 "the socket descriptor in decimal");
3925 return NULL;
3926 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 return PyUnicode_FromFormat(
3929 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3930 (long)s->sock_fd, s->sock_family,
3931 s->sock_type,
3932 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003933}
3934
3935
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003936/* Create a new, uninitialized socket object. */
3937
3938static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003939sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 new = type->tp_alloc(type, 0);
3944 if (new != NULL) {
3945 ((PySocketSockObject *)new)->sock_fd = -1;
3946 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3947 ((PySocketSockObject *)new)->errorhandler = &set_error;
3948 }
3949 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003950}
3951
3952
3953/* Initialize a new socket object. */
3954
3955/*ARGSUSED*/
3956static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003957sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 PySocketSockObject *s = (PySocketSockObject *)self;
3960 PyObject *fdobj = NULL;
3961 SOCKET_T fd = INVALID_SOCKET;
3962 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3963 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3966 "|iiiO:socket", keywords,
3967 &family, &type, &proto, &fdobj))
3968 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003970 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003971#ifdef MS_WINDOWS
3972 /* recreate a socket that was duplicated */
3973 if (PyBytes_Check(fdobj)) {
3974 WSAPROTOCOL_INFO info;
3975 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3976 PyErr_Format(PyExc_ValueError,
3977 "socket descriptor string has wrong size, "
3978 "should be %zu bytes.", sizeof(info));
3979 return -1;
3980 }
3981 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3982 Py_BEGIN_ALLOW_THREADS
3983 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3984 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3985 Py_END_ALLOW_THREADS
3986 if (fd == INVALID_SOCKET) {
3987 set_error();
3988 return -1;
3989 }
3990 family = info.iAddressFamily;
3991 type = info.iSocketType;
3992 proto = info.iProtocol;
3993 }
3994 else
3995#endif
3996 {
3997 fd = PyLong_AsSocket_t(fdobj);
3998 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3999 return -1;
4000 if (fd == INVALID_SOCKET) {
4001 PyErr_SetString(PyExc_ValueError,
4002 "can't use invalid socket value");
4003 return -1;
4004 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004005 }
4006 }
4007 else {
4008 Py_BEGIN_ALLOW_THREADS
4009 fd = socket(family, type, proto);
4010 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004012 if (fd == INVALID_SOCKET) {
4013 set_error();
4014 return -1;
4015 }
4016 }
4017 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004019 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004020
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004021}
4022
4023
Guido van Rossumb6775db1994-08-01 11:34:53 +00004024/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004025
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004026static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004027 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4028 "_socket.socket", /* tp_name */
4029 sizeof(PySocketSockObject), /* tp_basicsize */
4030 0, /* tp_itemsize */
4031 (destructor)sock_dealloc, /* tp_dealloc */
4032 0, /* tp_print */
4033 0, /* tp_getattr */
4034 0, /* tp_setattr */
4035 0, /* tp_reserved */
4036 (reprfunc)sock_repr, /* tp_repr */
4037 0, /* tp_as_number */
4038 0, /* tp_as_sequence */
4039 0, /* tp_as_mapping */
4040 0, /* tp_hash */
4041 0, /* tp_call */
4042 0, /* tp_str */
4043 PyObject_GenericGetAttr, /* tp_getattro */
4044 0, /* tp_setattro */
4045 0, /* tp_as_buffer */
4046 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4047 sock_doc, /* tp_doc */
4048 0, /* tp_traverse */
4049 0, /* tp_clear */
4050 0, /* tp_richcompare */
4051 0, /* tp_weaklistoffset */
4052 0, /* tp_iter */
4053 0, /* tp_iternext */
4054 sock_methods, /* tp_methods */
4055 sock_memberlist, /* tp_members */
4056 0, /* tp_getset */
4057 0, /* tp_base */
4058 0, /* tp_dict */
4059 0, /* tp_descr_get */
4060 0, /* tp_descr_set */
4061 0, /* tp_dictoffset */
4062 sock_initobj, /* tp_init */
4063 PyType_GenericAlloc, /* tp_alloc */
4064 sock_new, /* tp_new */
4065 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004066};
4067
Guido van Rossum30a685f1991-06-27 15:51:29 +00004068
Guido van Rossum81194471991-07-27 21:42:02 +00004069/* Python interface to gethostname(). */
4070
4071/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004072static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004073socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004074{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004075#ifdef MS_WINDOWS
4076 /* Don't use winsock's gethostname, as this returns the ANSI
4077 version of the hostname, whereas we need a Unicode string.
4078 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004079 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004080 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004081 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004082 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004083
4084 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004085 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004086
4087 if (GetLastError() != ERROR_MORE_DATA)
4088 return PyErr_SetFromWindowsErr(0);
4089
4090 if (size == 0)
4091 return PyUnicode_New(0, 0);
4092
4093 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4094 names */
4095 name = PyMem_Malloc(size * sizeof(wchar_t));
4096 if (!name)
4097 return NULL;
4098 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4099 name,
4100 &size))
4101 {
4102 PyMem_Free(name);
4103 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004104 }
Victor Stinner74168972011-11-17 01:11:36 +01004105
4106 result = PyUnicode_FromWideChar(name, size);
4107 PyMem_Free(name);
4108 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004110 char buf[1024];
4111 int res;
4112 Py_BEGIN_ALLOW_THREADS
4113 res = gethostname(buf, (int) sizeof buf - 1);
4114 Py_END_ALLOW_THREADS
4115 if (res < 0)
4116 return set_error();
4117 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004118 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004119#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004120}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004122PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004123"gethostname() -> string\n\
4124\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004125Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004126
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004127#ifdef HAVE_SETHOSTNAME
4128PyDoc_STRVAR(sethostname_doc,
4129"sethostname(name)\n\n\
4130Sets the hostname to name.");
4131
4132static PyObject *
4133socket_sethostname(PyObject *self, PyObject *args)
4134{
4135 PyObject *hnobj;
4136 Py_buffer buf;
4137 int res, flag = 0;
4138
Christian Heimesd2774c72013-06-19 02:06:29 +02004139#ifdef _AIX
4140/* issue #18259, not declared in any useful header file */
4141extern int sethostname(const char *, size_t);
4142#endif
4143
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004144 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4145 PyErr_Clear();
4146 if (!PyArg_ParseTuple(args, "O&:sethostname",
4147 PyUnicode_FSConverter, &hnobj))
4148 return NULL;
4149 flag = 1;
4150 }
4151 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4152 if (!res) {
4153 res = sethostname(buf.buf, buf.len);
4154 PyBuffer_Release(&buf);
4155 }
4156 if (flag)
4157 Py_DECREF(hnobj);
4158 if (res)
4159 return set_error();
4160 Py_RETURN_NONE;
4161}
4162#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004163
Guido van Rossum30a685f1991-06-27 15:51:29 +00004164/* Python interface to gethostbyname(name). */
4165
4166/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004167static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004168socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 char *name;
4171 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004172 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004173
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004174 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 return NULL;
4176 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004177 goto finally;
4178 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4179finally:
4180 PyMem_Free(name);
4181 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004182}
4183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004184PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004185"gethostbyname(host) -> address\n\
4186\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004187Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004188
4189
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004190/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4191
4192static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004193gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 char **pch;
4196 PyObject *rtn_tuple = (PyObject *)NULL;
4197 PyObject *name_list = (PyObject *)NULL;
4198 PyObject *addr_list = (PyObject *)NULL;
4199 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 if (h == NULL) {
4202 /* Let's get real error message to return */
4203 set_herror(h_errno);
4204 return NULL;
4205 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 if (h->h_addrtype != af) {
4208 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004209 errno = EAFNOSUPPORT;
4210 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 return NULL;
4212 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004216 case AF_INET:
4217 if (alen < sizeof(struct sockaddr_in))
4218 return NULL;
4219 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004220
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004221#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 case AF_INET6:
4223 if (alen < sizeof(struct sockaddr_in6))
4224 return NULL;
4225 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 if ((name_list = PyList_New(0)) == NULL)
4231 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 if ((addr_list = PyList_New(0)) == NULL)
4234 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 /* SF #1511317: h_aliases can be NULL */
4237 if (h->h_aliases) {
4238 for (pch = h->h_aliases; *pch != NULL; pch++) {
4239 int status;
4240 tmp = PyUnicode_FromString(*pch);
4241 if (tmp == NULL)
4242 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 status = PyList_Append(name_list, tmp);
4245 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 if (status)
4248 goto err;
4249 }
4250 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4253 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 case AF_INET:
4258 {
4259 struct sockaddr_in sin;
4260 memset(&sin, 0, sizeof(sin));
4261 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004262#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4266 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 if (pch == h->h_addr_list && alen >= sizeof(sin))
4269 memcpy((char *) addr, &sin, sizeof(sin));
4270 break;
4271 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004272
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004273#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 case AF_INET6:
4275 {
4276 struct sockaddr_in6 sin6;
4277 memset(&sin6, 0, sizeof(sin6));
4278 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004279#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4283 tmp = makeipaddr((struct sockaddr *)&sin6,
4284 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004286 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4287 memcpy((char *) addr, &sin6, sizeof(sin6));
4288 break;
4289 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004290#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004293 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 "unsupported address family");
4295 return NULL;
4296 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 if (tmp == NULL)
4299 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 status = PyList_Append(addr_list, tmp);
4302 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 if (status)
4305 goto err;
4306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004309
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004310 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 Py_XDECREF(name_list);
4312 Py_XDECREF(addr_list);
4313 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004314}
4315
4316
4317/* Python interface to gethostbyname_ex(name). */
4318
4319/*ARGSUSED*/
4320static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004321socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 char *name;
4324 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004325 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004327 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004328#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004330#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004332#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 char buf[16384];
4334 int buf_len = (sizeof buf) - 1;
4335 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004336#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004337#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004338 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004339#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004340#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004341
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004342 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004344 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004345 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004347#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004348#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004349 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004351#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004353#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 memset((void *) &data, '\0', sizeof(data));
4355 result = gethostbyname_r(name, &hp_allocated, &data);
4356 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004357#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004358#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004359#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004363#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 Py_END_ALLOW_THREADS
4365 /* Some C libraries would require addr.__ss_family instead of
4366 addr.ss_family.
4367 Therefore, we cast the sockaddr_storage into sockaddr to
4368 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004369 sa = SAS2SA(&addr);
4370 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004372#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004374#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004375finally:
4376 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004378}
4379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004380PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004381"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4382\n\
4383Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004384for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004385
4386
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004387/* Python interface to gethostbyaddr(IP). */
4388
4389/*ARGSUSED*/
4390static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004391socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004392{
Charles-François Natali8b759652011-12-23 16:44:51 +01004393 sock_addr_t addr;
4394 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 char *ip_num;
4396 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004397 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004398#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004400#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004402#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 /* glibcs up to 2.10 assume that the buf argument to
4404 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4405 does not ensure. The attribute below instructs the compiler
4406 to maintain this alignment. */
4407 char buf[16384] Py_ALIGNED(8);
4408 int buf_len = (sizeof buf) - 1;
4409 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004410#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004411#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004413#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004414#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 char *ap;
4416 int al;
4417 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004418
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004419 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 return NULL;
4421 af = AF_UNSPEC;
4422 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004423 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 af = sa->sa_family;
4425 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004426 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 switch (af) {
4428 case AF_INET:
4429 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4430 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4431 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004432#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 case AF_INET6:
4434 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4435 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4436 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004439 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004440 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 }
4442 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004443#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004444#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004445 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 &hp_allocated, buf, buf_len,
4447 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004448#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 h = gethostbyaddr_r(ap, al, af,
4450 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004451#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 memset((void *) &data, '\0', sizeof(data));
4453 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4454 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004455#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004456#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004457#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004461#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004463 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004464#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004466#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004467finally:
4468 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004470}
4471
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004472PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004473"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4474\n\
4475Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004476for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004477
Guido van Rossum30a685f1991-06-27 15:51:29 +00004478
4479/* Python interface to getservbyname(name).
4480 This only returns the port number, since the other info is already
4481 known or not useful (like the list of aliases). */
4482
4483/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004484static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004485socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 char *name, *proto=NULL;
4488 struct servent *sp;
4489 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4490 return NULL;
4491 Py_BEGIN_ALLOW_THREADS
4492 sp = getservbyname(name, proto);
4493 Py_END_ALLOW_THREADS
4494 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004495 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 return NULL;
4497 }
4498 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004499}
4500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004501PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004502"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004503\n\
4504Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004505The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4506otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004507
Guido van Rossum30a685f1991-06-27 15:51:29 +00004508
Barry Warsaw11b91a02004-06-28 00:50:43 +00004509/* Python interface to getservbyport(port).
4510 This only returns the service name, since the other info is already
4511 known or not useful (like the list of aliases). */
4512
4513/*ARGSUSED*/
4514static PyObject *
4515socket_getservbyport(PyObject *self, PyObject *args)
4516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 int port;
4518 char *proto=NULL;
4519 struct servent *sp;
4520 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4521 return NULL;
4522 if (port < 0 || port > 0xffff) {
4523 PyErr_SetString(
4524 PyExc_OverflowError,
4525 "getservbyport: port must be 0-65535.");
4526 return NULL;
4527 }
4528 Py_BEGIN_ALLOW_THREADS
4529 sp = getservbyport(htons((short)port), proto);
4530 Py_END_ALLOW_THREADS
4531 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004532 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 return NULL;
4534 }
4535 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004536}
4537
4538PyDoc_STRVAR(getservbyport_doc,
4539"getservbyport(port[, protocolname]) -> string\n\
4540\n\
4541Return the service name from a port number and protocol name.\n\
4542The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4543otherwise any protocol will match.");
4544
Guido van Rossum3901d851996-12-19 16:35:04 +00004545/* Python interface to getprotobyname(name).
4546 This only returns the protocol number, since the other info is
4547 already known or not useful (like the list of aliases). */
4548
4549/*ARGSUSED*/
4550static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004551socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 char *name;
4554 struct protoent *sp;
4555 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4556 return NULL;
4557 Py_BEGIN_ALLOW_THREADS
4558 sp = getprotobyname(name);
4559 Py_END_ALLOW_THREADS
4560 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004561 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 return NULL;
4563 }
4564 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004565}
4566
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004567PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004568"getprotobyname(name) -> integer\n\
4569\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004570Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004571
Guido van Rossum3901d851996-12-19 16:35:04 +00004572
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004573#ifndef NO_DUP
4574/* dup() function for socket fds */
4575
4576static PyObject *
4577socket_dup(PyObject *self, PyObject *fdobj)
4578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 SOCKET_T fd, newfd;
4580 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004581
4582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 fd = PyLong_AsSocket_t(fdobj);
4584 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4585 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 newfd = dup_socket(fd);
4588 if (newfd == INVALID_SOCKET)
4589 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 newfdobj = PyLong_FromSocket_t(newfd);
4592 if (newfdobj == NULL)
4593 SOCKETCLOSE(newfd);
4594 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004595}
4596
4597PyDoc_STRVAR(dup_doc,
4598"dup(integer) -> integer\n\
4599\n\
4600Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4601sockets; on some platforms os.dup() won't work for socket file descriptors.");
4602#endif
4603
4604
Dave Cole331708b2004-08-09 04:51:41 +00004605#ifdef HAVE_SOCKETPAIR
4606/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004607 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004608 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004609
4610/*ARGSUSED*/
4611static PyObject *
4612socket_socketpair(PyObject *self, PyObject *args)
4613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 PySocketSockObject *s0 = NULL, *s1 = NULL;
4615 SOCKET_T sv[2];
4616 int family, type = SOCK_STREAM, proto = 0;
4617 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004618
4619#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004621#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4625 &family, &type, &proto))
4626 return NULL;
4627 /* Create a pair of socket fds */
4628 if (socketpair(family, type, proto, sv) < 0)
4629 return set_error();
4630 s0 = new_sockobject(sv[0], family, type, proto);
4631 if (s0 == NULL)
4632 goto finally;
4633 s1 = new_sockobject(sv[1], family, type, proto);
4634 if (s1 == NULL)
4635 goto finally;
4636 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004637
4638finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 if (res == NULL) {
4640 if (s0 == NULL)
4641 SOCKETCLOSE(sv[0]);
4642 if (s1 == NULL)
4643 SOCKETCLOSE(sv[1]);
4644 }
4645 Py_XDECREF(s0);
4646 Py_XDECREF(s1);
4647 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004648}
4649
4650PyDoc_STRVAR(socketpair_doc,
4651"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4652\n\
4653Create a pair of socket objects from the sockets returned by the platform\n\
4654socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004655The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004656AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004657
4658#endif /* HAVE_SOCKETPAIR */
4659
4660
Guido van Rossum006bf911996-06-12 04:04:55 +00004661static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004662socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004664 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4667 return NULL;
4668 }
4669 if (x1 < 0) {
4670 PyErr_SetString(PyExc_OverflowError,
4671 "can't convert negative number to unsigned long");
4672 return NULL;
4673 }
4674 x2 = (unsigned int)ntohs((unsigned short)x1);
4675 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004676}
4677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004678PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004679"ntohs(integer) -> integer\n\
4680\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004681Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004682
4683
Guido van Rossum006bf911996-06-12 04:04:55 +00004684static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004685socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 if (PyLong_Check(arg)) {
4690 x = PyLong_AsUnsignedLong(arg);
4691 if (x == (unsigned long) -1 && PyErr_Occurred())
4692 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004693#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 {
4695 unsigned long y;
4696 /* only want the trailing 32 bits */
4697 y = x & 0xFFFFFFFFUL;
4698 if (y ^ x)
4699 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004700 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 x = y;
4702 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 }
4705 else
4706 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004707 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004710}
4711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004712PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004713"ntohl(integer) -> integer\n\
4714\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004715Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004716
4717
Guido van Rossum006bf911996-06-12 04:04:55 +00004718static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004719socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4724 return NULL;
4725 }
4726 if (x1 < 0) {
4727 PyErr_SetString(PyExc_OverflowError,
4728 "can't convert negative number to unsigned long");
4729 return NULL;
4730 }
4731 x2 = (unsigned int)htons((unsigned short)x1);
4732 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004733}
4734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004735PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004736"htons(integer) -> integer\n\
4737\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004738Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004739
4740
Guido van Rossum006bf911996-06-12 04:04:55 +00004741static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004742socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 if (PyLong_Check(arg)) {
4747 x = PyLong_AsUnsignedLong(arg);
4748 if (x == (unsigned long) -1 && PyErr_Occurred())
4749 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004750#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 {
4752 unsigned long y;
4753 /* only want the trailing 32 bits */
4754 y = x & 0xFFFFFFFFUL;
4755 if (y ^ x)
4756 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004757 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 x = y;
4759 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 }
4762 else
4763 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004764 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 Py_TYPE(arg)->tp_name);
4766 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004767}
4768
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004769PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004770"htonl(integer) -> integer\n\
4771\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004772Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004773
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004774/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004776PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004777"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004778\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004779Convert 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 +00004780binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004781
4782static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004783socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004784{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004785#ifndef INADDR_NONE
4786#define INADDR_NONE (-1)
4787#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004788#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004790#endif
4791
4792#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004793#if (SIZEOF_INT != 4)
4794#error "Not sure if in_addr_t exists and int is not 32-bits."
4795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 /* Have to use inet_addr() instead */
4797 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4802 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004803
Tim Peters1df9fdd2003-02-13 03:13:40 +00004804
4805#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004806
4807#ifdef USE_INET_ATON_WEAKLINK
4808 if (inet_aton != NULL) {
4809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 if (inet_aton(ip_addr, &buf))
4811 return PyBytes_FromStringAndSize((char *)(&buf),
4812 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004813
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004814 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 "illegal IP address string passed to inet_aton");
4816 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004817
Thomas Wouters477c8d52006-05-27 19:21:47 +00004818#ifdef USE_INET_ATON_WEAKLINK
4819 } else {
4820#endif
4821
4822#endif
4823
4824#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 /* special-case this address as inet_addr might return INADDR_NONE
4827 * for this */
4828 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4829 packed_addr = 0xFFFFFFFF;
4830 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004835 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 "illegal IP address string passed to inet_aton");
4837 return NULL;
4838 }
4839 }
4840 return PyBytes_FromStringAndSize((char *) &packed_addr,
4841 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004842
4843#ifdef USE_INET_ATON_WEAKLINK
4844 }
4845#endif
4846
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004847#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004848}
4849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004850PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004851"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004852\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004853Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004854
4855static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004856socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 char *packed_str;
4859 int addr_len;
4860 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4863 return NULL;
4864 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004867 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 "packed IP wrong length for inet_ntoa");
4869 return NULL;
4870 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004875}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004876
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004877#ifdef HAVE_INET_PTON
4878
4879PyDoc_STRVAR(inet_pton_doc,
4880"inet_pton(af, ip) -> packed IP address string\n\
4881\n\
4882Convert an IP address from string format to a packed string suitable\n\
4883for use with low-level network functions.");
4884
4885static PyObject *
4886socket_inet_pton(PyObject *self, PyObject *args)
4887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 int af;
4889 char* ip;
4890 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004891#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004893#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004896 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4897 return NULL;
4898 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004899
Martin v. Löwis04697e82004-06-02 12:35:29 +00004900#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004902 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 "can't use AF_INET6, IPv6 is disabled");
4904 return NULL;
4905 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004906#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 retval = inet_pton(af, ip, packed);
4909 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004910 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 return NULL;
4912 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004913 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 "illegal IP address string passed to inet_pton");
4915 return NULL;
4916 } else if (af == AF_INET) {
4917 return PyBytes_FromStringAndSize(packed,
4918 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004919#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 } else if (af == AF_INET6) {
4921 return PyBytes_FromStringAndSize(packed,
4922 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004924 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004925 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 return NULL;
4927 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004928}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004929
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004930PyDoc_STRVAR(inet_ntop_doc,
4931"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4932\n\
4933Convert a packed IP address of the given family to string format.");
4934
4935static PyObject *
4936socket_inet_ntop(PyObject *self, PyObject *args)
4937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 int af;
4939 char* packed;
4940 int len;
4941 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004942#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004944#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004946#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4949 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4952 return NULL;
4953 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 if (af == AF_INET) {
4956 if (len != sizeof(struct in_addr)) {
4957 PyErr_SetString(PyExc_ValueError,
4958 "invalid length of packed IP address string");
4959 return NULL;
4960 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004961#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 } else if (af == AF_INET6) {
4963 if (len != sizeof(struct in6_addr)) {
4964 PyErr_SetString(PyExc_ValueError,
4965 "invalid length of packed IP address string");
4966 return NULL;
4967 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 } else {
4970 PyErr_Format(PyExc_ValueError,
4971 "unknown address family %d", af);
4972 return NULL;
4973 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 retval = inet_ntop(af, packed, ip, sizeof(ip));
4976 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004977 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 return NULL;
4979 } else {
4980 return PyUnicode_FromString(retval);
4981 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 /* NOTREACHED */
4984 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4985 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004986}
4987
4988#endif /* HAVE_INET_PTON */
4989
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004990/* Python interface to getaddrinfo(host, port). */
4991
4992/*ARGSUSED*/
4993static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004994socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004995{
Victor Stinner77af1722011-05-26 14:05:59 +02004996 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004997 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 struct addrinfo hints, *res;
4999 struct addrinfo *res0 = NULL;
5000 PyObject *hobj = NULL;
5001 PyObject *pobj = (PyObject *)NULL;
5002 char pbuf[30];
5003 char *hptr, *pptr;
5004 int family, socktype, protocol, flags;
5005 int error;
5006 PyObject *all = (PyObject *)NULL;
5007 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 family = socktype = protocol = flags = 0;
5010 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005011 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005012 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 &protocol, &flags)) {
5014 return NULL;
5015 }
5016 if (hobj == Py_None) {
5017 hptr = NULL;
5018 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005019 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005020
5021 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 if (!idna)
5023 return NULL;
5024 assert(PyBytes_Check(idna));
5025 hptr = PyBytes_AS_STRING(idna);
5026 } else if (PyBytes_Check(hobj)) {
5027 hptr = PyBytes_AsString(hobj);
5028 } else {
5029 PyErr_SetString(PyExc_TypeError,
5030 "getaddrinfo() argument 1 must be string or None");
5031 return NULL;
5032 }
5033 if (PyLong_CheckExact(pobj)) {
5034 long value = PyLong_AsLong(pobj);
5035 if (value == -1 && PyErr_Occurred())
5036 goto err;
5037 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5038 pptr = pbuf;
5039 } else if (PyUnicode_Check(pobj)) {
5040 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005041 if (pptr == NULL)
5042 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005044 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 } else if (pobj == Py_None) {
5046 pptr = (char *)NULL;
5047 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005048 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 goto err;
5050 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005051#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005052 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5053 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
5054 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5055 * This workaround avoids a segfault in libsystem.
5056 */
5057 pptr = "00";
5058 }
5059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 memset(&hints, 0, sizeof(hints));
5061 hints.ai_family = family;
5062 hints.ai_socktype = socktype;
5063 hints.ai_protocol = protocol;
5064 hints.ai_flags = flags;
5065 Py_BEGIN_ALLOW_THREADS
5066 ACQUIRE_GETADDRINFO_LOCK
5067 error = getaddrinfo(hptr, pptr, &hints, &res0);
5068 Py_END_ALLOW_THREADS
5069 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5070 if (error) {
5071 set_gaierror(error);
5072 goto err;
5073 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 if ((all = PyList_New(0)) == NULL)
5076 goto err;
5077 for (res = res0; res; res = res->ai_next) {
5078 PyObject *single;
5079 PyObject *addr =
5080 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5081 if (addr == NULL)
5082 goto err;
5083 single = Py_BuildValue("iiisO", res->ai_family,
5084 res->ai_socktype, res->ai_protocol,
5085 res->ai_canonname ? res->ai_canonname : "",
5086 addr);
5087 Py_DECREF(addr);
5088 if (single == NULL)
5089 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 if (PyList_Append(all, single))
5092 goto err;
5093 Py_XDECREF(single);
5094 }
5095 Py_XDECREF(idna);
5096 if (res0)
5097 freeaddrinfo(res0);
5098 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005099 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 Py_XDECREF(all);
5101 Py_XDECREF(idna);
5102 if (res0)
5103 freeaddrinfo(res0);
5104 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005105}
5106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005107PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005108"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5109 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005111Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005112
5113/* Python interface to getnameinfo(sa, flags). */
5114
5115/*ARGSUSED*/
5116static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005117socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 PyObject *sa = (PyObject *)NULL;
5120 int flags;
5121 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005122 int port;
5123 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5125 struct addrinfo hints, *res = NULL;
5126 int error;
5127 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 flags = flowinfo = scope_id = 0;
5130 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5131 return NULL;
5132 if (!PyTuple_Check(sa)) {
5133 PyErr_SetString(PyExc_TypeError,
5134 "getnameinfo() argument 1 must be a tuple");
5135 return NULL;
5136 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005137 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 &hostp, &port, &flowinfo, &scope_id))
5139 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005140 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005141 PyErr_SetString(PyExc_OverflowError,
5142 "getsockaddrarg: flowinfo must be 0-1048575.");
5143 return NULL;
5144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5146 memset(&hints, 0, sizeof(hints));
5147 hints.ai_family = AF_UNSPEC;
5148 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005149 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 Py_BEGIN_ALLOW_THREADS
5151 ACQUIRE_GETADDRINFO_LOCK
5152 error = getaddrinfo(hostp, pbuf, &hints, &res);
5153 Py_END_ALLOW_THREADS
5154 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5155 if (error) {
5156 set_gaierror(error);
5157 goto fail;
5158 }
5159 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005160 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 "sockaddr resolved to multiple addresses");
5162 goto fail;
5163 }
5164 switch (res->ai_family) {
5165 case AF_INET:
5166 {
5167 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005168 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 "IPv4 sockaddr must be 2 tuple");
5170 goto fail;
5171 }
5172 break;
5173 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005174#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 case AF_INET6:
5176 {
5177 struct sockaddr_in6 *sin6;
5178 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005179 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 sin6->sin6_scope_id = scope_id;
5181 break;
5182 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005185 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5187 if (error) {
5188 set_gaierror(error);
5189 goto fail;
5190 }
5191 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005192
5193fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 if (res)
5195 freeaddrinfo(res);
5196 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005197}
5198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005199PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005200"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005201\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005202Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005203
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005204
5205/* Python API to getting and setting the default timeout value. */
5206
5207static PyObject *
5208socket_getdefaulttimeout(PyObject *self)
5209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 if (defaulttimeout < 0.0) {
5211 Py_INCREF(Py_None);
5212 return Py_None;
5213 }
5214 else
5215 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005216}
5217
5218PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005219"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005220\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005221Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005222A value of None indicates that new socket objects have no timeout.\n\
5223When the socket module is first imported, the default is None.");
5224
5225static PyObject *
5226socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 if (arg == Py_None)
5231 timeout = -1.0;
5232 else {
5233 timeout = PyFloat_AsDouble(arg);
5234 if (timeout < 0.0) {
5235 if (!PyErr_Occurred())
5236 PyErr_SetString(PyExc_ValueError,
5237 "Timeout value out of range");
5238 return NULL;
5239 }
5240 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 Py_INCREF(Py_None);
5245 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005246}
5247
5248PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005249"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005250\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005251Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005252A value of None indicates that new socket objects have no timeout.\n\
5253When the socket module is first imported, the default is None.");
5254
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005255#ifdef HAVE_IF_NAMEINDEX
5256/* Python API for getting interface indices and names */
5257
5258static PyObject *
5259socket_if_nameindex(PyObject *self, PyObject *arg)
5260{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005261 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005262 int i;
5263 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005264
Charles-François Natali60713592011-05-20 16:55:06 +02005265 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005266 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005267 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005268 return NULL;
5269 }
5270
5271 list = PyList_New(0);
5272 if (list == NULL) {
5273 if_freenameindex(ni);
5274 return NULL;
5275 }
5276
Charles-François Natali60713592011-05-20 16:55:06 +02005277 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5278 PyObject *ni_tuple = Py_BuildValue("IO&",
5279 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005280
5281 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5282 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005283 Py_DECREF(list);
5284 if_freenameindex(ni);
5285 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005286 }
5287 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005288 }
5289
5290 if_freenameindex(ni);
5291 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005292}
5293
5294PyDoc_STRVAR(if_nameindex_doc,
5295"if_nameindex()\n\
5296\n\
5297Returns a list of network interface information (index, name) tuples.");
5298
Charles-François Natali60713592011-05-20 16:55:06 +02005299static PyObject *
5300socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005301{
Charles-François Natali60713592011-05-20 16:55:06 +02005302 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005303 unsigned long index;
5304
Charles-François Natali60713592011-05-20 16:55:06 +02005305 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5306 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005307 return NULL;
5308
Charles-François Natali60713592011-05-20 16:55:06 +02005309 index = if_nametoindex(PyBytes_AS_STRING(oname));
5310 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005311 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005312 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005313 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005314 return NULL;
5315 }
5316
5317 return PyLong_FromUnsignedLong(index);
5318}
5319
5320PyDoc_STRVAR(if_nametoindex_doc,
5321"if_nametoindex(if_name)\n\
5322\n\
5323Returns the interface index corresponding to the interface name if_name.");
5324
Charles-François Natali60713592011-05-20 16:55:06 +02005325static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005326socket_if_indextoname(PyObject *self, PyObject *arg)
5327{
Charles-François Natali60713592011-05-20 16:55:06 +02005328 unsigned long index;
5329 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005330
Charles-François Natali60713592011-05-20 16:55:06 +02005331 index = PyLong_AsUnsignedLong(arg);
5332 if (index == (unsigned long) -1)
5333 return NULL;
5334
5335 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005336 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005337 return NULL;
5338 }
5339
Charles-François Natali60713592011-05-20 16:55:06 +02005340 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005341}
5342
5343PyDoc_STRVAR(if_indextoname_doc,
5344"if_indextoname(if_index)\n\
5345\n\
5346Returns the interface name corresponding to the interface index if_index.");
5347
5348#endif /* HAVE_IF_NAMEINDEX */
5349
5350
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005351#ifdef CMSG_LEN
5352/* Python interface to CMSG_LEN(length). */
5353
5354static PyObject *
5355socket_CMSG_LEN(PyObject *self, PyObject *args)
5356{
5357 Py_ssize_t length;
5358 size_t result;
5359
5360 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5361 return NULL;
5362 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5363 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5364 return NULL;
5365 }
5366 return PyLong_FromSize_t(result);
5367}
5368
5369PyDoc_STRVAR(CMSG_LEN_doc,
5370"CMSG_LEN(length) -> control message length\n\
5371\n\
5372Return the total length, without trailing padding, of an ancillary\n\
5373data item with associated data of the given length. This value can\n\
5374often be used as the buffer size for recvmsg() to receive a single\n\
5375item of ancillary data, but RFC 3542 requires portable applications to\n\
5376use CMSG_SPACE() and thus include space for padding, even when the\n\
5377item will be the last in the buffer. Raises OverflowError if length\n\
5378is outside the permissible range of values.");
5379
5380
5381#ifdef CMSG_SPACE
5382/* Python interface to CMSG_SPACE(length). */
5383
5384static PyObject *
5385socket_CMSG_SPACE(PyObject *self, PyObject *args)
5386{
5387 Py_ssize_t length;
5388 size_t result;
5389
5390 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5391 return NULL;
5392 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5393 PyErr_SetString(PyExc_OverflowError,
5394 "CMSG_SPACE() argument out of range");
5395 return NULL;
5396 }
5397 return PyLong_FromSize_t(result);
5398}
5399
5400PyDoc_STRVAR(CMSG_SPACE_doc,
5401"CMSG_SPACE(length) -> buffer size\n\
5402\n\
5403Return the buffer size needed for recvmsg() to receive an ancillary\n\
5404data item with associated data of the given length, along with any\n\
5405trailing padding. The buffer space needed to receive multiple items\n\
5406is the sum of the CMSG_SPACE() values for their associated data\n\
5407lengths. Raises OverflowError if length is outside the permissible\n\
5408range of values.");
5409#endif /* CMSG_SPACE */
5410#endif /* CMSG_LEN */
5411
5412
Guido van Rossum30a685f1991-06-27 15:51:29 +00005413/* List of functions exported by this module. */
5414
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005415static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 {"gethostbyname", socket_gethostbyname,
5417 METH_VARARGS, gethostbyname_doc},
5418 {"gethostbyname_ex", socket_gethostbyname_ex,
5419 METH_VARARGS, ghbn_ex_doc},
5420 {"gethostbyaddr", socket_gethostbyaddr,
5421 METH_VARARGS, gethostbyaddr_doc},
5422 {"gethostname", socket_gethostname,
5423 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005424#ifdef HAVE_SETHOSTNAME
5425 {"sethostname", socket_sethostname,
5426 METH_VARARGS, sethostname_doc},
5427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 {"getservbyname", socket_getservbyname,
5429 METH_VARARGS, getservbyname_doc},
5430 {"getservbyport", socket_getservbyport,
5431 METH_VARARGS, getservbyport_doc},
5432 {"getprotobyname", socket_getprotobyname,
5433 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005434#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 {"dup", socket_dup,
5436 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005437#endif
Dave Cole331708b2004-08-09 04:51:41 +00005438#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 {"socketpair", socket_socketpair,
5440 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 {"ntohs", socket_ntohs,
5443 METH_VARARGS, ntohs_doc},
5444 {"ntohl", socket_ntohl,
5445 METH_O, ntohl_doc},
5446 {"htons", socket_htons,
5447 METH_VARARGS, htons_doc},
5448 {"htonl", socket_htonl,
5449 METH_O, htonl_doc},
5450 {"inet_aton", socket_inet_aton,
5451 METH_VARARGS, inet_aton_doc},
5452 {"inet_ntoa", socket_inet_ntoa,
5453 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005454#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 {"inet_pton", socket_inet_pton,
5456 METH_VARARGS, inet_pton_doc},
5457 {"inet_ntop", socket_inet_ntop,
5458 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005459#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005460 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5461 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 {"getnameinfo", socket_getnameinfo,
5463 METH_VARARGS, getnameinfo_doc},
5464 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5465 METH_NOARGS, getdefaulttimeout_doc},
5466 {"setdefaulttimeout", socket_setdefaulttimeout,
5467 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005468#ifdef HAVE_IF_NAMEINDEX
5469 {"if_nameindex", socket_if_nameindex,
5470 METH_NOARGS, if_nameindex_doc},
5471 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005472 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005473 {"if_indextoname", socket_if_indextoname,
5474 METH_O, if_indextoname_doc},
5475#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005476#ifdef CMSG_LEN
5477 {"CMSG_LEN", socket_CMSG_LEN,
5478 METH_VARARGS, CMSG_LEN_doc},
5479#ifdef CMSG_SPACE
5480 {"CMSG_SPACE", socket_CMSG_SPACE,
5481 METH_VARARGS, CMSG_SPACE_doc},
5482#endif
5483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005485};
5486
Guido van Rossum30a685f1991-06-27 15:51:29 +00005487
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005488#ifdef MS_WINDOWS
5489#define OS_INIT_DEFINED
5490
5491/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005492
5493static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005494os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005497}
5498
5499static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005500os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 WSADATA WSAData;
5503 int ret;
5504 ret = WSAStartup(0x0101, &WSAData);
5505 switch (ret) {
5506 case 0: /* No error */
5507 Py_AtExit(os_cleanup);
5508 return 1; /* Success */
5509 case WSASYSNOTREADY:
5510 PyErr_SetString(PyExc_ImportError,
5511 "WSAStartup failed: network not ready");
5512 break;
5513 case WSAVERNOTSUPPORTED:
5514 case WSAEINVAL:
5515 PyErr_SetString(
5516 PyExc_ImportError,
5517 "WSAStartup failed: requested version not supported");
5518 break;
5519 default:
5520 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5521 break;
5522 }
5523 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005524}
5525
Guido van Rossum8d665e61996-06-26 18:22:49 +00005526#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005527
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005528
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005529#ifdef PYOS_OS2
5530#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005531
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005532/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005533
5534static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005535os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005536{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005537#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 if (rc == 0) {
5541 return 1; /* Success */
5542 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005547#else
Ezio Melotti13925002011-03-16 11:05:33 +02005548 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005550#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005551}
5552
5553#endif /* PYOS_OS2 */
5554
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005555
5556#ifndef OS_INIT_DEFINED
5557static int
5558os_init(void)
5559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005561}
5562#endif
5563
5564
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005565/* C API table - always add new things to the end for binary
5566 compatibility. */
5567static
5568PySocketModule_APIObject PySocketModuleAPI =
5569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005571 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005573};
5574
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005575
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005576/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005577
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005578 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005579 "socket.py" which implements some additional functionality.
5580 The import of "_socket" may fail with an ImportError exception if
5581 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005582 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005583 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005584*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005586PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005587"Implementation module for socket operations.\n\
5588\n\
5589See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005590
Martin v. Löwis1a214512008-06-11 05:26:20 +00005591static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 PyModuleDef_HEAD_INIT,
5593 PySocket_MODULE_NAME,
5594 socket_doc,
5595 -1,
5596 socket_methods,
5597 NULL,
5598 NULL,
5599 NULL,
5600 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005601};
5602
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005603PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005604PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 if (!os_init())
5609 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 Py_TYPE(&sock_type) = &PyType_Type;
5612 m = PyModule_Create(&socketmodule);
5613 if (m == NULL)
5614 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005615
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005616 Py_INCREF(PyExc_OSError);
5617 PySocketModuleAPI.error = PyExc_OSError;
5618 Py_INCREF(PyExc_OSError);
5619 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005621 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 if (socket_herror == NULL)
5623 return NULL;
5624 Py_INCREF(socket_herror);
5625 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005626 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 NULL);
5628 if (socket_gaierror == NULL)
5629 return NULL;
5630 Py_INCREF(socket_gaierror);
5631 PyModule_AddObject(m, "gaierror", socket_gaierror);
5632 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005633 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 if (socket_timeout == NULL)
5635 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005636 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 Py_INCREF(socket_timeout);
5638 PyModule_AddObject(m, "timeout", socket_timeout);
5639 Py_INCREF((PyObject *)&sock_type);
5640 if (PyModule_AddObject(m, "SocketType",
5641 (PyObject *)&sock_type) != 0)
5642 return NULL;
5643 Py_INCREF((PyObject *)&sock_type);
5644 if (PyModule_AddObject(m, "socket",
5645 (PyObject *)&sock_type) != 0)
5646 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005647
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005648#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005650#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 Py_INCREF(has_ipv6);
5654 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 /* Export C API */
5657 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5658 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5659 ) != 0)
5660 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005663#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005667#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005669#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005670#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005672#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005673#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 /* Amateur Radio AX.25 */
5675 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005676#endif
5677#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005679#endif
5680#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 /* Appletalk DDP */
5682 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005683#endif
5684#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 /* Amateur radio NetROM */
5686 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005687#endif
5688#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 /* Multiprotocol bridge */
5690 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005691#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005692#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 /* ATM PVCs */
5694 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005695#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005696#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 /* Reserved for Werner's ATM */
5698 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005699#endif
5700#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 /* Reserved for X.25 project */
5702 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005703#endif
5704#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005706#endif
5707#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 /* Amateur Radio X.25 PLP */
5709 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005710#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005711#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 /* Reserved for DECnet project */
5713 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005714#endif
5715#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 /* Reserved for 802.2LLC project */
5717 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005718#endif
5719#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 /* Security callback pseudo AF */
5721 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005722#endif
5723#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 /* PF_KEY key management API */
5725 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005726#endif
5727#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 /* */
5729 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5730 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005731#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005733#endif
5734#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5738 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005739#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005741#endif
5742#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005744#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005745#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005747#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005748#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005750#endif
5751#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005755#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005757#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005758#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005760#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005761#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005762#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 /* Alias to emulate 4.4BSD */
5764 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005765#endif
5766#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767 /* Ash */
5768 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005769#endif
5770#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771 /* Acorn Econet */
5772 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005773#endif
5774#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 /* ATM SVCs */
5776 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005777#endif
5778#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 /* Linux SNA Project (nutters!) */
5780 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005781#endif
5782#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 /* IRDA sockets */
5784 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005785#endif
5786#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 /* PPPoX sockets */
5788 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005789#endif
5790#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 /* Wanpipe API Sockets */
5792 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005793#endif
5794#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 /* Linux LLC */
5796 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005797#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005798
Hye-Shik Chang81268602004-02-02 06:05:24 +00005799#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5801 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5802 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5803 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005804#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005806#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005807#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005808#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5812 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5815 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5816 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005817#endif
5818
Charles-François Natali47413c12011-10-06 19:47:44 +02005819#ifdef AF_CAN
5820 /* Controller Area Network */
5821 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5822#endif
5823#ifdef PF_CAN
5824 /* Controller Area Network */
5825 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5826#endif
5827
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005828/* Reliable Datagram Sockets */
5829#ifdef AF_RDS
5830 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5831#endif
5832#ifdef PF_RDS
5833 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5834#endif
5835
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005836/* Kernel event messages */
5837#ifdef PF_SYSTEM
5838 PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
5839#endif
5840#ifdef AF_SYSTEM
5841 PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
5842#endif
5843
Antoine Pitroub156a462010-10-27 20:13:57 +00005844#ifdef AF_PACKET
5845 PyModule_AddIntMacro(m, AF_PACKET);
5846#endif
5847#ifdef PF_PACKET
5848 PyModule_AddIntMacro(m, PF_PACKET);
5849#endif
5850#ifdef PACKET_HOST
5851 PyModule_AddIntMacro(m, PACKET_HOST);
5852#endif
5853#ifdef PACKET_BROADCAST
5854 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5855#endif
5856#ifdef PACKET_MULTICAST
5857 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5858#endif
5859#ifdef PACKET_OTHERHOST
5860 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5861#endif
5862#ifdef PACKET_OUTGOING
5863 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5864#endif
5865#ifdef PACKET_LOOPBACK
5866 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5867#endif
5868#ifdef PACKET_FASTROUTE
5869 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005870#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005871
Christian Heimes043d6f62008-01-07 17:19:16 +00005872#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 /* for addresses */
5876 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5877 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5878 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5881 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5882 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 /* for setsockopt() */
5885 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5886 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5887 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5888 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5889 TIPC_DEST_DROPPABLE);
5890 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5893 TIPC_LOW_IMPORTANCE);
5894 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5895 TIPC_MEDIUM_IMPORTANCE);
5896 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5897 TIPC_HIGH_IMPORTANCE);
5898 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5899 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 /* for subscriptions */
5902 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5903 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005904#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 /* doesn't seem to be available everywhere */
5906 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5909 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5910 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5911 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5912 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5913 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005914#endif
5915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 /* Socket types */
5917 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5918 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005919/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5921 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005922#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005924#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005925#ifdef SOCK_CLOEXEC
5926 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5927#endif
5928#ifdef SOCK_NONBLOCK
5929 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5930#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932#ifdef SO_DEBUG
5933 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935#ifdef SO_ACCEPTCONN
5936 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938#ifdef SO_REUSEADDR
5939 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005940#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005941#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005943#endif
5944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945#ifdef SO_KEEPALIVE
5946 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948#ifdef SO_DONTROUTE
5949 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951#ifdef SO_BROADCAST
5952 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954#ifdef SO_USELOOPBACK
5955 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957#ifdef SO_LINGER
5958 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960#ifdef SO_OOBINLINE
5961 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005963#ifdef SO_REUSEPORT
5964 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966#ifdef SO_SNDBUF
5967 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969#ifdef SO_RCVBUF
5970 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972#ifdef SO_SNDLOWAT
5973 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975#ifdef SO_RCVLOWAT
5976 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978#ifdef SO_SNDTIMEO
5979 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981#ifdef SO_RCVTIMEO
5982 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984#ifdef SO_ERROR
5985 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987#ifdef SO_TYPE
5988 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990#ifdef SO_SETFIB
5991 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005992#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005993#ifdef SO_PASSCRED
5994 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5995#endif
5996#ifdef SO_PEERCRED
5997 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5998#endif
5999#ifdef LOCAL_PEERCRED
6000 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
6001#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006002#ifdef SO_BINDTODEVICE
6003 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6004#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 /* Maximum number of connections for "listen" */
6007#ifdef SOMAXCONN
6008 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006009#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006011#endif
6012
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006013 /* Ancilliary message types */
6014#ifdef SCM_RIGHTS
6015 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
6016#endif
6017#ifdef SCM_CREDENTIALS
6018 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
6019#endif
6020#ifdef SCM_CREDS
6021 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
6022#endif
6023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 /* Flags for send, recv */
6025#ifdef MSG_OOB
6026 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028#ifdef MSG_PEEK
6029 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031#ifdef MSG_DONTROUTE
6032 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034#ifdef MSG_DONTWAIT
6035 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037#ifdef MSG_EOR
6038 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040#ifdef MSG_TRUNC
6041 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043#ifdef MSG_CTRUNC
6044 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046#ifdef MSG_WAITALL
6047 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049#ifdef MSG_BTAG
6050 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052#ifdef MSG_ETAG
6053 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006054#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006055#ifdef MSG_NOSIGNAL
6056 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
6057#endif
6058#ifdef MSG_NOTIFICATION
6059 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
6060#endif
6061#ifdef MSG_CMSG_CLOEXEC
6062 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
6063#endif
6064#ifdef MSG_ERRQUEUE
6065 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
6066#endif
6067#ifdef MSG_CONFIRM
6068 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
6069#endif
6070#ifdef MSG_MORE
6071 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
6072#endif
6073#ifdef MSG_EOF
6074 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
6075#endif
6076#ifdef MSG_BCAST
6077 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
6078#endif
6079#ifdef MSG_MCAST
6080 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
6081#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 /* Protocol level and numbers, usable for [gs]etsockopt */
6084#ifdef SOL_SOCKET
6085 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087#ifdef SOL_IP
6088 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006089#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092#ifdef SOL_IPX
6093 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095#ifdef SOL_AX25
6096 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098#ifdef SOL_ATALK
6099 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101#ifdef SOL_NETROM
6102 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104#ifdef SOL_ROSE
6105 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107#ifdef SOL_TCP
6108 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112#ifdef SOL_UDP
6113 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006116#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006117#ifdef SOL_CAN_BASE
6118 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
6119#endif
6120#ifdef SOL_CAN_RAW
6121 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
6122 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
6123#endif
6124#ifdef HAVE_LINUX_CAN_H
6125 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
6126 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
6127 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
6128
6129 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
6130 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
6131 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
6132#endif
6133#ifdef HAVE_LINUX_CAN_RAW_H
6134 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
6135 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
6136 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
6137 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
6138#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006139#ifdef SOL_RDS
6140 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
6141#endif
6142#ifdef RDS_CANCEL_SENT_TO
6143 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
6144#endif
6145#ifdef RDS_GET_MR
6146 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
6147#endif
6148#ifdef RDS_FREE_MR
6149 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
6150#endif
6151#ifdef RDS_RECVERR
6152 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
6153#endif
6154#ifdef RDS_CONG_MONITOR
6155 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
6156#endif
6157#ifdef RDS_GET_MR_FOR_DEST
6158 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
6159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160#ifdef IPPROTO_IP
6161 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006162#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165#ifdef IPPROTO_HOPOPTS
6166 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168#ifdef IPPROTO_ICMP
6169 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006170#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006172#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173#ifdef IPPROTO_IGMP
6174 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176#ifdef IPPROTO_GGP
6177 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179#ifdef IPPROTO_IPV4
6180 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182#ifdef IPPROTO_IPV6
6183 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185#ifdef IPPROTO_IPIP
6186 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188#ifdef IPPROTO_TCP
6189 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006190#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193#ifdef IPPROTO_EGP
6194 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196#ifdef IPPROTO_PUP
6197 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199#ifdef IPPROTO_UDP
6200 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006201#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204#ifdef IPPROTO_IDP
6205 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207#ifdef IPPROTO_HELLO
6208 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210#ifdef IPPROTO_ND
6211 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213#ifdef IPPROTO_TP
6214 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216#ifdef IPPROTO_IPV6
6217 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219#ifdef IPPROTO_ROUTING
6220 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222#ifdef IPPROTO_FRAGMENT
6223 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225#ifdef IPPROTO_RSVP
6226 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228#ifdef IPPROTO_GRE
6229 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231#ifdef IPPROTO_ESP
6232 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234#ifdef IPPROTO_AH
6235 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237#ifdef IPPROTO_MOBILE
6238 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240#ifdef IPPROTO_ICMPV6
6241 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243#ifdef IPPROTO_NONE
6244 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246#ifdef IPPROTO_DSTOPTS
6247 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249#ifdef IPPROTO_XTP
6250 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252#ifdef IPPROTO_EON
6253 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255#ifdef IPPROTO_PIM
6256 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258#ifdef IPPROTO_IPCOMP
6259 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261#ifdef IPPROTO_VRRP
6262 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006263#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006264#ifdef IPPROTO_SCTP
6265 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267#ifdef IPPROTO_BIP
6268 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
6270/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271#ifdef IPPROTO_RAW
6272 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006273#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef IPPROTO_MAX
6277 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
6279
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006280#ifdef SYSPROTO_CONTROL
6281 PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
6282#endif
6283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 /* Some port configuration */
6285#ifdef IPPORT_RESERVED
6286 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006287#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef IPPORT_USERRESERVED
6291 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006292#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006294#endif
6295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296 /* Some reserved IP v.4 addresses */
6297#ifdef INADDR_ANY
6298 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006299#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302#ifdef INADDR_BROADCAST
6303 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006304#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307#ifdef INADDR_LOOPBACK
6308 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006309#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312#ifdef INADDR_UNSPEC_GROUP
6313 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006314#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317#ifdef INADDR_ALLHOSTS_GROUP
6318 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6319 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006320#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323#ifdef INADDR_MAX_LOCAL_GROUP
6324 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6325 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006326#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006327 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329#ifdef INADDR_NONE
6330 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006333#endif
6334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 /* IPv4 [gs]etsockopt options */
6336#ifdef IP_OPTIONS
6337 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef IP_HDRINCL
6340 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342#ifdef IP_TOS
6343 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345#ifdef IP_TTL
6346 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348#ifdef IP_RECVOPTS
6349 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351#ifdef IP_RECVRETOPTS
6352 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354#ifdef IP_RECVDSTADDR
6355 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357#ifdef IP_RETOPTS
6358 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360#ifdef IP_MULTICAST_IF
6361 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363#ifdef IP_MULTICAST_TTL
6364 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366#ifdef IP_MULTICAST_LOOP
6367 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369#ifdef IP_ADD_MEMBERSHIP
6370 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372#ifdef IP_DROP_MEMBERSHIP
6373 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375#ifdef IP_DEFAULT_MULTICAST_TTL
6376 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6377 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379#ifdef IP_DEFAULT_MULTICAST_LOOP
6380 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6381 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383#ifdef IP_MAX_MEMBERSHIPS
6384 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006385#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006386#ifdef IP_TRANSPARENT
6387 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6388#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6391#ifdef IPV6_JOIN_GROUP
6392 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394#ifdef IPV6_LEAVE_GROUP
6395 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397#ifdef IPV6_MULTICAST_HOPS
6398 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400#ifdef IPV6_MULTICAST_IF
6401 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403#ifdef IPV6_MULTICAST_LOOP
6404 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406#ifdef IPV6_UNICAST_HOPS
6407 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006410#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006414#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006416#endif
6417#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006419#endif
6420#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006422#endif
6423#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006425#endif
6426#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006428#endif
6429#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006431#endif
6432#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006434#endif
6435#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006437#endif
6438#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006440#endif
6441#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006443#endif
6444#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006446#endif
6447#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006449#endif
6450#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006452#endif
6453#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006455#endif
6456#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006458#endif
6459#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006461#endif
6462#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006464#endif
6465#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006467#endif
6468#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006470#endif
6471#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006473#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 /* TCP options */
6476#ifdef TCP_NODELAY
6477 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef TCP_MAXSEG
6480 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482#ifdef TCP_CORK
6483 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485#ifdef TCP_KEEPIDLE
6486 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef TCP_KEEPINTVL
6489 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491#ifdef TCP_KEEPCNT
6492 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494#ifdef TCP_SYNCNT
6495 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497#ifdef TCP_LINGER2
6498 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef TCP_DEFER_ACCEPT
6501 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503#ifdef TCP_WINDOW_CLAMP
6504 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef TCP_INFO
6507 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef TCP_QUICKACK
6510 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006511#endif
6512
Guido van Rossum09be4091999-08-09 14:40:40 +00006513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 /* IPX options */
6515#ifdef IPX_TYPE
6516 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006517#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006518
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006519/* Reliable Datagram Sockets */
6520#ifdef RDS_CMSG_RDMA_ARGS
6521 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6522#endif
6523#ifdef RDS_CMSG_RDMA_DEST
6524 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6525#endif
6526#ifdef RDS_CMSG_RDMA_MAP
6527 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6528#endif
6529#ifdef RDS_CMSG_RDMA_STATUS
6530 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6531#endif
6532#ifdef RDS_CMSG_RDMA_UPDATE
6533 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6534#endif
6535#ifdef RDS_RDMA_READWRITE
6536 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6537#endif
6538#ifdef RDS_RDMA_FENCE
6539 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6540#endif
6541#ifdef RDS_RDMA_INVALIDATE
6542 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6543#endif
6544#ifdef RDS_RDMA_USE_ONCE
6545 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6546#endif
6547#ifdef RDS_RDMA_DONTWAIT
6548 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6549#endif
6550#ifdef RDS_RDMA_NOTIFY_ME
6551 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6552#endif
6553#ifdef RDS_RDMA_SILENT
6554 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6555#endif
6556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006558#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006560#endif
6561#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006563#endif
6564#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006566#endif
6567#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006569#endif
6570#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006572#endif
6573#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006575#endif
6576#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006578#endif
6579#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006581#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006582#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006584#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006585#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006587#endif
6588#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006590#endif
6591#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006593#endif
6594#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006596#endif
6597#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006599#endif
6600#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006602#endif
6603#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006605#endif
6606#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006608#endif
6609#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006611#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006612#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006614#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006615#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006617#endif
6618#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006620#endif
6621#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006623#endif
6624#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006626#endif
6627#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006629#endif
6630#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006632#endif
6633#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006635#endif
6636#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006638#endif
6639#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006641#endif
6642#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006644#endif
6645#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006647#endif
6648#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006650#endif
6651#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006653#endif
6654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006656#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006658#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006660#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006662#endif
6663#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006665#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006667#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006669#endif
6670#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006672#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006674#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006676#endif
6677
Christian Heimesfaf2f632008-01-06 16:59:19 +00006678#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 {
6680 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6681 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6682 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006683 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 PyObject *tmp;
6685 tmp = PyLong_FromUnsignedLong(codes[i]);
6686 if (tmp == NULL)
6687 return NULL;
6688 PyModule_AddObject(m, names[i], tmp);
6689 }
6690 }
6691 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6692 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6693 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006694#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006696#endif
6697#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006699#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006700#endif /* _MSTCPIP_ */
6701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006703#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006707}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006708
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006709
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006710#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006711#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006712
6713/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006714/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006715
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006716int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006717inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006719 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006720#if (SIZEOF_INT != 4)
6721#error "Not sure if in_addr_t exists and int is not 32-bits."
6722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 unsigned int packed_addr;
6724 packed_addr = inet_addr(src);
6725 if (packed_addr == INADDR_NONE)
6726 return 0;
6727 memcpy(dst, &packed_addr, 4);
6728 return 1;
6729 }
6730 /* Should set errno to EAFNOSUPPORT */
6731 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006732}
6733
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006734const char *
6735inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006737 if (af == AF_INET) {
6738 struct in_addr packed_addr;
6739 if (size < 16)
6740 /* Should set errno to ENOSPC. */
6741 return NULL;
6742 memcpy(&packed_addr, src, sizeof(packed_addr));
6743 return strncpy(dst, inet_ntoa(packed_addr), size);
6744 }
6745 /* Should set errno to EAFNOSUPPORT */
6746 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006747}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006748
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006749#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006750#endif