blob: a6f8c5a70894fa3001940875a9036126b2d1e78e [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 Natali30589c92011-10-07 22:47:08 +02001229#ifdef AF_CAN
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 Natali30589c92011-10-07 22:47:08 +02001657#ifdef AF_CAN
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;
1665 addr = (struct sockaddr_can *)addr_ret;
1666 Py_ssize_t len;
1667
1668 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1669 &interfaceName))
1670 return 0;
1671
1672 len = PyBytes_GET_SIZE(interfaceName);
1673
1674 if (len == 0) {
1675 ifr.ifr_ifindex = 0;
1676 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001677 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1678 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001679 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1680 s->errorhandler();
1681 Py_DECREF(interfaceName);
1682 return 0;
1683 }
1684 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001685 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001686 "AF_CAN interface name too long");
1687 Py_DECREF(interfaceName);
1688 return 0;
1689 }
1690
1691 addr->can_family = AF_CAN;
1692 addr->can_ifindex = ifr.ifr_ifindex;
1693
1694 *len_ret = sizeof(*addr);
1695 Py_DECREF(interfaceName);
1696 return 1;
1697 }
1698 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001699 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001700 "getsockaddrarg: unsupported CAN protocol");
1701 return 0;
1702 }
1703#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001704
1705#ifdef PF_SYSTEM
1706 case PF_SYSTEM:
1707 switch (s->sock_proto) {
1708#ifdef SYSPROTO_CONTROL
1709 case SYSPROTO_CONTROL:
1710 {
1711 struct sockaddr_ctl *addr;
1712
1713 addr = (struct sockaddr_ctl *)addr_ret;
1714 addr->sc_family = AF_SYSTEM;
1715 addr->ss_sysaddr = AF_SYS_CONTROL;
1716
1717 if (PyUnicode_Check(args)) {
1718 struct ctl_info info;
1719 PyObject *ctl_name;
1720
1721 if (!PyArg_Parse(args, "O&",
1722 PyUnicode_FSConverter, &ctl_name)) {
1723 return 0;
1724 }
1725
1726 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1727 PyErr_SetString(PyExc_ValueError,
1728 "provided string is too long");
1729 Py_DECREF(ctl_name);
1730 return 0;
1731 }
1732 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1733 sizeof(info.ctl_name));
1734 Py_DECREF(ctl_name);
1735
1736 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1737 PyErr_SetString(PyExc_OSError,
1738 "cannot find kernel control with provided name");
1739 return 0;
1740 }
1741
1742 addr->sc_id = info.ctl_id;
1743 addr->sc_unit = 0;
1744 } else if (!PyArg_ParseTuple(args, "II",
1745 &(addr->sc_id), &(addr->sc_unit))) {
1746 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1747 "expected str or tuple of two ints");
1748
1749 return 0;
1750 }
1751
1752 *len_ret = sizeof(*addr);
1753 return 1;
1754 }
1755#endif
1756 default:
1757 PyErr_SetString(PyExc_OSError,
1758 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1759 return 0;
1760 }
1761#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001766 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001770}
1771
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772
Guido van Rossum48a680c2001-03-02 06:34:14 +00001773/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001774 Return 1 if the family is known, 0 otherwise. The length is returned
1775 through len_ret. */
1776
1777static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001778getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001781
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001782#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 case AF_UNIX:
1784 {
1785 *len_ret = sizeof (struct sockaddr_un);
1786 return 1;
1787 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001788#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001789#if defined(AF_NETLINK)
1790 case AF_NETLINK:
1791 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 *len_ret = sizeof (struct sockaddr_nl);
1793 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001794 }
1795#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001796
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001797#ifdef AF_RDS
1798 case AF_RDS:
1799 /* RDS sockets use sockaddr_in: fall-through */
1800#endif
1801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 case AF_INET:
1803 {
1804 *len_ret = sizeof (struct sockaddr_in);
1805 return 1;
1806 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001807
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001808#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 case AF_INET6:
1810 {
1811 *len_ret = sizeof (struct sockaddr_in6);
1812 return 1;
1813 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001814#endif
1815
Hye-Shik Chang81268602004-02-02 06:05:24 +00001816#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 case AF_BLUETOOTH:
1818 {
1819 switch(s->sock_proto)
1820 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 case BTPROTO_L2CAP:
1823 *len_ret = sizeof (struct sockaddr_l2);
1824 return 1;
1825 case BTPROTO_RFCOMM:
1826 *len_ret = sizeof (struct sockaddr_rc);
1827 return 1;
1828 case BTPROTO_HCI:
1829 *len_ret = sizeof (struct sockaddr_hci);
1830 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001831#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 case BTPROTO_SCO:
1833 *len_ret = sizeof (struct sockaddr_sco);
1834 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001835#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001837 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 "unknown BT protocol");
1839 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 }
1842 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001843#endif
1844
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001845#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 case AF_PACKET:
1847 {
1848 *len_ret = sizeof (struct sockaddr_ll);
1849 return 1;
1850 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001851#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001852
Christian Heimes043d6f62008-01-07 17:19:16 +00001853#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 case AF_TIPC:
1855 {
1856 *len_ret = sizeof (struct sockaddr_tipc);
1857 return 1;
1858 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001859#endif
1860
Charles-François Natali30589c92011-10-07 22:47:08 +02001861#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001862 case AF_CAN:
1863 {
1864 *len_ret = sizeof (struct sockaddr_can);
1865 return 1;
1866 }
1867#endif
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001868
1869#ifdef PF_SYSTEM
1870 case PF_SYSTEM:
1871 switch(s->sock_proto) {
1872#ifdef SYSPROTO_CONTROL
1873 case SYSPROTO_CONTROL:
1874 *len_ret = sizeof (struct sockaddr_ctl);
1875 return 1;
1876#endif
1877 default:
1878 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1879 "unknown PF_SYSTEM protocol");
1880 return 0;
1881 }
1882#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001887 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001891}
1892
1893
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001894/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1895 Currently, these methods are only compiled if the RFC 2292/3542
1896 CMSG_LEN() macro is available. Older systems seem to have used
1897 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1898 it may be possible to define CMSG_LEN() that way if it's not
1899 provided. Some architectures might need extra padding after the
1900 cmsghdr, however, and CMSG_LEN() would have to take account of
1901 this. */
1902#ifdef CMSG_LEN
1903/* If length is in range, set *result to CMSG_LEN(length) and return
1904 true; otherwise, return false. */
1905static int
1906get_CMSG_LEN(size_t length, size_t *result)
1907{
1908 size_t tmp;
1909
1910 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1911 return 0;
1912 tmp = CMSG_LEN(length);
1913 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1914 return 0;
1915 *result = tmp;
1916 return 1;
1917}
1918
1919#ifdef CMSG_SPACE
1920/* If length is in range, set *result to CMSG_SPACE(length) and return
1921 true; otherwise, return false. */
1922static int
1923get_CMSG_SPACE(size_t length, size_t *result)
1924{
1925 size_t tmp;
1926
1927 /* Use CMSG_SPACE(1) here in order to take account of the padding
1928 necessary before *and* after the data. */
1929 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1930 return 0;
1931 tmp = CMSG_SPACE(length);
1932 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1933 return 0;
1934 *result = tmp;
1935 return 1;
1936}
1937#endif
1938
1939/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1940 pointer in msg->msg_control with at least "space" bytes after it,
1941 and its cmsg_len member inside the buffer. */
1942static int
1943cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1944{
1945 size_t cmsg_offset;
1946 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1947 sizeof(cmsgh->cmsg_len));
1948
Charles-François Natali466517d2011-08-28 18:23:43 +02001949 /* Note that POSIX allows msg_controllen to be of signed type. */
1950 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001951 return 0;
1952 if (space < cmsg_len_end)
1953 space = cmsg_len_end;
1954 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1955 return (cmsg_offset <= (size_t)-1 - space &&
1956 cmsg_offset + space <= msg->msg_controllen);
1957}
1958
1959/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1960 *space to number of bytes following it in the buffer and return
1961 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1962 msg->msg_controllen are valid. */
1963static int
1964get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1965{
1966 size_t data_offset;
1967 char *data_ptr;
1968
1969 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1970 return 0;
1971 data_offset = data_ptr - (char *)msg->msg_control;
1972 if (data_offset > msg->msg_controllen)
1973 return 0;
1974 *space = msg->msg_controllen - data_offset;
1975 return 1;
1976}
1977
1978/* If cmsgh is invalid or not contained in the buffer pointed to by
1979 msg->msg_control, return -1. If cmsgh is valid and its associated
1980 data is entirely contained in the buffer, set *data_len to the
1981 length of the associated data and return 0. If only part of the
1982 associated data is contained in the buffer but cmsgh is otherwise
1983 valid, set *data_len to the length contained in the buffer and
1984 return 1. */
1985static int
1986get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1987{
1988 size_t space, cmsg_data_len;
1989
1990 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1991 cmsgh->cmsg_len < CMSG_LEN(0))
1992 return -1;
1993 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1994 if (!get_cmsg_data_space(msg, cmsgh, &space))
1995 return -1;
1996 if (space >= cmsg_data_len) {
1997 *data_len = cmsg_data_len;
1998 return 0;
1999 }
2000 *data_len = space;
2001 return 1;
2002}
2003#endif /* CMSG_LEN */
2004
2005
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002006/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002007
Guido van Rossum73624e91994-10-10 17:59:00 +00002008static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002009sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 sock_addr_t addrbuf;
2012 SOCKET_T newfd = INVALID_SOCKET;
2013 socklen_t addrlen;
2014 PyObject *sock = NULL;
2015 PyObject *addr = NULL;
2016 PyObject *res = NULL;
2017 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 if (!getsockaddrlen(s, &addrlen))
2019 return NULL;
2020 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 if (!IS_SELECTABLE(s))
2023 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002024
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002025 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002027 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002028 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002030 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 if (timeout == 1) {
2034 PyErr_SetString(socket_timeout, "timed out");
2035 return NULL;
2036 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002037 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 if (newfd == INVALID_SOCKET)
2040 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 sock = PyLong_FromSocket_t(newfd);
2043 if (sock == NULL) {
2044 SOCKETCLOSE(newfd);
2045 goto finally;
2046 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2049 addrlen, s->sock_proto);
2050 if (addr == NULL)
2051 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002054
Guido van Rossum67f7a382002-06-06 21:08:16 +00002055finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 Py_XDECREF(sock);
2057 Py_XDECREF(addr);
2058 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002059}
2060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002061PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002062"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002063\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002064Wait for an incoming connection. Return a new socket file descriptor\n\
2065representing the connection, and the address of the client.\n\
2066For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002067
Guido van Rossum11ba0942002-06-13 15:07:44 +00002068/* s.setblocking(flag) method. Argument:
2069 False -- non-blocking mode; same as settimeout(0)
2070 True -- blocking mode; same as settimeout(None)
2071*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002072
Guido van Rossum73624e91994-10-10 17:59:00 +00002073static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002074sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002075{
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02002076 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 block = PyLong_AsLong(arg);
2079 if (block == -1 && PyErr_Occurred())
2080 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 s->sock_timeout = block ? -1.0 : 0.0;
2083 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 Py_INCREF(Py_None);
2086 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002087}
Guido van Rossume4485b01994-09-07 14:32:49 +00002088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002089PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002090"setblocking(flag)\n\
2091\n\
2092Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002093setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002094setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002095
Guido van Rossum11ba0942002-06-13 15:07:44 +00002096/* s.settimeout(timeout) method. Argument:
2097 None -- no timeout, blocking mode; same as setblocking(True)
2098 0.0 -- non-blocking mode; same as setblocking(False)
2099 > 0 -- timeout mode; operations time out after timeout seconds
2100 < 0 -- illegal; raises an exception
2101*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002103sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 if (arg == Py_None)
2108 timeout = -1.0;
2109 else {
2110 timeout = PyFloat_AsDouble(arg);
2111 if (timeout < 0.0) {
2112 if (!PyErr_Occurred())
2113 PyErr_SetString(PyExc_ValueError,
2114 "Timeout value out of range");
2115 return NULL;
2116 }
2117 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 s->sock_timeout = timeout;
2120 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 Py_INCREF(Py_None);
2123 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124}
2125
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002126PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002127"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002128\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002129Set a timeout on socket operations. 'timeout' can be a float,\n\
2130giving in seconds, or None. Setting a timeout of None disables\n\
2131the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002132Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002133
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002134/* s.gettimeout() method.
2135 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002137sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 if (s->sock_timeout < 0.0) {
2140 Py_INCREF(Py_None);
2141 return Py_None;
2142 }
2143 else
2144 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145}
2146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002147PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002148"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002149\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002150Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002151operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002152operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002153
Guido van Rossumaee08791992-09-08 09:05:33 +00002154/* s.setsockopt() method.
2155 With an integer third argument, sets an integer option.
2156 With a string third argument, sets an option from a buffer;
2157 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002158
Guido van Rossum73624e91994-10-10 17:59:00 +00002159static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002160sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 int level;
2163 int optname;
2164 int res;
2165 char *buf;
2166 int buflen;
2167 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 if (PyArg_ParseTuple(args, "iii:setsockopt",
2170 &level, &optname, &flag)) {
2171 buf = (char *) &flag;
2172 buflen = sizeof flag;
2173 }
2174 else {
2175 PyErr_Clear();
2176 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2177 &level, &optname, &buf, &buflen))
2178 return NULL;
2179 }
2180 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2181 if (res < 0)
2182 return s->errorhandler();
2183 Py_INCREF(Py_None);
2184 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002185}
2186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188"setsockopt(level, option, value)\n\
2189\n\
2190Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002191The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002192
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002193
Guido van Rossumaee08791992-09-08 09:05:33 +00002194/* s.getsockopt() method.
2195 With two arguments, retrieves an integer option.
2196 With a third integer argument, retrieves a string buffer of that size;
2197 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002198
Guido van Rossum73624e91994-10-10 17:59:00 +00002199static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002200sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 int level;
2203 int optname;
2204 int res;
2205 PyObject *buf;
2206 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2209 &level, &optname, &buflen))
2210 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 if (buflen == 0) {
2213 int flag = 0;
2214 socklen_t flagsize = sizeof flag;
2215 res = getsockopt(s->sock_fd, level, optname,
2216 (void *)&flag, &flagsize);
2217 if (res < 0)
2218 return s->errorhandler();
2219 return PyLong_FromLong(flag);
2220 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002221#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 /* socklen_t is unsigned so no negative test is needed,
2223 test buflen == 0 is previously done */
2224 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002225#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002227#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002228 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 "getsockopt buflen out of range");
2230 return NULL;
2231 }
2232 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2233 if (buf == NULL)
2234 return NULL;
2235 res = getsockopt(s->sock_fd, level, optname,
2236 (void *)PyBytes_AS_STRING(buf), &buflen);
2237 if (res < 0) {
2238 Py_DECREF(buf);
2239 return s->errorhandler();
2240 }
2241 _PyBytes_Resize(&buf, buflen);
2242 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002243}
2244
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002245PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002246"getsockopt(level, option[, buffersize]) -> value\n\
2247\n\
2248Get a socket option. See the Unix manual for level and option.\n\
2249If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002250string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002251
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002252
Fred Drake728819a2000-07-01 03:40:12 +00002253/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002254
Guido van Rossum73624e91994-10-10 17:59:00 +00002255static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002256sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 sock_addr_t addrbuf;
2259 int addrlen;
2260 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2263 return NULL;
2264 Py_BEGIN_ALLOW_THREADS
2265 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2266 Py_END_ALLOW_THREADS
2267 if (res < 0)
2268 return s->errorhandler();
2269 Py_INCREF(Py_None);
2270 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002271}
2272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002273PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002274"bind(address)\n\
2275\n\
2276Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002277pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002278sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002279
Guido van Rossum30a685f1991-06-27 15:51:29 +00002280
2281/* s.close() method.
2282 Set the file descriptor to -1 so operations tried subsequently
2283 will surely fail. */
2284
Guido van Rossum73624e91994-10-10 17:59:00 +00002285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002286sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 if ((fd = s->sock_fd) != -1) {
2291 s->sock_fd = -1;
2292 Py_BEGIN_ALLOW_THREADS
2293 (void) SOCKETCLOSE(fd);
2294 Py_END_ALLOW_THREADS
2295 }
2296 Py_INCREF(Py_None);
2297 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002298}
2299
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002300PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002301"close()\n\
2302\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002303Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002304
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002305static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002306sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002307{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002308 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002309 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002310 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002311}
2312
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002313PyDoc_STRVAR(detach_doc,
2314"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002315\n\
2316Close the socket object without closing the underlying file descriptor.\
2317The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002318can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002319
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002320static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002321internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 timeout = 0;
2327 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002328
2329#ifdef MS_WINDOWS
2330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 if (s->sock_timeout > 0.0) {
2332 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2333 IS_SELECTABLE(s)) {
2334 /* This is a mess. Best solution: trust select */
2335 fd_set fds;
2336 fd_set fds_exc;
2337 struct timeval tv;
2338 tv.tv_sec = (int)s->sock_timeout;
2339 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2340 FD_ZERO(&fds);
2341 FD_SET(s->sock_fd, &fds);
2342 FD_ZERO(&fds_exc);
2343 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002344 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2345 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 if (res == 0) {
2347 res = WSAEWOULDBLOCK;
2348 timeout = 1;
2349 } else if (res > 0) {
2350 if (FD_ISSET(s->sock_fd, &fds))
2351 /* The socket is in the writable set - this
2352 means connected */
2353 res = 0;
2354 else {
2355 /* As per MS docs, we need to call getsockopt()
2356 to get the underlying error */
2357 int res_size = sizeof res;
2358 /* It must be in the exception set */
2359 assert(FD_ISSET(s->sock_fd, &fds_exc));
2360 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2361 (char *)&res, &res_size))
2362 /* getsockopt also clears WSAGetLastError,
2363 so reset it back. */
2364 WSASetLastError(res);
2365 else
2366 res = WSAGetLastError();
2367 }
2368 }
2369 /* else if (res < 0) an error occurred */
2370 }
2371 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 if (res < 0)
2374 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002375
2376#else
2377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 if (s->sock_timeout > 0.0) {
2379 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2380 timeout = internal_select(s, 1);
2381 if (timeout == 0) {
2382 /* Bug #1019808: in case of an EINPROGRESS,
2383 use getsockopt(SO_ERROR) to get the real
2384 error. */
2385 socklen_t res_size = sizeof res;
2386 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2387 SO_ERROR, &res, &res_size);
2388 if (res == EISCONN)
2389 res = 0;
2390 errno = res;
2391 }
2392 else if (timeout == -1) {
2393 res = errno; /* had error */
2394 }
2395 else
2396 res = EWOULDBLOCK; /* timed out */
2397 }
2398 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 if (res < 0)
2401 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002402
2403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002407}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002408
Fred Drake728819a2000-07-01 03:40:12 +00002409/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002410
Guido van Rossum73624e91994-10-10 17:59:00 +00002411static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002412sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 sock_addr_t addrbuf;
2415 int addrlen;
2416 int res;
2417 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2420 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 Py_BEGIN_ALLOW_THREADS
2423 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2424 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 if (timeout == 1) {
2427 PyErr_SetString(socket_timeout, "timed out");
2428 return NULL;
2429 }
2430 if (res != 0)
2431 return s->errorhandler();
2432 Py_INCREF(Py_None);
2433 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002434}
2435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002436PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002437"connect(address)\n\
2438\n\
2439Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002440is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002441
Guido van Rossum30a685f1991-06-27 15:51:29 +00002442
Fred Drake728819a2000-07-01 03:40:12 +00002443/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002444
2445static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002446sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 sock_addr_t addrbuf;
2449 int addrlen;
2450 int res;
2451 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2454 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 Py_BEGIN_ALLOW_THREADS
2457 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2458 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 /* Signals are not errors (though they may raise exceptions). Adapted
2461 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002462#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 if (res == EINTR && PyErr_CheckSignals())
2464 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002465#endif
2466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002468}
2469
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002470PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002471"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002472\n\
2473This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002474instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002475
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002476
Guido van Rossumed233a51992-06-23 09:07:03 +00002477/* s.fileno() method */
2478
Guido van Rossum73624e91994-10-10 17:59:00 +00002479static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002480sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002483}
2484
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002485PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002486"fileno() -> integer\n\
2487\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002488Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489
Guido van Rossumed233a51992-06-23 09:07:03 +00002490
Guido van Rossumc89705d1992-11-26 08:54:07 +00002491/* s.getsockname() method */
2492
Guido van Rossum73624e91994-10-10 17:59:00 +00002493static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002494sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 sock_addr_t addrbuf;
2497 int res;
2498 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 if (!getsockaddrlen(s, &addrlen))
2501 return NULL;
2502 memset(&addrbuf, 0, addrlen);
2503 Py_BEGIN_ALLOW_THREADS
2504 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2505 Py_END_ALLOW_THREADS
2506 if (res < 0)
2507 return s->errorhandler();
2508 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2509 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002510}
2511
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002512PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002513"getsockname() -> address info\n\
2514\n\
2515Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002516info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002517
Guido van Rossumc89705d1992-11-26 08:54:07 +00002518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002520/* s.getpeername() method */
2521
Guido van Rossum73624e91994-10-10 17:59:00 +00002522static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002523sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 sock_addr_t addrbuf;
2526 int res;
2527 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 if (!getsockaddrlen(s, &addrlen))
2530 return NULL;
2531 memset(&addrbuf, 0, addrlen);
2532 Py_BEGIN_ALLOW_THREADS
2533 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2534 Py_END_ALLOW_THREADS
2535 if (res < 0)
2536 return s->errorhandler();
2537 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2538 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002539}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002540
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002541PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002542"getpeername() -> address info\n\
2543\n\
2544Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002545info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002546
Guido van Rossumb6775db1994-08-01 11:34:53 +00002547#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002548
2549
Guido van Rossum30a685f1991-06-27 15:51:29 +00002550/* s.listen(n) method */
2551
Guido van Rossum73624e91994-10-10 17:59:00 +00002552static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002553sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002554{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 int backlog;
2556 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002557
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02002558 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (backlog == -1 && PyErr_Occurred())
2560 return NULL;
2561 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002562 /* To avoid problems on systems that don't allow a negative backlog
2563 * (which doesn't make sense anyway) we force a minimum value of 0. */
2564 if (backlog < 0)
2565 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 res = listen(s->sock_fd, backlog);
2567 Py_END_ALLOW_THREADS
2568 if (res < 0)
2569 return s->errorhandler();
2570 Py_INCREF(Py_None);
2571 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002572}
2573
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002574PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002575"listen(backlog)\n\
2576\n\
2577Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002578least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2579unaccepted connections that the system will allow before refusing new\n\
2580connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581
2582
Thomas Wouters477c8d52006-05-27 19:21:47 +00002583/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002584 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002585 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002587 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002588 * also possible that we return a number of bytes smaller than the request
2589 * bytes.
2590 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002591
Antoine Pitrou19467d22010-08-17 19:33:30 +00002592static Py_ssize_t
2593sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002594{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002595 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 int remaining;
2599 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002600#endif
2601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 if (!IS_SELECTABLE(s)) {
2603 select_error();
2604 return -1;
2605 }
2606 if (len == 0) {
2607 /* If 0 bytes were requested, do nothing. */
2608 return 0;
2609 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002610
2611#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002612 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002614 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 if (!timeout)
2616 outlen = recv(s->sock_fd, cbuf, len, flags);
2617 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (timeout == 1) {
2620 PyErr_SetString(socket_timeout, "timed out");
2621 return -1;
2622 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002623 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 if (outlen < 0) {
2625 /* Note: the call to errorhandler() ALWAYS indirectly returned
2626 NULL, so ignore its return value */
2627 s->errorhandler();
2628 return -1;
2629 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002630#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 read_buf = cbuf;
2632 remaining = len;
2633 while (remaining != 0) {
2634 unsigned int segment;
2635 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 segment = remaining /SEGMENT_SIZE;
2638 if (segment != 0) {
2639 segment = SEGMENT_SIZE;
2640 }
2641 else {
2642 segment = remaining;
2643 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002644
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002645 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002647 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 if (!timeout)
2649 nread = recv(s->sock_fd, read_buf, segment, flags);
2650 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 if (timeout == 1) {
2652 PyErr_SetString(socket_timeout, "timed out");
2653 return -1;
2654 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002655 END_SELECT_LOOP(s)
2656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 if (nread < 0) {
2658 s->errorhandler();
2659 return -1;
2660 }
2661 if (nread != remaining) {
2662 read_buf += nread;
2663 break;
2664 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 remaining -= segment;
2667 read_buf += segment;
2668 }
2669 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670#endif /* !__VMS */
2671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673}
2674
Guido van Rossum48a680c2001-03-02 06:34:14 +00002675
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002676/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002677
Guido van Rossum73624e91994-10-10 17:59:00 +00002678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002679sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002680{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002681 Py_ssize_t recvlen, outlen;
2682 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002684
Antoine Pitrou19467d22010-08-17 19:33:30 +00002685 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 if (recvlen < 0) {
2689 PyErr_SetString(PyExc_ValueError,
2690 "negative buffersize in recv");
2691 return NULL;
2692 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 /* Allocate a new string. */
2695 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2696 if (buf == NULL)
2697 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 /* Call the guts */
2700 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2701 if (outlen < 0) {
2702 /* An error occurred, release the string and return an
2703 error. */
2704 Py_DECREF(buf);
2705 return NULL;
2706 }
2707 if (outlen != recvlen) {
2708 /* We did not read as many bytes as we anticipated, resize the
2709 string if possible and be successful. */
2710 _PyBytes_Resize(&buf, outlen);
2711 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002714}
2715
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002716PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002717"recv(buffersize[, flags]) -> data\n\
2718\n\
2719Receive up to buffersize bytes from the socket. For the optional flags\n\
2720argument, see the Unix manual. When no data is available, block until\n\
2721at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002722the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002723
Guido van Rossum30a685f1991-06-27 15:51:29 +00002724
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002725/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002726
Thomas Wouters477c8d52006-05-27 19:21:47 +00002727static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002728sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002731
Antoine Pitrou19467d22010-08-17 19:33:30 +00002732 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 Py_buffer pbuf;
2734 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002735 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002738 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 &pbuf, &recvlen, &flags))
2740 return NULL;
2741 buf = pbuf.buf;
2742 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 if (recvlen < 0) {
2745 PyBuffer_Release(&pbuf);
2746 PyErr_SetString(PyExc_ValueError,
2747 "negative buffersize in recv_into");
2748 return NULL;
2749 }
2750 if (recvlen == 0) {
2751 /* If nbytes was not specified, use the buffer's length */
2752 recvlen = buflen;
2753 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 /* Check if the buffer is large enough */
2756 if (buflen < recvlen) {
2757 PyBuffer_Release(&pbuf);
2758 PyErr_SetString(PyExc_ValueError,
2759 "buffer too small for requested bytes");
2760 return NULL;
2761 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 /* Call the guts */
2764 readlen = sock_recv_guts(s, buf, recvlen, flags);
2765 if (readlen < 0) {
2766 /* Return an error. */
2767 PyBuffer_Release(&pbuf);
2768 return NULL;
2769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 PyBuffer_Release(&pbuf);
2772 /* Return the number of bytes read. Note that we do not do anything
2773 special here in the case that readlen < recvlen. */
2774 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002775}
2776
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002777PyDoc_STRVAR(recv_into_doc,
2778"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002779\n\
2780A version of recv() that stores its data into a buffer rather than creating \n\
2781a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2782is not specified (or 0), receive up to the size available in the given buffer.\n\
2783\n\
2784See recv() for documentation about the flags.");
2785
2786
2787/*
Christian Heimes99170a52007-12-19 02:07:34 +00002788 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2789 * into a char buffer. If you have any inc/def ref to do to the objects that
2790 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002791 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002792 * that it is also possible that we return a number of bytes smaller than the
2793 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002794 *
2795 * 'addr' is a return value for the address object. Note that you must decref
2796 * it yourself.
2797 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002798static Py_ssize_t
2799sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 sock_addr_t addrbuf;
2803 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002804 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 if (!getsockaddrlen(s, &addrlen))
2810 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 if (!IS_SELECTABLE(s)) {
2813 select_error();
2814 return -1;
2815 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002816
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002817 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 Py_BEGIN_ALLOW_THREADS
2819 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002820 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002822#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002823#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 n = recvfrom(s->sock_fd, cbuf, len, flags,
2825 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002826#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 n = recvfrom(s->sock_fd, cbuf, len, flags,
2828 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002829#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002830#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 n = recvfrom(s->sock_fd, cbuf, len, flags,
2832 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 }
2835 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 if (timeout == 1) {
2838 PyErr_SetString(socket_timeout, "timed out");
2839 return -1;
2840 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002841 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 if (n < 0) {
2843 s->errorhandler();
2844 return -1;
2845 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2848 addrlen, s->sock_proto)))
2849 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002852}
2853
2854/* s.recvfrom(nbytes [,flags]) method */
2855
2856static PyObject *
2857sock_recvfrom(PySocketSockObject *s, PyObject *args)
2858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyObject *buf = NULL;
2860 PyObject *addr = NULL;
2861 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002862 int flags = 0;
2863 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002864
Antoine Pitrou19467d22010-08-17 19:33:30 +00002865 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 if (recvlen < 0) {
2869 PyErr_SetString(PyExc_ValueError,
2870 "negative buffersize in recvfrom");
2871 return NULL;
2872 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2875 if (buf == NULL)
2876 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2879 recvlen, flags, &addr);
2880 if (outlen < 0) {
2881 goto finally;
2882 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 if (outlen != recvlen) {
2885 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002886 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002888 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 goto finally;
2890 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002893
2894finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 Py_XDECREF(buf);
2896 Py_XDECREF(addr);
2897 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002898}
2899
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002900PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002901"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2902\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002903Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002904
Thomas Wouters477c8d52006-05-27 19:21:47 +00002905
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002906/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002907
2908static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002909sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002912
Antoine Pitrou19467d22010-08-17 19:33:30 +00002913 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 Py_buffer pbuf;
2915 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002916 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919
Antoine Pitrou19467d22010-08-17 19:33:30 +00002920 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 kwlist, &pbuf,
2922 &recvlen, &flags))
2923 return NULL;
2924 buf = pbuf.buf;
2925 buflen = pbuf.len;
2926 assert(buf != 0 && buflen > 0);
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;
2937 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2940 if (readlen < 0) {
2941 PyBuffer_Release(&pbuf);
2942 /* Return an error */
2943 Py_XDECREF(addr);
2944 return NULL;
2945 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 PyBuffer_Release(&pbuf);
2948 /* Return the number of bytes read and the address. Note that we do
2949 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002950 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002951}
2952
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002953PyDoc_STRVAR(recvfrom_into_doc,
2954"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002955\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002956Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002957
2958
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002959/* The sendmsg() and recvmsg[_into]() methods require a working
2960 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2961#ifdef CMSG_LEN
2962/*
2963 * Call recvmsg() with the supplied iovec structures, flags, and
2964 * ancillary data buffer size (controllen). Returns the tuple return
2965 * value for recvmsg() or recvmsg_into(), with the first item provided
2966 * by the supplied makeval() function. makeval() will be called with
2967 * the length read and makeval_data as arguments, and must return a
2968 * new reference (which will be decrefed if there is a subsequent
2969 * error). On error, closes any file descriptors received via
2970 * SCM_RIGHTS.
2971 */
2972static PyObject *
2973sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2974 int flags, Py_ssize_t controllen,
2975 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2976{
2977 ssize_t bytes_received = -1;
2978 int timeout;
2979 sock_addr_t addrbuf;
2980 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002981 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002982 PyObject *cmsg_list = NULL, *retval = NULL;
2983 void *controlbuf = NULL;
2984 struct cmsghdr *cmsgh;
2985 size_t cmsgdatalen = 0;
2986 int cmsg_status;
2987
2988 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2989 ignored" when the socket is connected (Linux fills them in
2990 anyway for AF_UNIX sockets at least). Normally msg_namelen
2991 seems to be set to 0 if there's no address, but try to
2992 initialize msg_name to something that won't be mistaken for a
2993 real address if that doesn't happen. */
2994 if (!getsockaddrlen(s, &addrbuflen))
2995 return NULL;
2996 memset(&addrbuf, 0, addrbuflen);
2997 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2998
2999 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3000 PyErr_SetString(PyExc_ValueError,
3001 "invalid ancillary data buffer length");
3002 return NULL;
3003 }
3004 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3005 return PyErr_NoMemory();
3006
3007 /* Make the system call. */
3008 if (!IS_SELECTABLE(s)) {
3009 select_error();
3010 goto finally;
3011 }
3012
3013 BEGIN_SELECT_LOOP(s)
3014 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003015 msg.msg_name = SAS2SA(&addrbuf);
3016 msg.msg_namelen = addrbuflen;
3017 msg.msg_iov = iov;
3018 msg.msg_iovlen = iovlen;
3019 msg.msg_control = controlbuf;
3020 msg.msg_controllen = controllen;
3021 timeout = internal_select_ex(s, 0, interval);
3022 if (!timeout)
3023 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3024 Py_END_ALLOW_THREADS;
3025 if (timeout == 1) {
3026 PyErr_SetString(socket_timeout, "timed out");
3027 goto finally;
3028 }
3029 END_SELECT_LOOP(s)
3030
3031 if (bytes_received < 0) {
3032 s->errorhandler();
3033 goto finally;
3034 }
3035
3036 /* Make list of (level, type, data) tuples from control messages. */
3037 if ((cmsg_list = PyList_New(0)) == NULL)
3038 goto err_closefds;
3039 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3040 implementations didn't do so. */
3041 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3042 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3043 PyObject *bytes, *tuple;
3044 int tmp;
3045
3046 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3047 if (cmsg_status != 0) {
3048 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3049 "received malformed or improperly-truncated "
3050 "ancillary data", 1) == -1)
3051 goto err_closefds;
3052 }
3053 if (cmsg_status < 0)
3054 break;
3055 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003056 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003057 goto err_closefds;
3058 }
3059
3060 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3061 cmsgdatalen);
3062 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3063 (int)cmsgh->cmsg_type, bytes);
3064 if (tuple == NULL)
3065 goto err_closefds;
3066 tmp = PyList_Append(cmsg_list, tuple);
3067 Py_DECREF(tuple);
3068 if (tmp != 0)
3069 goto err_closefds;
3070
3071 if (cmsg_status != 0)
3072 break;
3073 }
3074
3075 retval = Py_BuildValue("NOiN",
3076 (*makeval)(bytes_received, makeval_data),
3077 cmsg_list,
3078 (int)msg.msg_flags,
3079 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3080 ((msg.msg_namelen > addrbuflen) ?
3081 addrbuflen : msg.msg_namelen),
3082 s->sock_proto));
3083 if (retval == NULL)
3084 goto err_closefds;
3085
3086finally:
3087 Py_XDECREF(cmsg_list);
3088 PyMem_Free(controlbuf);
3089 return retval;
3090
3091err_closefds:
3092#ifdef SCM_RIGHTS
3093 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3094 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3095 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3096 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3097 if (cmsg_status < 0)
3098 break;
3099 if (cmsgh->cmsg_level == SOL_SOCKET &&
3100 cmsgh->cmsg_type == SCM_RIGHTS) {
3101 size_t numfds;
3102 int *fdp;
3103
3104 numfds = cmsgdatalen / sizeof(int);
3105 fdp = (int *)CMSG_DATA(cmsgh);
3106 while (numfds-- > 0)
3107 close(*fdp++);
3108 }
3109 if (cmsg_status != 0)
3110 break;
3111 }
3112#endif /* SCM_RIGHTS */
3113 goto finally;
3114}
3115
3116
3117static PyObject *
3118makeval_recvmsg(ssize_t received, void *data)
3119{
3120 PyObject **buf = data;
3121
3122 if (received < PyBytes_GET_SIZE(*buf))
3123 _PyBytes_Resize(buf, received);
3124 Py_XINCREF(*buf);
3125 return *buf;
3126}
3127
3128/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3129
3130static PyObject *
3131sock_recvmsg(PySocketSockObject *s, PyObject *args)
3132{
3133 Py_ssize_t bufsize, ancbufsize = 0;
3134 int flags = 0;
3135 struct iovec iov;
3136 PyObject *buf = NULL, *retval = NULL;
3137
3138 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3139 return NULL;
3140
3141 if (bufsize < 0) {
3142 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3143 return NULL;
3144 }
3145 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3146 return NULL;
3147 iov.iov_base = PyBytes_AS_STRING(buf);
3148 iov.iov_len = bufsize;
3149
3150 /* Note that we're passing a pointer to *our pointer* to the bytes
3151 object here (&buf); makeval_recvmsg() may incref the object, or
3152 deallocate it and set our pointer to NULL. */
3153 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3154 &makeval_recvmsg, &buf);
3155 Py_XDECREF(buf);
3156 return retval;
3157}
3158
3159PyDoc_STRVAR(recvmsg_doc,
3160"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3161\n\
3162Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3163socket. The ancbufsize argument sets the size in bytes of the\n\
3164internal buffer used to receive the ancillary data; it defaults to 0,\n\
3165meaning that no ancillary data will be received. Appropriate buffer\n\
3166sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3167CMSG_LEN(), and items which do not fit into the buffer might be\n\
3168truncated or discarded. The flags argument defaults to 0 and has the\n\
3169same meaning as for recv().\n\
3170\n\
3171The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3172The data item is a bytes object holding the non-ancillary data\n\
3173received. The ancdata item is a list of zero or more tuples\n\
3174(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3175(control messages) received: cmsg_level and cmsg_type are integers\n\
3176specifying the protocol level and protocol-specific type respectively,\n\
3177and cmsg_data is a bytes object holding the associated data. The\n\
3178msg_flags item is the bitwise OR of various flags indicating\n\
3179conditions on the received message; see your system documentation for\n\
3180details. If the receiving socket is unconnected, address is the\n\
3181address of the sending socket, if available; otherwise, its value is\n\
3182unspecified.\n\
3183\n\
3184If recvmsg() raises an exception after the system call returns, it\n\
3185will first attempt to close any file descriptors received via the\n\
3186SCM_RIGHTS mechanism.");
3187
3188
3189static PyObject *
3190makeval_recvmsg_into(ssize_t received, void *data)
3191{
3192 return PyLong_FromSsize_t(received);
3193}
3194
3195/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3196
3197static PyObject *
3198sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3199{
3200 Py_ssize_t ancbufsize = 0;
3201 int flags = 0;
3202 struct iovec *iovs = NULL;
3203 Py_ssize_t i, nitems, nbufs = 0;
3204 Py_buffer *bufs = NULL;
3205 PyObject *buffers_arg, *fast, *retval = NULL;
3206
3207 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3208 &buffers_arg, &ancbufsize, &flags))
3209 return NULL;
3210
3211 if ((fast = PySequence_Fast(buffers_arg,
3212 "recvmsg_into() argument 1 must be an "
3213 "iterable")) == NULL)
3214 return NULL;
3215 nitems = PySequence_Fast_GET_SIZE(fast);
3216 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003217 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003218 goto finally;
3219 }
3220
3221 /* Fill in an iovec for each item, and save the Py_buffer
3222 structs to release afterwards. */
3223 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3224 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3225 PyErr_NoMemory();
3226 goto finally;
3227 }
3228 for (; nbufs < nitems; nbufs++) {
3229 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3230 "w*;recvmsg_into() argument 1 must be an iterable "
3231 "of single-segment read-write buffers",
3232 &bufs[nbufs]))
3233 goto finally;
3234 iovs[nbufs].iov_base = bufs[nbufs].buf;
3235 iovs[nbufs].iov_len = bufs[nbufs].len;
3236 }
3237
3238 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3239 &makeval_recvmsg_into, NULL);
3240finally:
3241 for (i = 0; i < nbufs; i++)
3242 PyBuffer_Release(&bufs[i]);
3243 PyMem_Free(bufs);
3244 PyMem_Free(iovs);
3245 Py_DECREF(fast);
3246 return retval;
3247}
3248
3249PyDoc_STRVAR(recvmsg_into_doc,
3250"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3251\n\
3252Receive normal data and ancillary data from the socket, scattering the\n\
3253non-ancillary data into a series of buffers. The buffers argument\n\
3254must be an iterable of objects that export writable buffers\n\
3255(e.g. bytearray objects); these will be filled with successive chunks\n\
3256of the non-ancillary data until it has all been written or there are\n\
3257no more buffers. The ancbufsize argument sets the size in bytes of\n\
3258the internal buffer used to receive the ancillary data; it defaults to\n\
32590, meaning that no ancillary data will be received. Appropriate\n\
3260buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3261or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3262truncated or discarded. The flags argument defaults to 0 and has the\n\
3263same meaning as for recv().\n\
3264\n\
3265The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3266The nbytes item is the total number of bytes of non-ancillary data\n\
3267written into the buffers. The ancdata item is a list of zero or more\n\
3268tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3269data (control messages) received: cmsg_level and cmsg_type are\n\
3270integers specifying the protocol level and protocol-specific type\n\
3271respectively, and cmsg_data is a bytes object holding the associated\n\
3272data. The msg_flags item is the bitwise OR of various flags\n\
3273indicating conditions on the received message; see your system\n\
3274documentation for details. If the receiving socket is unconnected,\n\
3275address is the address of the sending socket, if available; otherwise,\n\
3276its value is unspecified.\n\
3277\n\
3278If recvmsg_into() raises an exception after the system call returns,\n\
3279it will first attempt to close any file descriptors received via the\n\
3280SCM_RIGHTS mechanism.");
3281#endif /* CMSG_LEN */
3282
3283
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003284/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003285
Guido van Rossum73624e91994-10-10 17:59:00 +00003286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003287sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003290 Py_ssize_t len, n = -1;
3291 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3295 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 if (!IS_SELECTABLE(s)) {
3298 PyBuffer_Release(&pbuf);
3299 return select_error();
3300 }
3301 buf = pbuf.buf;
3302 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003303
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003304 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003306 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003307 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003310#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003315 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 PyErr_SetString(socket_timeout, "timed out");
3317 return NULL;
3318 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003319 END_SELECT_LOOP(s)
3320
3321 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 if (n < 0)
3323 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003324 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003325}
3326
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003327PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003328"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003329\n\
3330Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003331argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003332sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003333
3334
3335/* s.sendall(data [,flags]) method */
3336
3337static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003338sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003341 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003342 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3346 return NULL;
3347 buf = pbuf.buf;
3348 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 if (!IS_SELECTABLE(s)) {
3351 PyBuffer_Release(&pbuf);
3352 return select_error();
3353 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003356 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 timeout = internal_select(s, 1);
3358 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003359 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003360#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003361 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003362#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003363 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003364#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003365 }
3366 Py_END_ALLOW_THREADS
3367 if (timeout == 1) {
3368 PyBuffer_Release(&pbuf);
3369 PyErr_SetString(socket_timeout, "timed out");
3370 return NULL;
3371 }
3372 /* PyErr_CheckSignals() might change errno */
3373 saved_errno = errno;
3374 /* We must run our signal handlers before looping again.
3375 send() can return a successful partial write when it is
3376 interrupted, so we can't restrict ourselves to EINTR. */
3377 if (PyErr_CheckSignals()) {
3378 PyBuffer_Release(&pbuf);
3379 return NULL;
3380 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003382 /* If interrupted, try again */
3383 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003385 else
3386 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 }
3388 buf += n;
3389 len -= n;
3390 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 if (n < 0)
3394 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 Py_INCREF(Py_None);
3397 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003398}
3399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003400PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003401"sendall(data[, flags])\n\
3402\n\
3403Send a data string to the socket. For the optional flags\n\
3404argument, see the Unix manual. This calls send() repeatedly\n\
3405until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003406to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003407
Guido van Rossum30a685f1991-06-27 15:51:29 +00003408
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003409/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003410
Guido van Rossum73624e91994-10-10 17:59:00 +00003411static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003412sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 Py_buffer pbuf;
3415 PyObject *addro;
3416 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003417 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 sock_addr_t addrbuf;
3419 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003422 arglen = PyTuple_Size(args);
3423 switch (arglen) {
3424 case 2:
3425 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3426 break;
3427 case 3:
3428 PyArg_ParseTuple(args, "y*iO:sendto",
3429 &pbuf, &flags, &addro);
3430 break;
3431 default:
3432 PyErr_Format(PyExc_TypeError,
3433 "sendto() takes 2 or 3 arguments (%d given)",
3434 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003435 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003437 if (PyErr_Occurred())
3438 return NULL;
3439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 buf = pbuf.buf;
3441 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 if (!IS_SELECTABLE(s)) {
3444 PyBuffer_Release(&pbuf);
3445 return select_error();
3446 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3449 PyBuffer_Release(&pbuf);
3450 return NULL;
3451 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003452
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003453 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003455 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 if (!timeout)
3457 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3458 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003461 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 PyErr_SetString(socket_timeout, "timed out");
3463 return NULL;
3464 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003465 END_SELECT_LOOP(s)
3466 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 if (n < 0)
3468 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003469 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003470}
3471
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003472PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003473"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003474\n\
3475Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003476For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003477
Guido van Rossum30a685f1991-06-27 15:51:29 +00003478
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003479/* The sendmsg() and recvmsg[_into]() methods require a working
3480 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3481#ifdef CMSG_LEN
3482/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3483
3484static PyObject *
3485sock_sendmsg(PySocketSockObject *s, PyObject *args)
3486{
3487 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3488 Py_buffer *databufs = NULL;
3489 struct iovec *iovs = NULL;
3490 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003491 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003492 struct cmsginfo {
3493 int level;
3494 int type;
3495 Py_buffer data;
3496 } *cmsgs = NULL;
3497 void *controlbuf = NULL;
3498 size_t controllen, controllen_last;
3499 ssize_t bytes_sent = -1;
3500 int addrlen, timeout, flags = 0;
3501 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3502 *cmsg_fast = NULL, *retval = NULL;
3503
3504 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3505 &data_arg, &cmsg_arg, &flags, &addr_arg))
3506 return NULL;
3507
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003508 /* Parse destination address. */
3509 if (addr_arg != NULL && addr_arg != Py_None) {
3510 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3511 goto finally;
3512 msg.msg_name = &addrbuf;
3513 msg.msg_namelen = addrlen;
3514 }
3515
3516 /* Fill in an iovec for each message part, and save the Py_buffer
3517 structs to release afterwards. */
3518 if ((data_fast = PySequence_Fast(data_arg,
3519 "sendmsg() argument 1 must be an "
3520 "iterable")) == NULL)
3521 goto finally;
3522 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3523 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003524 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003525 goto finally;
3526 }
3527 msg.msg_iovlen = ndataparts;
3528 if (ndataparts > 0 &&
3529 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3530 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3531 PyErr_NoMemory();
3532 goto finally;
3533 }
3534 for (; ndatabufs < ndataparts; ndatabufs++) {
3535 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3536 "y*;sendmsg() argument 1 must be an iterable of "
3537 "buffer-compatible objects",
3538 &databufs[ndatabufs]))
3539 goto finally;
3540 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3541 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3542 }
3543
3544 if (cmsg_arg == NULL)
3545 ncmsgs = 0;
3546 else {
3547 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3548 "sendmsg() argument 2 must be an "
3549 "iterable")) == NULL)
3550 goto finally;
3551 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3552 }
3553
3554#ifndef CMSG_SPACE
3555 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003556 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003557 "sending multiple control messages is not supported "
3558 "on this system");
3559 goto finally;
3560 }
3561#endif
3562 /* Save level, type and Py_buffer for each control message,
3563 and calculate total size. */
3564 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3565 PyErr_NoMemory();
3566 goto finally;
3567 }
3568 controllen = controllen_last = 0;
3569 while (ncmsgbufs < ncmsgs) {
3570 size_t bufsize, space;
3571
3572 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3573 "(iiy*):[sendmsg() ancillary data items]",
3574 &cmsgs[ncmsgbufs].level,
3575 &cmsgs[ncmsgbufs].type,
3576 &cmsgs[ncmsgbufs].data))
3577 goto finally;
3578 bufsize = cmsgs[ncmsgbufs++].data.len;
3579
3580#ifdef CMSG_SPACE
3581 if (!get_CMSG_SPACE(bufsize, &space)) {
3582#else
3583 if (!get_CMSG_LEN(bufsize, &space)) {
3584#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003585 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003586 goto finally;
3587 }
3588 controllen += space;
3589 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003590 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591 goto finally;
3592 }
3593 controllen_last = controllen;
3594 }
3595
3596 /* Construct ancillary data block from control message info. */
3597 if (ncmsgbufs > 0) {
3598 struct cmsghdr *cmsgh = NULL;
3599
3600 if ((msg.msg_control = controlbuf =
3601 PyMem_Malloc(controllen)) == NULL) {
3602 PyErr_NoMemory();
3603 goto finally;
3604 }
3605 msg.msg_controllen = controllen;
3606
3607 /* Need to zero out the buffer as a workaround for glibc's
3608 CMSG_NXTHDR() implementation. After getting the pointer to
3609 the next header, it checks its (uninitialized) cmsg_len
3610 member to see if the "message" fits in the buffer, and
3611 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003612 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003613 memset(controlbuf, 0, controllen);
3614
3615 for (i = 0; i < ncmsgbufs; i++) {
3616 size_t msg_len, data_len = cmsgs[i].data.len;
3617 int enough_space = 0;
3618
3619 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3620 if (cmsgh == NULL) {
3621 PyErr_Format(PyExc_RuntimeError,
3622 "unexpected NULL result from %s()",
3623 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3624 goto finally;
3625 }
3626 if (!get_CMSG_LEN(data_len, &msg_len)) {
3627 PyErr_SetString(PyExc_RuntimeError,
3628 "item size out of range for CMSG_LEN()");
3629 goto finally;
3630 }
3631 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3632 size_t space;
3633
3634 cmsgh->cmsg_len = msg_len;
3635 if (get_cmsg_data_space(&msg, cmsgh, &space))
3636 enough_space = (space >= data_len);
3637 }
3638 if (!enough_space) {
3639 PyErr_SetString(PyExc_RuntimeError,
3640 "ancillary data does not fit in calculated "
3641 "space");
3642 goto finally;
3643 }
3644 cmsgh->cmsg_level = cmsgs[i].level;
3645 cmsgh->cmsg_type = cmsgs[i].type;
3646 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3647 }
3648 }
3649
3650 /* Make the system call. */
3651 if (!IS_SELECTABLE(s)) {
3652 select_error();
3653 goto finally;
3654 }
3655
3656 BEGIN_SELECT_LOOP(s)
3657 Py_BEGIN_ALLOW_THREADS;
3658 timeout = internal_select_ex(s, 1, interval);
3659 if (!timeout)
3660 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3661 Py_END_ALLOW_THREADS;
3662 if (timeout == 1) {
3663 PyErr_SetString(socket_timeout, "timed out");
3664 goto finally;
3665 }
3666 END_SELECT_LOOP(s)
3667
3668 if (bytes_sent < 0) {
3669 s->errorhandler();
3670 goto finally;
3671 }
3672 retval = PyLong_FromSsize_t(bytes_sent);
3673
3674finally:
3675 PyMem_Free(controlbuf);
3676 for (i = 0; i < ncmsgbufs; i++)
3677 PyBuffer_Release(&cmsgs[i].data);
3678 PyMem_Free(cmsgs);
3679 Py_XDECREF(cmsg_fast);
3680 for (i = 0; i < ndatabufs; i++)
3681 PyBuffer_Release(&databufs[i]);
3682 PyMem_Free(databufs);
3683 PyMem_Free(iovs);
3684 Py_XDECREF(data_fast);
3685 return retval;
3686}
3687
3688PyDoc_STRVAR(sendmsg_doc,
3689"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3690\n\
3691Send normal and ancillary data to the socket, gathering the\n\
3692non-ancillary data from a series of buffers and concatenating it into\n\
3693a single message. The buffers argument specifies the non-ancillary\n\
3694data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3695The ancdata argument specifies the ancillary data (control messages)\n\
3696as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3697cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3698protocol level and protocol-specific type respectively, and cmsg_data\n\
3699is a buffer-compatible object holding the associated data. The flags\n\
3700argument defaults to 0 and has the same meaning as for send(). If\n\
3701address is supplied and not None, it sets a destination address for\n\
3702the message. The return value is the number of bytes of non-ancillary\n\
3703data sent.");
3704#endif /* CMSG_LEN */
3705
3706
Guido van Rossum30a685f1991-06-27 15:51:29 +00003707/* s.shutdown(how) method */
3708
Guido van Rossum73624e91994-10-10 17:59:00 +00003709static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003710sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 int how;
3713 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003714
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02003715 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 if (how == -1 && PyErr_Occurred())
3717 return NULL;
3718 Py_BEGIN_ALLOW_THREADS
3719 res = shutdown(s->sock_fd, how);
3720 Py_END_ALLOW_THREADS
3721 if (res < 0)
3722 return s->errorhandler();
3723 Py_INCREF(Py_None);
3724 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003725}
3726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003727PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003728"shutdown(flag)\n\
3729\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003730Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3731of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003732
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003733#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003734static PyObject*
3735sock_ioctl(PySocketSockObject *s, PyObject *arg)
3736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 unsigned long cmd = SIO_RCVALL;
3738 PyObject *argO;
3739 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3742 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 switch (cmd) {
3745 case SIO_RCVALL: {
3746 unsigned int option = RCVALL_ON;
3747 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3748 return NULL;
3749 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3750 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3751 return set_error();
3752 }
3753 return PyLong_FromUnsignedLong(recv); }
3754 case SIO_KEEPALIVE_VALS: {
3755 struct tcp_keepalive ka;
3756 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3757 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3758 return NULL;
3759 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3760 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3761 return set_error();
3762 }
3763 return PyLong_FromUnsignedLong(recv); }
3764 default:
3765 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3766 return NULL;
3767 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003768}
3769PyDoc_STRVAR(sock_ioctl_doc,
3770"ioctl(cmd, option) -> long\n\
3771\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003772Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3773SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3774SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003775#endif
3776
3777#if defined(MS_WINDOWS)
3778static PyObject*
3779sock_share(PySocketSockObject *s, PyObject *arg)
3780{
3781 WSAPROTOCOL_INFO info;
3782 DWORD processId;
3783 int result;
3784
3785 if (!PyArg_ParseTuple(arg, "I", &processId))
3786 return NULL;
3787
3788 Py_BEGIN_ALLOW_THREADS
3789 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3790 Py_END_ALLOW_THREADS
3791 if (result == SOCKET_ERROR)
3792 return set_error();
3793 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3794}
3795PyDoc_STRVAR(sock_share_doc,
3796"share(process_id) -> bytes\n\
3797\n\
3798Share the socket with another process. The target process id\n\
3799must be provided and the resulting bytes object passed to the target\n\
3800process. There the shared socket can be instantiated by calling\n\
3801socket.fromshare().");
3802
Christian Heimesfaf2f632008-01-06 16:59:19 +00003803
3804#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003805
3806/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003807
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003808static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3810 accept_doc},
3811 {"bind", (PyCFunction)sock_bind, METH_O,
3812 bind_doc},
3813 {"close", (PyCFunction)sock_close, METH_NOARGS,
3814 close_doc},
3815 {"connect", (PyCFunction)sock_connect, METH_O,
3816 connect_doc},
3817 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3818 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003819 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3820 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3822 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003823#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003824 {"getpeername", (PyCFunction)sock_getpeername,
3825 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 {"getsockname", (PyCFunction)sock_getsockname,
3828 METH_NOARGS, getsockname_doc},
3829 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3830 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003831#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3833 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003834#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003835#if defined(MS_WINDOWS)
3836 {"share", (PyCFunction)sock_share, METH_VARARGS,
3837 sock_share_doc},
3838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003839 {"listen", (PyCFunction)sock_listen, METH_O,
3840 listen_doc},
3841 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3842 recv_doc},
3843 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3844 recv_into_doc},
3845 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3846 recvfrom_doc},
3847 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3848 recvfrom_into_doc},
3849 {"send", (PyCFunction)sock_send, METH_VARARGS,
3850 send_doc},
3851 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3852 sendall_doc},
3853 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3854 sendto_doc},
3855 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3856 setblocking_doc},
3857 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3858 settimeout_doc},
3859 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3860 gettimeout_doc},
3861 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3862 setsockopt_doc},
3863 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3864 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003865#ifdef CMSG_LEN
3866 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3867 recvmsg_doc},
3868 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3869 recvmsg_into_doc,},
3870 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3871 sendmsg_doc},
3872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003873 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003874};
3875
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003876/* SockObject members */
3877static PyMemberDef sock_memberlist[] = {
3878 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3879 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3880 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3881 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3882 {0},
3883};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003884
Guido van Rossum73624e91994-10-10 17:59:00 +00003885/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003886 First close the file description. */
3887
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003888static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003889sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003890{
Antoine Pitroue033e062010-10-29 10:38:18 +00003891 if (s->sock_fd != -1) {
3892 PyObject *exc, *val, *tb;
3893 Py_ssize_t old_refcount = Py_REFCNT(s);
3894 ++Py_REFCNT(s);
3895 PyErr_Fetch(&exc, &val, &tb);
3896 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3897 "unclosed %R", s))
3898 /* Spurious errors can appear at shutdown */
3899 if (PyErr_ExceptionMatches(PyExc_Warning))
3900 PyErr_WriteUnraisable((PyObject *) s);
3901 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003903 Py_REFCNT(s) = old_refcount;
3904 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003906}
3907
Guido van Rossum30a685f1991-06-27 15:51:29 +00003908
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003909static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003910sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003911{
Fred Drakea04eaad2000-06-30 02:46:07 +00003912#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003913 if (s->sock_fd > LONG_MAX) {
3914 /* this can occur on Win64, and actually there is a special
3915 ugly printf formatter for decimal pointer length integer
3916 printing, only bother if necessary*/
3917 PyErr_SetString(PyExc_OverflowError,
3918 "no printf formatter to display "
3919 "the socket descriptor in decimal");
3920 return NULL;
3921 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 return PyUnicode_FromFormat(
3924 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3925 (long)s->sock_fd, s->sock_family,
3926 s->sock_type,
3927 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003928}
3929
3930
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003931/* Create a new, uninitialized socket object. */
3932
3933static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003934sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 new = type->tp_alloc(type, 0);
3939 if (new != NULL) {
3940 ((PySocketSockObject *)new)->sock_fd = -1;
3941 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3942 ((PySocketSockObject *)new)->errorhandler = &set_error;
3943 }
3944 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003945}
3946
3947
3948/* Initialize a new socket object. */
3949
3950/*ARGSUSED*/
3951static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003952sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 PySocketSockObject *s = (PySocketSockObject *)self;
3955 PyObject *fdobj = NULL;
3956 SOCKET_T fd = INVALID_SOCKET;
3957 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3958 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3961 "|iiiO:socket", keywords,
3962 &family, &type, &proto, &fdobj))
3963 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003966#ifdef MS_WINDOWS
3967 /* recreate a socket that was duplicated */
3968 if (PyBytes_Check(fdobj)) {
3969 WSAPROTOCOL_INFO info;
3970 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3971 PyErr_Format(PyExc_ValueError,
3972 "socket descriptor string has wrong size, "
3973 "should be %zu bytes.", sizeof(info));
3974 return -1;
3975 }
3976 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3977 Py_BEGIN_ALLOW_THREADS
3978 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3979 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3980 Py_END_ALLOW_THREADS
3981 if (fd == INVALID_SOCKET) {
3982 set_error();
3983 return -1;
3984 }
3985 family = info.iAddressFamily;
3986 type = info.iSocketType;
3987 proto = info.iProtocol;
3988 }
3989 else
3990#endif
3991 {
3992 fd = PyLong_AsSocket_t(fdobj);
3993 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3994 return -1;
3995 if (fd == INVALID_SOCKET) {
3996 PyErr_SetString(PyExc_ValueError,
3997 "can't use invalid socket value");
3998 return -1;
3999 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 }
4001 }
4002 else {
4003 Py_BEGIN_ALLOW_THREADS
4004 fd = socket(family, type, proto);
4005 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004007 if (fd == INVALID_SOCKET) {
4008 set_error();
4009 return -1;
4010 }
4011 }
4012 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004014 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004015
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004016}
4017
4018
Guido van Rossumb6775db1994-08-01 11:34:53 +00004019/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004020
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004021static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4023 "_socket.socket", /* tp_name */
4024 sizeof(PySocketSockObject), /* tp_basicsize */
4025 0, /* tp_itemsize */
4026 (destructor)sock_dealloc, /* tp_dealloc */
4027 0, /* tp_print */
4028 0, /* tp_getattr */
4029 0, /* tp_setattr */
4030 0, /* tp_reserved */
4031 (reprfunc)sock_repr, /* tp_repr */
4032 0, /* tp_as_number */
4033 0, /* tp_as_sequence */
4034 0, /* tp_as_mapping */
4035 0, /* tp_hash */
4036 0, /* tp_call */
4037 0, /* tp_str */
4038 PyObject_GenericGetAttr, /* tp_getattro */
4039 0, /* tp_setattro */
4040 0, /* tp_as_buffer */
4041 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4042 sock_doc, /* tp_doc */
4043 0, /* tp_traverse */
4044 0, /* tp_clear */
4045 0, /* tp_richcompare */
4046 0, /* tp_weaklistoffset */
4047 0, /* tp_iter */
4048 0, /* tp_iternext */
4049 sock_methods, /* tp_methods */
4050 sock_memberlist, /* tp_members */
4051 0, /* tp_getset */
4052 0, /* tp_base */
4053 0, /* tp_dict */
4054 0, /* tp_descr_get */
4055 0, /* tp_descr_set */
4056 0, /* tp_dictoffset */
4057 sock_initobj, /* tp_init */
4058 PyType_GenericAlloc, /* tp_alloc */
4059 sock_new, /* tp_new */
4060 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004061};
4062
Guido van Rossum30a685f1991-06-27 15:51:29 +00004063
Guido van Rossum81194471991-07-27 21:42:02 +00004064/* Python interface to gethostname(). */
4065
4066/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004067static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004068socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004069{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004070#ifdef MS_WINDOWS
4071 /* Don't use winsock's gethostname, as this returns the ANSI
4072 version of the hostname, whereas we need a Unicode string.
4073 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004074 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004075 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004076 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004077 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004078
4079 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004080 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004081
4082 if (GetLastError() != ERROR_MORE_DATA)
4083 return PyErr_SetFromWindowsErr(0);
4084
4085 if (size == 0)
4086 return PyUnicode_New(0, 0);
4087
4088 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4089 names */
4090 name = PyMem_Malloc(size * sizeof(wchar_t));
4091 if (!name)
4092 return NULL;
4093 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4094 name,
4095 &size))
4096 {
4097 PyMem_Free(name);
4098 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004099 }
Victor Stinner74168972011-11-17 01:11:36 +01004100
4101 result = PyUnicode_FromWideChar(name, size);
4102 PyMem_Free(name);
4103 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004104#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 char buf[1024];
4106 int res;
4107 Py_BEGIN_ALLOW_THREADS
4108 res = gethostname(buf, (int) sizeof buf - 1);
4109 Py_END_ALLOW_THREADS
4110 if (res < 0)
4111 return set_error();
4112 buf[sizeof buf - 1] = '\0';
4113 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004114#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004115}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004117PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004118"gethostname() -> string\n\
4119\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004120Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004121
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004122#ifdef HAVE_SETHOSTNAME
4123PyDoc_STRVAR(sethostname_doc,
4124"sethostname(name)\n\n\
4125Sets the hostname to name.");
4126
4127static PyObject *
4128socket_sethostname(PyObject *self, PyObject *args)
4129{
4130 PyObject *hnobj;
4131 Py_buffer buf;
4132 int res, flag = 0;
4133
4134 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4135 PyErr_Clear();
4136 if (!PyArg_ParseTuple(args, "O&:sethostname",
4137 PyUnicode_FSConverter, &hnobj))
4138 return NULL;
4139 flag = 1;
4140 }
4141 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4142 if (!res) {
4143 res = sethostname(buf.buf, buf.len);
4144 PyBuffer_Release(&buf);
4145 }
4146 if (flag)
4147 Py_DECREF(hnobj);
4148 if (res)
4149 return set_error();
4150 Py_RETURN_NONE;
4151}
4152#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004153
Guido van Rossum30a685f1991-06-27 15:51:29 +00004154/* Python interface to gethostbyname(name). */
4155
4156/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004158socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 char *name;
4161 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004162 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004163
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004164 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 return NULL;
4166 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004167 goto finally;
4168 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4169finally:
4170 PyMem_Free(name);
4171 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004172}
4173
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004174PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004175"gethostbyname(host) -> address\n\
4176\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004177Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004178
4179
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004180/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4181
4182static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004183gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 char **pch;
4186 PyObject *rtn_tuple = (PyObject *)NULL;
4187 PyObject *name_list = (PyObject *)NULL;
4188 PyObject *addr_list = (PyObject *)NULL;
4189 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 if (h == NULL) {
4192 /* Let's get real error message to return */
4193 set_herror(h_errno);
4194 return NULL;
4195 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 if (h->h_addrtype != af) {
4198 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004199 errno = EAFNOSUPPORT;
4200 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 return NULL;
4202 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004206 case AF_INET:
4207 if (alen < sizeof(struct sockaddr_in))
4208 return NULL;
4209 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004210
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004211#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 case AF_INET6:
4213 if (alen < sizeof(struct sockaddr_in6))
4214 return NULL;
4215 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004216#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004218 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 if ((name_list = PyList_New(0)) == NULL)
4221 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 if ((addr_list = PyList_New(0)) == NULL)
4224 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 /* SF #1511317: h_aliases can be NULL */
4227 if (h->h_aliases) {
4228 for (pch = h->h_aliases; *pch != NULL; pch++) {
4229 int status;
4230 tmp = PyUnicode_FromString(*pch);
4231 if (tmp == NULL)
4232 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 status = PyList_Append(name_list, tmp);
4235 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 if (status)
4238 goto err;
4239 }
4240 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004242 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4243 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 case AF_INET:
4248 {
4249 struct sockaddr_in sin;
4250 memset(&sin, 0, sizeof(sin));
4251 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004252#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4256 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 if (pch == h->h_addr_list && alen >= sizeof(sin))
4259 memcpy((char *) addr, &sin, sizeof(sin));
4260 break;
4261 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004262
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004263#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 case AF_INET6:
4265 {
4266 struct sockaddr_in6 sin6;
4267 memset(&sin6, 0, sizeof(sin6));
4268 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004269#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4273 tmp = makeipaddr((struct sockaddr *)&sin6,
4274 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4277 memcpy((char *) addr, &sin6, sizeof(sin6));
4278 break;
4279 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004280#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004283 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 "unsupported address family");
4285 return NULL;
4286 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 if (tmp == NULL)
4289 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 status = PyList_Append(addr_list, tmp);
4292 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 if (status)
4295 goto err;
4296 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004299
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004300 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 Py_XDECREF(name_list);
4302 Py_XDECREF(addr_list);
4303 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004304}
4305
4306
4307/* Python interface to gethostbyname_ex(name). */
4308
4309/*ARGSUSED*/
4310static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004311socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 char *name;
4314 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004315 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004317 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004318#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004320#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004322#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 char buf[16384];
4324 int buf_len = (sizeof buf) - 1;
4325 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004326#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004327#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004329#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004330#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004331
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004332 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004334 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004335 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004337#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004338#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004339 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004340 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004341#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004343#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 memset((void *) &data, '\0', sizeof(data));
4345 result = gethostbyname_r(name, &hp_allocated, &data);
4346 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004347#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004348#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004349#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004353#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 Py_END_ALLOW_THREADS
4355 /* Some C libraries would require addr.__ss_family instead of
4356 addr.ss_family.
4357 Therefore, we cast the sockaddr_storage into sockaddr to
4358 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004359 sa = SAS2SA(&addr);
4360 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004362#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004364#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004365finally:
4366 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004368}
4369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004370PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004371"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4372\n\
4373Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004374for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004375
4376
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004377/* Python interface to gethostbyaddr(IP). */
4378
4379/*ARGSUSED*/
4380static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004381socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004382{
Charles-François Natali8b759652011-12-23 16:44:51 +01004383 sock_addr_t addr;
4384 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 char *ip_num;
4386 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004387 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004388#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004390#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004392#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 /* glibcs up to 2.10 assume that the buf argument to
4394 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4395 does not ensure. The attribute below instructs the compiler
4396 to maintain this alignment. */
4397 char buf[16384] Py_ALIGNED(8);
4398 int buf_len = (sizeof buf) - 1;
4399 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004400#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004401#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004403#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004404#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 char *ap;
4406 int al;
4407 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004408
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004409 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 return NULL;
4411 af = AF_UNSPEC;
4412 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004413 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 af = sa->sa_family;
4415 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004416 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 switch (af) {
4418 case AF_INET:
4419 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4420 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4421 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004422#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 case AF_INET6:
4424 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4425 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4426 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004429 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004430 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 }
4432 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004433#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004434#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004435 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 &hp_allocated, buf, buf_len,
4437 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004438#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 h = gethostbyaddr_r(ap, al, af,
4440 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004441#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 memset((void *) &data, '\0', sizeof(data));
4443 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4444 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004445#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004446#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004447#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004451#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004453 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004454#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004456#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004457finally:
4458 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004460}
4461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004462PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004463"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4464\n\
4465Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004466for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004467
Guido van Rossum30a685f1991-06-27 15:51:29 +00004468
4469/* Python interface to getservbyname(name).
4470 This only returns the port number, since the other info is already
4471 known or not useful (like the list of aliases). */
4472
4473/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004474static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004475socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 char *name, *proto=NULL;
4478 struct servent *sp;
4479 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4480 return NULL;
4481 Py_BEGIN_ALLOW_THREADS
4482 sp = getservbyname(name, proto);
4483 Py_END_ALLOW_THREADS
4484 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004485 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 return NULL;
4487 }
4488 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004489}
4490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004491PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004492"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004493\n\
4494Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004495The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4496otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004497
Guido van Rossum30a685f1991-06-27 15:51:29 +00004498
Barry Warsaw11b91a02004-06-28 00:50:43 +00004499/* Python interface to getservbyport(port).
4500 This only returns the service name, since the other info is already
4501 known or not useful (like the list of aliases). */
4502
4503/*ARGSUSED*/
4504static PyObject *
4505socket_getservbyport(PyObject *self, PyObject *args)
4506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 int port;
4508 char *proto=NULL;
4509 struct servent *sp;
4510 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4511 return NULL;
4512 if (port < 0 || port > 0xffff) {
4513 PyErr_SetString(
4514 PyExc_OverflowError,
4515 "getservbyport: port must be 0-65535.");
4516 return NULL;
4517 }
4518 Py_BEGIN_ALLOW_THREADS
4519 sp = getservbyport(htons((short)port), proto);
4520 Py_END_ALLOW_THREADS
4521 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004522 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 return NULL;
4524 }
4525 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004526}
4527
4528PyDoc_STRVAR(getservbyport_doc,
4529"getservbyport(port[, protocolname]) -> string\n\
4530\n\
4531Return the service name from a port number and protocol name.\n\
4532The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4533otherwise any protocol will match.");
4534
Guido van Rossum3901d851996-12-19 16:35:04 +00004535/* Python interface to getprotobyname(name).
4536 This only returns the protocol number, since the other info is
4537 already known or not useful (like the list of aliases). */
4538
4539/*ARGSUSED*/
4540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004541socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 char *name;
4544 struct protoent *sp;
4545 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4546 return NULL;
4547 Py_BEGIN_ALLOW_THREADS
4548 sp = getprotobyname(name);
4549 Py_END_ALLOW_THREADS
4550 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004551 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 return NULL;
4553 }
4554 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004555}
4556
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004557PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004558"getprotobyname(name) -> integer\n\
4559\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004560Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004561
Guido van Rossum3901d851996-12-19 16:35:04 +00004562
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004563#ifndef NO_DUP
4564/* dup() function for socket fds */
4565
4566static PyObject *
4567socket_dup(PyObject *self, PyObject *fdobj)
4568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 SOCKET_T fd, newfd;
4570 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004571
4572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 fd = PyLong_AsSocket_t(fdobj);
4574 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4575 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 newfd = dup_socket(fd);
4578 if (newfd == INVALID_SOCKET)
4579 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 newfdobj = PyLong_FromSocket_t(newfd);
4582 if (newfdobj == NULL)
4583 SOCKETCLOSE(newfd);
4584 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004585}
4586
4587PyDoc_STRVAR(dup_doc,
4588"dup(integer) -> integer\n\
4589\n\
4590Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4591sockets; on some platforms os.dup() won't work for socket file descriptors.");
4592#endif
4593
4594
Dave Cole331708b2004-08-09 04:51:41 +00004595#ifdef HAVE_SOCKETPAIR
4596/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004597 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004598 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004599
4600/*ARGSUSED*/
4601static PyObject *
4602socket_socketpair(PyObject *self, PyObject *args)
4603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 PySocketSockObject *s0 = NULL, *s1 = NULL;
4605 SOCKET_T sv[2];
4606 int family, type = SOCK_STREAM, proto = 0;
4607 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004608
4609#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004611#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004612 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4615 &family, &type, &proto))
4616 return NULL;
4617 /* Create a pair of socket fds */
4618 if (socketpair(family, type, proto, sv) < 0)
4619 return set_error();
4620 s0 = new_sockobject(sv[0], family, type, proto);
4621 if (s0 == NULL)
4622 goto finally;
4623 s1 = new_sockobject(sv[1], family, type, proto);
4624 if (s1 == NULL)
4625 goto finally;
4626 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004627
4628finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 if (res == NULL) {
4630 if (s0 == NULL)
4631 SOCKETCLOSE(sv[0]);
4632 if (s1 == NULL)
4633 SOCKETCLOSE(sv[1]);
4634 }
4635 Py_XDECREF(s0);
4636 Py_XDECREF(s1);
4637 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004638}
4639
4640PyDoc_STRVAR(socketpair_doc,
4641"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4642\n\
4643Create a pair of socket objects from the sockets returned by the platform\n\
4644socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004645The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004646AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004647
4648#endif /* HAVE_SOCKETPAIR */
4649
4650
Guido van Rossum006bf911996-06-12 04:04:55 +00004651static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004652socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4657 return NULL;
4658 }
4659 if (x1 < 0) {
4660 PyErr_SetString(PyExc_OverflowError,
4661 "can't convert negative number to unsigned long");
4662 return NULL;
4663 }
4664 x2 = (unsigned int)ntohs((unsigned short)x1);
4665 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004666}
4667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004668PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004669"ntohs(integer) -> integer\n\
4670\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004671Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004672
4673
Guido van Rossum006bf911996-06-12 04:04:55 +00004674static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004675socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 if (PyLong_Check(arg)) {
4680 x = PyLong_AsUnsignedLong(arg);
4681 if (x == (unsigned long) -1 && PyErr_Occurred())
4682 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004683#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 {
4685 unsigned long y;
4686 /* only want the trailing 32 bits */
4687 y = x & 0xFFFFFFFFUL;
4688 if (y ^ x)
4689 return PyErr_Format(PyExc_OverflowError,
4690 "long int larger than 32 bits");
4691 x = y;
4692 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 }
4695 else
4696 return PyErr_Format(PyExc_TypeError,
4697 "expected int/long, %s found",
4698 Py_TYPE(arg)->tp_name);
4699 if (x == (unsigned long) -1 && PyErr_Occurred())
4700 return NULL;
4701 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004702}
4703
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004704PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004705"ntohl(integer) -> integer\n\
4706\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004707Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004708
4709
Guido van Rossum006bf911996-06-12 04:04:55 +00004710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004711socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4716 return NULL;
4717 }
4718 if (x1 < 0) {
4719 PyErr_SetString(PyExc_OverflowError,
4720 "can't convert negative number to unsigned long");
4721 return NULL;
4722 }
4723 x2 = (unsigned int)htons((unsigned short)x1);
4724 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004725}
4726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004727PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004728"htons(integer) -> integer\n\
4729\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004730Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004731
4732
Guido van Rossum006bf911996-06-12 04:04:55 +00004733static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004734socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 if (PyLong_Check(arg)) {
4739 x = PyLong_AsUnsignedLong(arg);
4740 if (x == (unsigned long) -1 && PyErr_Occurred())
4741 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004742#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 {
4744 unsigned long y;
4745 /* only want the trailing 32 bits */
4746 y = x & 0xFFFFFFFFUL;
4747 if (y ^ x)
4748 return PyErr_Format(PyExc_OverflowError,
4749 "long int larger than 32 bits");
4750 x = y;
4751 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 }
4754 else
4755 return PyErr_Format(PyExc_TypeError,
4756 "expected int/long, %s found",
4757 Py_TYPE(arg)->tp_name);
4758 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004759}
4760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004761PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004762"htonl(integer) -> integer\n\
4763\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004764Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004765
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004766/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004767
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004768PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004769"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004770\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004771Convert 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 +00004772binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004773
4774static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004775socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004776{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004777#ifndef INADDR_NONE
4778#define INADDR_NONE (-1)
4779#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004780#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004782#endif
4783
4784#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004785#if (SIZEOF_INT != 4)
4786#error "Not sure if in_addr_t exists and int is not 32-bits."
4787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 /* Have to use inet_addr() instead */
4789 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4794 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004795
Tim Peters1df9fdd2003-02-13 03:13:40 +00004796
4797#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004798
4799#ifdef USE_INET_ATON_WEAKLINK
4800 if (inet_aton != NULL) {
4801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 if (inet_aton(ip_addr, &buf))
4803 return PyBytes_FromStringAndSize((char *)(&buf),
4804 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004805
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004806 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 "illegal IP address string passed to inet_aton");
4808 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004809
Thomas Wouters477c8d52006-05-27 19:21:47 +00004810#ifdef USE_INET_ATON_WEAKLINK
4811 } else {
4812#endif
4813
4814#endif
4815
4816#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 /* special-case this address as inet_addr might return INADDR_NONE
4819 * for this */
4820 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4821 packed_addr = 0xFFFFFFFF;
4822 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004827 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 "illegal IP address string passed to inet_aton");
4829 return NULL;
4830 }
4831 }
4832 return PyBytes_FromStringAndSize((char *) &packed_addr,
4833 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004834
4835#ifdef USE_INET_ATON_WEAKLINK
4836 }
4837#endif
4838
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004839#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004840}
4841
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004842PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004843"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004844\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004845Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004846
4847static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004848socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 char *packed_str;
4851 int addr_len;
4852 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4855 return NULL;
4856 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004859 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 "packed IP wrong length for inet_ntoa");
4861 return NULL;
4862 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004867}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004868
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004869#ifdef HAVE_INET_PTON
4870
4871PyDoc_STRVAR(inet_pton_doc,
4872"inet_pton(af, ip) -> packed IP address string\n\
4873\n\
4874Convert an IP address from string format to a packed string suitable\n\
4875for use with low-level network functions.");
4876
4877static PyObject *
4878socket_inet_pton(PyObject *self, PyObject *args)
4879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 int af;
4881 char* ip;
4882 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004883#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004885#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4889 return NULL;
4890 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004891
Martin v. Löwis04697e82004-06-02 12:35:29 +00004892#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004893 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004894 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 "can't use AF_INET6, IPv6 is disabled");
4896 return NULL;
4897 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004898#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 retval = inet_pton(af, ip, packed);
4901 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004902 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 return NULL;
4904 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004905 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 "illegal IP address string passed to inet_pton");
4907 return NULL;
4908 } else if (af == AF_INET) {
4909 return PyBytes_FromStringAndSize(packed,
4910 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004911#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 } else if (af == AF_INET6) {
4913 return PyBytes_FromStringAndSize(packed,
4914 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004917 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 return NULL;
4919 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004920}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004921
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004922PyDoc_STRVAR(inet_ntop_doc,
4923"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4924\n\
4925Convert a packed IP address of the given family to string format.");
4926
4927static PyObject *
4928socket_inet_ntop(PyObject *self, PyObject *args)
4929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 int af;
4931 char* packed;
4932 int len;
4933 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004934#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004936#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004938#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4941 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4944 return NULL;
4945 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 if (af == AF_INET) {
4948 if (len != sizeof(struct in_addr)) {
4949 PyErr_SetString(PyExc_ValueError,
4950 "invalid length of packed IP address string");
4951 return NULL;
4952 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004953#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 } else if (af == AF_INET6) {
4955 if (len != sizeof(struct in6_addr)) {
4956 PyErr_SetString(PyExc_ValueError,
4957 "invalid length of packed IP address string");
4958 return NULL;
4959 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 } else {
4962 PyErr_Format(PyExc_ValueError,
4963 "unknown address family %d", af);
4964 return NULL;
4965 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 retval = inet_ntop(af, packed, ip, sizeof(ip));
4968 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004969 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 return NULL;
4971 } else {
4972 return PyUnicode_FromString(retval);
4973 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 /* NOTREACHED */
4976 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4977 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004978}
4979
4980#endif /* HAVE_INET_PTON */
4981
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004982/* Python interface to getaddrinfo(host, port). */
4983
4984/*ARGSUSED*/
4985static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004986socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004987{
Victor Stinner77af1722011-05-26 14:05:59 +02004988 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004989 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 struct addrinfo hints, *res;
4991 struct addrinfo *res0 = NULL;
4992 PyObject *hobj = NULL;
4993 PyObject *pobj = (PyObject *)NULL;
4994 char pbuf[30];
4995 char *hptr, *pptr;
4996 int family, socktype, protocol, flags;
4997 int error;
4998 PyObject *all = (PyObject *)NULL;
4999 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 family = socktype = protocol = flags = 0;
5002 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005003 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005004 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 &protocol, &flags)) {
5006 return NULL;
5007 }
5008 if (hobj == Py_None) {
5009 hptr = NULL;
5010 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005011 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005012
5013 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 if (!idna)
5015 return NULL;
5016 assert(PyBytes_Check(idna));
5017 hptr = PyBytes_AS_STRING(idna);
5018 } else if (PyBytes_Check(hobj)) {
5019 hptr = PyBytes_AsString(hobj);
5020 } else {
5021 PyErr_SetString(PyExc_TypeError,
5022 "getaddrinfo() argument 1 must be string or None");
5023 return NULL;
5024 }
5025 if (PyLong_CheckExact(pobj)) {
5026 long value = PyLong_AsLong(pobj);
5027 if (value == -1 && PyErr_Occurred())
5028 goto err;
5029 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5030 pptr = pbuf;
5031 } else if (PyUnicode_Check(pobj)) {
5032 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005033 if (pptr == NULL)
5034 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005036 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 } else if (pobj == Py_None) {
5038 pptr = (char *)NULL;
5039 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005040 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 goto err;
5042 }
5043 memset(&hints, 0, sizeof(hints));
5044 hints.ai_family = family;
5045 hints.ai_socktype = socktype;
5046 hints.ai_protocol = protocol;
5047 hints.ai_flags = flags;
5048 Py_BEGIN_ALLOW_THREADS
5049 ACQUIRE_GETADDRINFO_LOCK
5050 error = getaddrinfo(hptr, pptr, &hints, &res0);
5051 Py_END_ALLOW_THREADS
5052 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5053 if (error) {
5054 set_gaierror(error);
5055 goto err;
5056 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if ((all = PyList_New(0)) == NULL)
5059 goto err;
5060 for (res = res0; res; res = res->ai_next) {
5061 PyObject *single;
5062 PyObject *addr =
5063 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5064 if (addr == NULL)
5065 goto err;
5066 single = Py_BuildValue("iiisO", res->ai_family,
5067 res->ai_socktype, res->ai_protocol,
5068 res->ai_canonname ? res->ai_canonname : "",
5069 addr);
5070 Py_DECREF(addr);
5071 if (single == NULL)
5072 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 if (PyList_Append(all, single))
5075 goto err;
5076 Py_XDECREF(single);
5077 }
5078 Py_XDECREF(idna);
5079 if (res0)
5080 freeaddrinfo(res0);
5081 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005082 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 Py_XDECREF(all);
5084 Py_XDECREF(idna);
5085 if (res0)
5086 freeaddrinfo(res0);
5087 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005088}
5089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005090PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005091"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5092 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005093\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005094Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005095
5096/* Python interface to getnameinfo(sa, flags). */
5097
5098/*ARGSUSED*/
5099static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005100socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 PyObject *sa = (PyObject *)NULL;
5103 int flags;
5104 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005105 int port;
5106 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5108 struct addrinfo hints, *res = NULL;
5109 int error;
5110 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 flags = flowinfo = scope_id = 0;
5113 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5114 return NULL;
5115 if (!PyTuple_Check(sa)) {
5116 PyErr_SetString(PyExc_TypeError,
5117 "getnameinfo() argument 1 must be a tuple");
5118 return NULL;
5119 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005120 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 &hostp, &port, &flowinfo, &scope_id))
5122 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005123 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005124 PyErr_SetString(PyExc_OverflowError,
5125 "getsockaddrarg: flowinfo must be 0-1048575.");
5126 return NULL;
5127 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5129 memset(&hints, 0, sizeof(hints));
5130 hints.ai_family = AF_UNSPEC;
5131 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005132 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 Py_BEGIN_ALLOW_THREADS
5134 ACQUIRE_GETADDRINFO_LOCK
5135 error = getaddrinfo(hostp, pbuf, &hints, &res);
5136 Py_END_ALLOW_THREADS
5137 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5138 if (error) {
5139 set_gaierror(error);
5140 goto fail;
5141 }
5142 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005143 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 "sockaddr resolved to multiple addresses");
5145 goto fail;
5146 }
5147 switch (res->ai_family) {
5148 case AF_INET:
5149 {
5150 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005151 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 "IPv4 sockaddr must be 2 tuple");
5153 goto fail;
5154 }
5155 break;
5156 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005157#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 case AF_INET6:
5159 {
5160 struct sockaddr_in6 *sin6;
5161 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005162 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 sin6->sin6_scope_id = scope_id;
5164 break;
5165 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005168 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5170 if (error) {
5171 set_gaierror(error);
5172 goto fail;
5173 }
5174 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005175
5176fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 if (res)
5178 freeaddrinfo(res);
5179 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005180}
5181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005182PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005183"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005184\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005185Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005186
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005187
5188/* Python API to getting and setting the default timeout value. */
5189
5190static PyObject *
5191socket_getdefaulttimeout(PyObject *self)
5192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 if (defaulttimeout < 0.0) {
5194 Py_INCREF(Py_None);
5195 return Py_None;
5196 }
5197 else
5198 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005199}
5200
5201PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005202"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005203\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005204Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005205A value of None indicates that new socket objects have no timeout.\n\
5206When the socket module is first imported, the default is None.");
5207
5208static PyObject *
5209socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 if (arg == Py_None)
5214 timeout = -1.0;
5215 else {
5216 timeout = PyFloat_AsDouble(arg);
5217 if (timeout < 0.0) {
5218 if (!PyErr_Occurred())
5219 PyErr_SetString(PyExc_ValueError,
5220 "Timeout value out of range");
5221 return NULL;
5222 }
5223 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 Py_INCREF(Py_None);
5228 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005229}
5230
5231PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005232"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005233\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005234Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005235A value of None indicates that new socket objects have no timeout.\n\
5236When the socket module is first imported, the default is None.");
5237
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005238#ifdef HAVE_IF_NAMEINDEX
5239/* Python API for getting interface indices and names */
5240
5241static PyObject *
5242socket_if_nameindex(PyObject *self, PyObject *arg)
5243{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005244 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005245 int i;
5246 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005247
Charles-François Natali60713592011-05-20 16:55:06 +02005248 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005249 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005250 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005251 return NULL;
5252 }
5253
5254 list = PyList_New(0);
5255 if (list == NULL) {
5256 if_freenameindex(ni);
5257 return NULL;
5258 }
5259
Charles-François Natali60713592011-05-20 16:55:06 +02005260 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5261 PyObject *ni_tuple = Py_BuildValue("IO&",
5262 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005263
5264 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5265 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005266 Py_DECREF(list);
5267 if_freenameindex(ni);
5268 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005269 }
5270 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005271 }
5272
5273 if_freenameindex(ni);
5274 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005275}
5276
5277PyDoc_STRVAR(if_nameindex_doc,
5278"if_nameindex()\n\
5279\n\
5280Returns a list of network interface information (index, name) tuples.");
5281
Charles-François Natali60713592011-05-20 16:55:06 +02005282static PyObject *
5283socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005284{
Charles-François Natali60713592011-05-20 16:55:06 +02005285 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005286 unsigned long index;
5287
Charles-François Natali60713592011-05-20 16:55:06 +02005288 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5289 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005290 return NULL;
5291
Charles-François Natali60713592011-05-20 16:55:06 +02005292 index = if_nametoindex(PyBytes_AS_STRING(oname));
5293 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005294 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005295 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005296 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005297 return NULL;
5298 }
5299
5300 return PyLong_FromUnsignedLong(index);
5301}
5302
5303PyDoc_STRVAR(if_nametoindex_doc,
5304"if_nametoindex(if_name)\n\
5305\n\
5306Returns the interface index corresponding to the interface name if_name.");
5307
Charles-François Natali60713592011-05-20 16:55:06 +02005308static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005309socket_if_indextoname(PyObject *self, PyObject *arg)
5310{
Charles-François Natali60713592011-05-20 16:55:06 +02005311 unsigned long index;
5312 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005313
Charles-François Natali60713592011-05-20 16:55:06 +02005314 index = PyLong_AsUnsignedLong(arg);
5315 if (index == (unsigned long) -1)
5316 return NULL;
5317
5318 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005319 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005320 return NULL;
5321 }
5322
Charles-François Natali60713592011-05-20 16:55:06 +02005323 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005324}
5325
5326PyDoc_STRVAR(if_indextoname_doc,
5327"if_indextoname(if_index)\n\
5328\n\
5329Returns the interface name corresponding to the interface index if_index.");
5330
5331#endif /* HAVE_IF_NAMEINDEX */
5332
5333
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005334#ifdef CMSG_LEN
5335/* Python interface to CMSG_LEN(length). */
5336
5337static PyObject *
5338socket_CMSG_LEN(PyObject *self, PyObject *args)
5339{
5340 Py_ssize_t length;
5341 size_t result;
5342
5343 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5344 return NULL;
5345 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5346 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5347 return NULL;
5348 }
5349 return PyLong_FromSize_t(result);
5350}
5351
5352PyDoc_STRVAR(CMSG_LEN_doc,
5353"CMSG_LEN(length) -> control message length\n\
5354\n\
5355Return the total length, without trailing padding, of an ancillary\n\
5356data item with associated data of the given length. This value can\n\
5357often be used as the buffer size for recvmsg() to receive a single\n\
5358item of ancillary data, but RFC 3542 requires portable applications to\n\
5359use CMSG_SPACE() and thus include space for padding, even when the\n\
5360item will be the last in the buffer. Raises OverflowError if length\n\
5361is outside the permissible range of values.");
5362
5363
5364#ifdef CMSG_SPACE
5365/* Python interface to CMSG_SPACE(length). */
5366
5367static PyObject *
5368socket_CMSG_SPACE(PyObject *self, PyObject *args)
5369{
5370 Py_ssize_t length;
5371 size_t result;
5372
5373 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5374 return NULL;
5375 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5376 PyErr_SetString(PyExc_OverflowError,
5377 "CMSG_SPACE() argument out of range");
5378 return NULL;
5379 }
5380 return PyLong_FromSize_t(result);
5381}
5382
5383PyDoc_STRVAR(CMSG_SPACE_doc,
5384"CMSG_SPACE(length) -> buffer size\n\
5385\n\
5386Return the buffer size needed for recvmsg() to receive an ancillary\n\
5387data item with associated data of the given length, along with any\n\
5388trailing padding. The buffer space needed to receive multiple items\n\
5389is the sum of the CMSG_SPACE() values for their associated data\n\
5390lengths. Raises OverflowError if length is outside the permissible\n\
5391range of values.");
5392#endif /* CMSG_SPACE */
5393#endif /* CMSG_LEN */
5394
5395
Guido van Rossum30a685f1991-06-27 15:51:29 +00005396/* List of functions exported by this module. */
5397
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005398static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 {"gethostbyname", socket_gethostbyname,
5400 METH_VARARGS, gethostbyname_doc},
5401 {"gethostbyname_ex", socket_gethostbyname_ex,
5402 METH_VARARGS, ghbn_ex_doc},
5403 {"gethostbyaddr", socket_gethostbyaddr,
5404 METH_VARARGS, gethostbyaddr_doc},
5405 {"gethostname", socket_gethostname,
5406 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005407#ifdef HAVE_SETHOSTNAME
5408 {"sethostname", socket_sethostname,
5409 METH_VARARGS, sethostname_doc},
5410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 {"getservbyname", socket_getservbyname,
5412 METH_VARARGS, getservbyname_doc},
5413 {"getservbyport", socket_getservbyport,
5414 METH_VARARGS, getservbyport_doc},
5415 {"getprotobyname", socket_getprotobyname,
5416 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005417#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 {"dup", socket_dup,
5419 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005420#endif
Dave Cole331708b2004-08-09 04:51:41 +00005421#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 {"socketpair", socket_socketpair,
5423 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 {"ntohs", socket_ntohs,
5426 METH_VARARGS, ntohs_doc},
5427 {"ntohl", socket_ntohl,
5428 METH_O, ntohl_doc},
5429 {"htons", socket_htons,
5430 METH_VARARGS, htons_doc},
5431 {"htonl", socket_htonl,
5432 METH_O, htonl_doc},
5433 {"inet_aton", socket_inet_aton,
5434 METH_VARARGS, inet_aton_doc},
5435 {"inet_ntoa", socket_inet_ntoa,
5436 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005437#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 {"inet_pton", socket_inet_pton,
5439 METH_VARARGS, inet_pton_doc},
5440 {"inet_ntop", socket_inet_ntop,
5441 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005442#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005443 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5444 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 {"getnameinfo", socket_getnameinfo,
5446 METH_VARARGS, getnameinfo_doc},
5447 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5448 METH_NOARGS, getdefaulttimeout_doc},
5449 {"setdefaulttimeout", socket_setdefaulttimeout,
5450 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005451#ifdef HAVE_IF_NAMEINDEX
5452 {"if_nameindex", socket_if_nameindex,
5453 METH_NOARGS, if_nameindex_doc},
5454 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005455 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005456 {"if_indextoname", socket_if_indextoname,
5457 METH_O, if_indextoname_doc},
5458#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005459#ifdef CMSG_LEN
5460 {"CMSG_LEN", socket_CMSG_LEN,
5461 METH_VARARGS, CMSG_LEN_doc},
5462#ifdef CMSG_SPACE
5463 {"CMSG_SPACE", socket_CMSG_SPACE,
5464 METH_VARARGS, CMSG_SPACE_doc},
5465#endif
5466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005468};
5469
Guido van Rossum30a685f1991-06-27 15:51:29 +00005470
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005471#ifdef MS_WINDOWS
5472#define OS_INIT_DEFINED
5473
5474/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005475
5476static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005477os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005480}
5481
5482static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005483os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 WSADATA WSAData;
5486 int ret;
5487 ret = WSAStartup(0x0101, &WSAData);
5488 switch (ret) {
5489 case 0: /* No error */
5490 Py_AtExit(os_cleanup);
5491 return 1; /* Success */
5492 case WSASYSNOTREADY:
5493 PyErr_SetString(PyExc_ImportError,
5494 "WSAStartup failed: network not ready");
5495 break;
5496 case WSAVERNOTSUPPORTED:
5497 case WSAEINVAL:
5498 PyErr_SetString(
5499 PyExc_ImportError,
5500 "WSAStartup failed: requested version not supported");
5501 break;
5502 default:
5503 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5504 break;
5505 }
5506 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005507}
5508
Guido van Rossum8d665e61996-06-26 18:22:49 +00005509#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005510
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005511
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005512#ifdef PYOS_OS2
5513#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005514
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005515/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005516
5517static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005518os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005519{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005520#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 if (rc == 0) {
5524 return 1; /* Success */
5525 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005530#else
Ezio Melotti13925002011-03-16 11:05:33 +02005531 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005533#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005534}
5535
5536#endif /* PYOS_OS2 */
5537
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005538
5539#ifndef OS_INIT_DEFINED
5540static int
5541os_init(void)
5542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005544}
5545#endif
5546
5547
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005548/* C API table - always add new things to the end for binary
5549 compatibility. */
5550static
5551PySocketModule_APIObject PySocketModuleAPI =
5552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005554 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005556};
5557
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005558
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005559/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005560
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005561 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005562 "socket.py" which implements some additional functionality.
5563 The import of "_socket" may fail with an ImportError exception if
5564 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005565 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005566 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005567*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005569PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005570"Implementation module for socket operations.\n\
5571\n\
5572See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005573
Martin v. Löwis1a214512008-06-11 05:26:20 +00005574static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 PyModuleDef_HEAD_INIT,
5576 PySocket_MODULE_NAME,
5577 socket_doc,
5578 -1,
5579 socket_methods,
5580 NULL,
5581 NULL,
5582 NULL,
5583 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005584};
5585
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005586PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005587PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 if (!os_init())
5592 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 Py_TYPE(&sock_type) = &PyType_Type;
5595 m = PyModule_Create(&socketmodule);
5596 if (m == NULL)
5597 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005598
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005599 Py_INCREF(PyExc_OSError);
5600 PySocketModuleAPI.error = PyExc_OSError;
5601 Py_INCREF(PyExc_OSError);
5602 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005604 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 if (socket_herror == NULL)
5606 return NULL;
5607 Py_INCREF(socket_herror);
5608 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005609 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 NULL);
5611 if (socket_gaierror == NULL)
5612 return NULL;
5613 Py_INCREF(socket_gaierror);
5614 PyModule_AddObject(m, "gaierror", socket_gaierror);
5615 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005616 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 if (socket_timeout == NULL)
5618 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005619 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 Py_INCREF(socket_timeout);
5621 PyModule_AddObject(m, "timeout", socket_timeout);
5622 Py_INCREF((PyObject *)&sock_type);
5623 if (PyModule_AddObject(m, "SocketType",
5624 (PyObject *)&sock_type) != 0)
5625 return NULL;
5626 Py_INCREF((PyObject *)&sock_type);
5627 if (PyModule_AddObject(m, "socket",
5628 (PyObject *)&sock_type) != 0)
5629 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005630
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005631#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005633#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 Py_INCREF(has_ipv6);
5637 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 /* Export C API */
5640 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5641 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5642 ) != 0)
5643 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005646#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005648#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005650#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005652#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005653#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005655#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005656#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 /* Amateur Radio AX.25 */
5658 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005659#endif
5660#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005662#endif
5663#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 /* Appletalk DDP */
5665 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005666#endif
5667#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 /* Amateur radio NetROM */
5669 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005670#endif
5671#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005672 /* Multiprotocol bridge */
5673 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005674#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005675#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 /* ATM PVCs */
5677 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005678#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005679#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 /* Reserved for Werner's ATM */
5681 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005682#endif
5683#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 /* Reserved for X.25 project */
5685 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005686#endif
5687#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005689#endif
5690#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 /* Amateur Radio X.25 PLP */
5692 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005693#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005694#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 /* Reserved for DECnet project */
5696 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005697#endif
5698#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 /* Reserved for 802.2LLC project */
5700 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005701#endif
5702#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 /* Security callback pseudo AF */
5704 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005705#endif
5706#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 /* PF_KEY key management API */
5708 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005709#endif
5710#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 /* */
5712 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5713 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005714#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005716#endif
5717#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5721 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005722#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005724#endif
5725#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005727#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005728#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005730#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005731#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005733#endif
5734#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005738#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005740#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005741#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005743#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005744#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005745#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 /* Alias to emulate 4.4BSD */
5747 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005748#endif
5749#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 /* Ash */
5751 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005752#endif
5753#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 /* Acorn Econet */
5755 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005756#endif
5757#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 /* ATM SVCs */
5759 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005760#endif
5761#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 /* Linux SNA Project (nutters!) */
5763 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005764#endif
5765#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 /* IRDA sockets */
5767 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005768#endif
5769#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 /* PPPoX sockets */
5771 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005772#endif
5773#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774 /* Wanpipe API Sockets */
5775 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005776#endif
5777#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 /* Linux LLC */
5779 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005780#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005781
Hye-Shik Chang81268602004-02-02 06:05:24 +00005782#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5784 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5785 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5786 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005787#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005789#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005790#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005791#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5795 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5798 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5799 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005800#endif
5801
Charles-François Natali47413c12011-10-06 19:47:44 +02005802#ifdef AF_CAN
5803 /* Controller Area Network */
5804 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5805#endif
5806#ifdef PF_CAN
5807 /* Controller Area Network */
5808 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5809#endif
5810
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005811/* Reliable Datagram Sockets */
5812#ifdef AF_RDS
5813 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5814#endif
5815#ifdef PF_RDS
5816 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5817#endif
5818
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01005819/* Kernel event messages */
5820#ifdef PF_SYSTEM
5821 PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
5822#endif
5823#ifdef AF_SYSTEM
5824 PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
5825#endif
5826
Antoine Pitroub156a462010-10-27 20:13:57 +00005827#ifdef AF_PACKET
5828 PyModule_AddIntMacro(m, AF_PACKET);
5829#endif
5830#ifdef PF_PACKET
5831 PyModule_AddIntMacro(m, PF_PACKET);
5832#endif
5833#ifdef PACKET_HOST
5834 PyModule_AddIntMacro(m, PACKET_HOST);
5835#endif
5836#ifdef PACKET_BROADCAST
5837 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5838#endif
5839#ifdef PACKET_MULTICAST
5840 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5841#endif
5842#ifdef PACKET_OTHERHOST
5843 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5844#endif
5845#ifdef PACKET_OUTGOING
5846 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5847#endif
5848#ifdef PACKET_LOOPBACK
5849 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5850#endif
5851#ifdef PACKET_FASTROUTE
5852 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005853#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005854
Christian Heimes043d6f62008-01-07 17:19:16 +00005855#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 /* for addresses */
5859 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5860 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5861 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5864 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5865 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005867 /* for setsockopt() */
5868 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5869 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5870 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5871 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5872 TIPC_DEST_DROPPABLE);
5873 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5876 TIPC_LOW_IMPORTANCE);
5877 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5878 TIPC_MEDIUM_IMPORTANCE);
5879 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5880 TIPC_HIGH_IMPORTANCE);
5881 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5882 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 /* for subscriptions */
5885 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5886 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005887#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 /* doesn't seem to be available everywhere */
5889 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5892 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5893 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5894 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5895 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5896 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005897#endif
5898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 /* Socket types */
5900 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5901 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005902/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5904 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005905#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005907#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005908#ifdef SOCK_CLOEXEC
5909 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5910#endif
5911#ifdef SOCK_NONBLOCK
5912 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5913#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915#ifdef SO_DEBUG
5916 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918#ifdef SO_ACCEPTCONN
5919 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921#ifdef SO_REUSEADDR
5922 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005923#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005924#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005926#endif
5927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928#ifdef SO_KEEPALIVE
5929 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931#ifdef SO_DONTROUTE
5932 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934#ifdef SO_BROADCAST
5935 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937#ifdef SO_USELOOPBACK
5938 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940#ifdef SO_LINGER
5941 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943#ifdef SO_OOBINLINE
5944 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946#ifdef SO_REUSEPORT
5947 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949#ifdef SO_SNDBUF
5950 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952#ifdef SO_RCVBUF
5953 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955#ifdef SO_SNDLOWAT
5956 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958#ifdef SO_RCVLOWAT
5959 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961#ifdef SO_SNDTIMEO
5962 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964#ifdef SO_RCVTIMEO
5965 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967#ifdef SO_ERROR
5968 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970#ifdef SO_TYPE
5971 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973#ifdef SO_SETFIB
5974 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005975#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005976#ifdef SO_PASSCRED
5977 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5978#endif
5979#ifdef SO_PEERCRED
5980 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5981#endif
5982#ifdef LOCAL_PEERCRED
5983 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5984#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005985#ifdef SO_BINDTODEVICE
5986 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5987#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989 /* Maximum number of connections for "listen" */
5990#ifdef SOMAXCONN
5991 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005992#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005994#endif
5995
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005996 /* Ancilliary message types */
5997#ifdef SCM_RIGHTS
5998 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5999#endif
6000#ifdef SCM_CREDENTIALS
6001 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
6002#endif
6003#ifdef SCM_CREDS
6004 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
6005#endif
6006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 /* Flags for send, recv */
6008#ifdef MSG_OOB
6009 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011#ifdef MSG_PEEK
6012 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014#ifdef MSG_DONTROUTE
6015 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017#ifdef MSG_DONTWAIT
6018 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020#ifdef MSG_EOR
6021 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023#ifdef MSG_TRUNC
6024 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026#ifdef MSG_CTRUNC
6027 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029#ifdef MSG_WAITALL
6030 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032#ifdef MSG_BTAG
6033 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035#ifdef MSG_ETAG
6036 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006037#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006038#ifdef MSG_NOSIGNAL
6039 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
6040#endif
6041#ifdef MSG_NOTIFICATION
6042 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
6043#endif
6044#ifdef MSG_CMSG_CLOEXEC
6045 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
6046#endif
6047#ifdef MSG_ERRQUEUE
6048 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
6049#endif
6050#ifdef MSG_CONFIRM
6051 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
6052#endif
6053#ifdef MSG_MORE
6054 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
6055#endif
6056#ifdef MSG_EOF
6057 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
6058#endif
6059#ifdef MSG_BCAST
6060 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
6061#endif
6062#ifdef MSG_MCAST
6063 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
6064#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 /* Protocol level and numbers, usable for [gs]etsockopt */
6067#ifdef SOL_SOCKET
6068 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006069#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070#ifdef SOL_IP
6071 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006072#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075#ifdef SOL_IPX
6076 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078#ifdef SOL_AX25
6079 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081#ifdef SOL_ATALK
6082 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084#ifdef SOL_NETROM
6085 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087#ifdef SOL_ROSE
6088 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090#ifdef SOL_TCP
6091 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006092#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095#ifdef SOL_UDP
6096 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006097#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006099#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006100#ifdef SOL_CAN_BASE
6101 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
6102#endif
6103#ifdef SOL_CAN_RAW
6104 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
6105 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
6106#endif
6107#ifdef HAVE_LINUX_CAN_H
6108 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
6109 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
6110 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
6111
6112 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
6113 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
6114 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
6115#endif
6116#ifdef HAVE_LINUX_CAN_RAW_H
6117 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
6118 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
6119 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
6120 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
6121#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006122#ifdef SOL_RDS
6123 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
6124#endif
6125#ifdef RDS_CANCEL_SENT_TO
6126 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
6127#endif
6128#ifdef RDS_GET_MR
6129 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
6130#endif
6131#ifdef RDS_FREE_MR
6132 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
6133#endif
6134#ifdef RDS_RECVERR
6135 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
6136#endif
6137#ifdef RDS_CONG_MONITOR
6138 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
6139#endif
6140#ifdef RDS_GET_MR_FOR_DEST
6141 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
6142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143#ifdef IPPROTO_IP
6144 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006145#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef IPPROTO_HOPOPTS
6149 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151#ifdef IPPROTO_ICMP
6152 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006153#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156#ifdef IPPROTO_IGMP
6157 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159#ifdef IPPROTO_GGP
6160 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162#ifdef IPPROTO_IPV4
6163 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165#ifdef IPPROTO_IPV6
6166 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168#ifdef IPPROTO_IPIP
6169 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171#ifdef IPPROTO_TCP
6172 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006173#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176#ifdef IPPROTO_EGP
6177 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179#ifdef IPPROTO_PUP
6180 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182#ifdef IPPROTO_UDP
6183 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006184#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187#ifdef IPPROTO_IDP
6188 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190#ifdef IPPROTO_HELLO
6191 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193#ifdef IPPROTO_ND
6194 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196#ifdef IPPROTO_TP
6197 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199#ifdef IPPROTO_IPV6
6200 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202#ifdef IPPROTO_ROUTING
6203 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205#ifdef IPPROTO_FRAGMENT
6206 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208#ifdef IPPROTO_RSVP
6209 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211#ifdef IPPROTO_GRE
6212 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214#ifdef IPPROTO_ESP
6215 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217#ifdef IPPROTO_AH
6218 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220#ifdef IPPROTO_MOBILE
6221 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223#ifdef IPPROTO_ICMPV6
6224 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226#ifdef IPPROTO_NONE
6227 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef IPPROTO_DSTOPTS
6230 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232#ifdef IPPROTO_XTP
6233 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235#ifdef IPPROTO_EON
6236 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238#ifdef IPPROTO_PIM
6239 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241#ifdef IPPROTO_IPCOMP
6242 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244#ifdef IPPROTO_VRRP
6245 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006246#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006247#ifdef IPPROTO_SCTP
6248 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250#ifdef IPPROTO_BIP
6251 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006252#endif
6253/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254#ifdef IPPROTO_RAW
6255 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006256#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259#ifdef IPPROTO_MAX
6260 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006261#endif
6262
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006263#ifdef SYSPROTO_CONTROL
6264 PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
6265#endif
6266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 /* Some port configuration */
6268#ifdef IPPORT_RESERVED
6269 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006270#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273#ifdef IPPORT_USERRESERVED
6274 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006275#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006277#endif
6278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 /* Some reserved IP v.4 addresses */
6280#ifdef INADDR_ANY
6281 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285#ifdef INADDR_BROADCAST
6286 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006287#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef INADDR_LOOPBACK
6291 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006292#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295#ifdef INADDR_UNSPEC_GROUP
6296 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006297#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300#ifdef INADDR_ALLHOSTS_GROUP
6301 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6302 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006303#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306#ifdef INADDR_MAX_LOCAL_GROUP
6307 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6308 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006309#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312#ifdef INADDR_NONE
6313 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006314#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006316#endif
6317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 /* IPv4 [gs]etsockopt options */
6319#ifdef IP_OPTIONS
6320 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322#ifdef IP_HDRINCL
6323 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325#ifdef IP_TOS
6326 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328#ifdef IP_TTL
6329 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331#ifdef IP_RECVOPTS
6332 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334#ifdef IP_RECVRETOPTS
6335 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337#ifdef IP_RECVDSTADDR
6338 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef IP_RETOPTS
6341 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343#ifdef IP_MULTICAST_IF
6344 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346#ifdef IP_MULTICAST_TTL
6347 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef IP_MULTICAST_LOOP
6350 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352#ifdef IP_ADD_MEMBERSHIP
6353 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355#ifdef IP_DROP_MEMBERSHIP
6356 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006357#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358#ifdef IP_DEFAULT_MULTICAST_TTL
6359 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6360 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362#ifdef IP_DEFAULT_MULTICAST_LOOP
6363 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6364 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366#ifdef IP_MAX_MEMBERSHIPS
6367 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006368#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006369#ifdef IP_TRANSPARENT
6370 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6371#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6374#ifdef IPV6_JOIN_GROUP
6375 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377#ifdef IPV6_LEAVE_GROUP
6378 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380#ifdef IPV6_MULTICAST_HOPS
6381 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383#ifdef IPV6_MULTICAST_IF
6384 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386#ifdef IPV6_MULTICAST_LOOP
6387 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389#ifdef IPV6_UNICAST_HOPS
6390 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006393#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006397#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006399#endif
6400#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006402#endif
6403#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006405#endif
6406#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006408#endif
6409#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006411#endif
6412#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006414#endif
6415#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006417#endif
6418#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006420#endif
6421#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006423#endif
6424#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006426#endif
6427#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006429#endif
6430#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006432#endif
6433#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006435#endif
6436#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006438#endif
6439#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006441#endif
6442#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006444#endif
6445#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006447#endif
6448#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006450#endif
6451#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006453#endif
6454#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006456#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 /* TCP options */
6459#ifdef TCP_NODELAY
6460 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef TCP_MAXSEG
6463 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465#ifdef TCP_CORK
6466 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468#ifdef TCP_KEEPIDLE
6469 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471#ifdef TCP_KEEPINTVL
6472 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474#ifdef TCP_KEEPCNT
6475 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477#ifdef TCP_SYNCNT
6478 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006480#ifdef TCP_LINGER2
6481 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483#ifdef TCP_DEFER_ACCEPT
6484 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486#ifdef TCP_WINDOW_CLAMP
6487 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef TCP_INFO
6490 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006492#ifdef TCP_QUICKACK
6493 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006494#endif
6495
Guido van Rossum09be4091999-08-09 14:40:40 +00006496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497 /* IPX options */
6498#ifdef IPX_TYPE
6499 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006500#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006501
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006502/* Reliable Datagram Sockets */
6503#ifdef RDS_CMSG_RDMA_ARGS
6504 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6505#endif
6506#ifdef RDS_CMSG_RDMA_DEST
6507 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6508#endif
6509#ifdef RDS_CMSG_RDMA_MAP
6510 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6511#endif
6512#ifdef RDS_CMSG_RDMA_STATUS
6513 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6514#endif
6515#ifdef RDS_CMSG_RDMA_UPDATE
6516 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6517#endif
6518#ifdef RDS_RDMA_READWRITE
6519 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6520#endif
6521#ifdef RDS_RDMA_FENCE
6522 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6523#endif
6524#ifdef RDS_RDMA_INVALIDATE
6525 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6526#endif
6527#ifdef RDS_RDMA_USE_ONCE
6528 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6529#endif
6530#ifdef RDS_RDMA_DONTWAIT
6531 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6532#endif
6533#ifdef RDS_RDMA_NOTIFY_ME
6534 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6535#endif
6536#ifdef RDS_RDMA_SILENT
6537 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6538#endif
6539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006541#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006543#endif
6544#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006546#endif
6547#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006549#endif
6550#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006552#endif
6553#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006555#endif
6556#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006558#endif
6559#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006561#endif
6562#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006564#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006565#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006567#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006568#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006570#endif
6571#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006573#endif
6574#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006576#endif
6577#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006579#endif
6580#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006582#endif
6583#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006585#endif
6586#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006588#endif
6589#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006591#endif
6592#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006594#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006595#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006597#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006598#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006600#endif
6601#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006603#endif
6604#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006606#endif
6607#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006609#endif
6610#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006612#endif
6613#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006615#endif
6616#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006618#endif
6619#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006621#endif
6622#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006624#endif
6625#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006627#endif
6628#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006630#endif
6631#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006633#endif
6634#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006636#endif
6637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006639#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006641#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006642 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006643#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006645#endif
6646#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006648#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006650#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006652#endif
6653#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006655#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006657#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006658 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006659#endif
6660
Christian Heimesfaf2f632008-01-06 16:59:19 +00006661#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 {
6663 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6664 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6665 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006666 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 PyObject *tmp;
6668 tmp = PyLong_FromUnsignedLong(codes[i]);
6669 if (tmp == NULL)
6670 return NULL;
6671 PyModule_AddObject(m, names[i], tmp);
6672 }
6673 }
6674 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6675 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6676 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006677#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006679#endif
6680#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006682#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006683#endif /* _MSTCPIP_ */
6684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006686#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006690}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006691
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006692
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006693#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006694#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006695
6696/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006697/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006698
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006699int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006700inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006703#if (SIZEOF_INT != 4)
6704#error "Not sure if in_addr_t exists and int is not 32-bits."
6705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706 unsigned int packed_addr;
6707 packed_addr = inet_addr(src);
6708 if (packed_addr == INADDR_NONE)
6709 return 0;
6710 memcpy(dst, &packed_addr, 4);
6711 return 1;
6712 }
6713 /* Should set errno to EAFNOSUPPORT */
6714 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006715}
6716
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006717const char *
6718inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720 if (af == AF_INET) {
6721 struct in_addr packed_addr;
6722 if (size < 16)
6723 /* Should set errno to ENOSPC. */
6724 return NULL;
6725 memcpy(&packed_addr, src, sizeof(packed_addr));
6726 return strncpy(dst, inet_ntoa(packed_addr), size);
6727 }
6728 /* Should set errno to EAFNOSUPPORT */
6729 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006730}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006731
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006732#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006733#endif