blob: 8107b98efb168a80d0daabe8084ef48b00181e6d [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\
140if_nametoindex(name) -- returns the corresponding interface index\n\
141if_indextoname(index) -- returns 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
Guido van Rossum7a122991999-04-13 04:07:32 +0000159#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#endif
162
Guido van Rossume7de2061999-03-24 17:24:33 +0000163#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100164# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165# define HAVE_GETHOSTBYNAME_R_3_ARG
166# elif defined(__sun) || defined(__sgi)
167# define HAVE_GETHOSTBYNAME_R_5_ARG
168# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000169/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000170# else
171# undef HAVE_GETHOSTBYNAME_R
172# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000173#endif
174
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000175#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
176 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000178#endif
179
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000180/* To use __FreeBSD_version */
181#ifdef HAVE_SYS_PARAM_H
182#include <sys/param.h>
183#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000184/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000185 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000186#if defined(WITH_THREAD) && (defined(__APPLE__) || \
187 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000188 defined(__OpenBSD__) || defined(__NetBSD__) || \
189 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000190#define USE_GETADDRINFO_LOCK
191#endif
192
193#ifdef USE_GETADDRINFO_LOCK
194#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
195#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
196#else
197#define ACQUIRE_GETADDRINFO_LOCK
198#define RELEASE_GETADDRINFO_LOCK
199#endif
200
201#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000202# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000203#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000204
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000205#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# include <types.h>
207# include <io.h>
208# include <sys/ioctl.h>
209# include <utils.h>
210# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000211#endif
212
Martin v. Löwis9e437302002-12-06 12:57:26 +0000213#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000214# include <ioctl.h>
215#endif
216
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000217#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000218# define INCL_DOS
219# define INCL_DOSERRORS
220# define INCL_NOPMAPI
221# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000222#endif
223
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000225/* make sure that the reentrant (gethostbyaddr_r etc)
226 functions are declared correctly if compiling with
227 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228
Thomas Wouters477c8d52006-05-27 19:21:47 +0000229/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000230 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000231#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000232#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000233
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000234#undef _XOPEN_SOURCE
235#include <sys/socket.h>
236#include <sys/types.h>
237#include <netinet/in.h>
238#ifdef _SS_ALIGNSIZE
239#define HAVE_GETADDRINFO 1
240#define HAVE_GETNAMEINFO 1
241#endif
242
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000243#define HAVE_INET_PTON
244#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000245#endif
246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* Irix 6.5 fails to define this variable at all. This is needed
248 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000249 are just busted. Same thing for Solaris. */
250#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000251#define INET_ADDRSTRLEN 16
252#endif
253
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000255#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000256#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000257#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700259#ifdef HAVE_SYS_SOCKET_H
260#include <sys/socket.h>
261#endif
262
263#ifdef HAVE_NET_IF_H
264#include <net/if.h>
265#endif
266
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000267/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000269#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Addressing includes */
272
Guido van Rossum6f489d91996-06-28 20:15:15 +0000273#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Non-MS WINDOWS includes */
276# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Guido van Rossum9376b741999-09-15 22:01:40 +0000278/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000279# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000281typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000285
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000288#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000289
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000291# ifdef HAVE_FCNTL_H
292# include <fcntl.h>
293# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Jeremy Hylton22308652001-02-02 03:23:09 +0000295#endif
296
Skip Montanaro7befb992004-02-10 16:50:21 +0000297#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000298
299#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000301#endif
302
Neal Norwitz39d22e52002-11-02 19:55:21 +0000303#ifndef O_NONBLOCK
304# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000305#endif
306
Trent Micka708d6e2004-09-07 17:48:26 +0000307/* include Python's addrinfo.h unless it causes trouble */
308#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
309 /* Do not include addinfo.h on some newer IRIX versions.
310 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
311 * for example, but not by 6.5.10.
312 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000313#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000314 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
315 * EAI_* constants are defined in (the already included) ws2tcpip.h.
316 */
317#else
318# include "addrinfo.h"
319#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000320
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000321#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000322#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000323int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000324const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000325#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000326#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000327
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000328#ifdef __APPLE__
329/* On OS X, getaddrinfo returns no error indication of lookup
330 failure, so we must use the emulation instead of the libinfo
331 implementation. Unfortunately, performing an autoconf test
332 for this bug would require DNS access for the machine performing
333 the configuration, which is not acceptable. Therefore, we
334 determine the bug just by checking for __APPLE__. If this bug
335 gets ever fixed, perhaps checking for sys/version.h would be
336 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000337#ifndef HAVE_GETNAMEINFO
338/* This bug seems to be fixed in Jaguar. Ths easiest way I could
339 Find to check for Jaguar is that it has getnameinfo(), which
340 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000341#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000343
344#ifdef HAVE_INET_ATON
345#define USE_INET_ATON_WEAKLINK
346#endif
347
Jack Jansen84262fb2002-07-02 14:40:42 +0000348#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000349
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000350/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352/* avoid clashes with the C library definition of the symbol. */
353#define getaddrinfo fake_getaddrinfo
354#define gai_strerror fake_gai_strerror
355#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000356#include "getaddrinfo.c"
357#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000358#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000359#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000360#include "getnameinfo.c"
361#endif
362
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000363#ifdef MS_WINDOWS
364/* On Windows a socket is really a handle not an fd */
365static SOCKET
366dup_socket(SOCKET handle)
367{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000368 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000369
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000370 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000372
373 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
374 FROM_PROTOCOL_INFO, &info, 0, 0);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000375}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000376#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000377#else
378/* On Unix we can use dup to duplicate the file descriptor of a socket*/
379#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000380#endif
381
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000382#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000383#define EAFNOSUPPORT WSAEAFNOSUPPORT
384#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000385#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000386
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000387#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000388#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000389#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000390#endif
391
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000392#ifndef SOCKETCLOSE
393#define SOCKETCLOSE close
394#endif
395
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000396#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000397#define USE_BLUETOOTH 1
398#if defined(__FreeBSD__)
399#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
400#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000401#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000402#define SOL_HCI SOL_HCI_RAW
403#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000404#define sockaddr_l2 sockaddr_l2cap
405#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000406#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000407#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
408#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000409#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000410#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000411#define sockaddr_l2 sockaddr_bt
412#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000413#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000414#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000415#define SOL_HCI BTPROTO_HCI
416#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000417#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
418#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000419#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000420#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000421#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000425#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
426#endif
427#endif
428
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000429#ifdef __VMS
430/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
431#define SEGMENT_SIZE (32 * 1024 -1)
432#endif
433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434#define SAS2SA(x) ((struct sockaddr *)(x))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000435
Martin v. Löwise9416172003-05-03 10:12:45 +0000436/*
437 * Constants for getnameinfo()
438 */
439#if !defined(NI_MAXHOST)
440#define NI_MAXHOST 1025
441#endif
442#if !defined(NI_MAXSERV)
443#define NI_MAXSERV 32
444#endif
445
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000446#ifndef INVALID_SOCKET /* MS defines this */
447#define INVALID_SOCKET (-1)
448#endif
449
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000450/* XXX There's a problem here: *static* functions are not supposed to have
451 a Py prefix (or use CapitalizedWords). Later... */
452
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453/* Global variable holding the exception type for errors detected
454 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000455static PyObject *socket_error;
456static PyObject *socket_herror;
457static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000458static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000459
Tim Peters643a7fc2002-02-17 04:13:21 +0000460/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000461 The sock_type variable contains pointers to various functions,
462 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000463 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000464static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000465
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466#if defined(HAVE_POLL_H)
467#include <poll.h>
468#elif defined(HAVE_SYS_POLL_H)
469#include <sys/poll.h>
470#endif
471
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000472#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
473/* Platform can select file descriptors beyond FD_SETSIZE */
474#define IS_SELECTABLE(s) 1
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000475#elif defined(HAVE_POLL)
476/* Instead of select(), we'll use poll() since poll() works on any fd. */
477#define IS_SELECTABLE(s) 1
478/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000479#else
480/* POSIX says selecting file descriptors beyond FD_SETSIZE
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000481 has undefined behaviour. If there's no timeout left, we don't have to
482 call select, so it's a safe, little white lie. */
483#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000484#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000485
486static PyObject*
487select_error(void)
488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 PyErr_SetString(socket_error, "unable to select on socket");
490 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000491}
492
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000493#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000494#ifndef WSAEAGAIN
495#define WSAEAGAIN WSAEWOULDBLOCK
496#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000497#define CHECK_ERRNO(expected) \
498 (WSAGetLastError() == WSA ## expected)
499#else
500#define CHECK_ERRNO(expected) \
501 (errno == expected)
502#endif
503
Guido van Rossum30a685f1991-06-27 15:51:29 +0000504/* Convenience function to raise an error according to errno
505 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000506
Guido van Rossum73624e91994-10-10 17:59:00 +0000507static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000508set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000509{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000510#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 int err_no = WSAGetLastError();
512 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
513 recognizes the error codes used by both GetLastError() and
514 WSAGetLastError */
515 if (err_no)
516 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000517#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000518
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000519#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 if (sock_errno() != NO_ERROR) {
521 APIRET rc;
522 ULONG msglen;
523 char outbuf[100];
524 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 /* Retrieve socket-related error message from MPTN.MSG file */
527 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
528 myerrorcode - SOCBASEERR + 26,
529 "mptn.msg",
530 &msglen);
531 if (rc == NO_ERROR) {
532 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 /* OS/2 doesn't guarantee a terminator */
535 outbuf[msglen] = '\0';
536 if (strlen(outbuf) > 0) {
537 /* If non-empty msg, trim CRLF */
538 char *lastc = &outbuf[ strlen(outbuf)-1 ];
539 while (lastc > outbuf &&
540 isspace(Py_CHARMASK(*lastc))) {
541 /* Trim trailing whitespace (CRLF) */
542 *lastc-- = '\0';
543 }
544 }
545 v = Py_BuildValue("(is)", myerrorcode, outbuf);
546 if (v != NULL) {
547 PyErr_SetObject(socket_error, v);
548 Py_DECREF(v);
549 }
550 return NULL;
551 }
552 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000553#endif
554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000560set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563
564#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 if (v != NULL) {
570 PyErr_SetObject(socket_herror, v);
571 Py_DECREF(v);
572 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575}
576
577
578static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000579set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000582
Martin v. Löwis272cb402002-03-01 08:31:07 +0000583#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* EAI_SYSTEM is not available on Windows XP. */
585 if (error == EAI_SYSTEM)
586 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000587#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000589#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000591#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 if (v != NULL) {
595 PyErr_SetObject(socket_gaierror, v);
596 Py_DECREF(v);
597 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600}
601
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000602#ifdef __VMS
603/* Function to send in segments */
604static int
605sendsegmented(int sock_fd, char *buf, int len, int flags)
606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 int n = 0;
608 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 while (remaining > 0) {
611 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
614 n = send(sock_fd, buf, segment, flags);
615 if (n < 0) {
616 return n;
617 }
618 remaining -= segment;
619 buf += segment;
620 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000623}
624#endif
625
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000626/* Function to perform the setting of socket blocking mode
627 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628static int
629internal_setblocking(PySocketSockObject *s, int block)
630{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000631#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000633#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000634#ifdef SOCK_NONBLOCK
635 if (block)
636 s->sock_type &= (~SOCK_NONBLOCK);
637 else
638 s->sock_type |= SOCK_NONBLOCK;
639#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#ifndef MS_WINDOWS
643#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 block = !block;
645 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000646#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 block = !block;
648 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000649#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
651 if (block)
652 delay_flag &= (~O_NONBLOCK);
653 else
654 delay_flag |= O_NONBLOCK;
655 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656#endif /* !PYOS_OS2 */
657#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 block = !block;
659 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 /* Since these don't return anything */
664 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665}
666
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000668 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000669 This does not raise an exception; we'll let our caller do that
670 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000671 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000672static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000673internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 /* Nothing to do unless we're in timeout mode (not non-blocking) */
678 if (s->sock_timeout <= 0.0)
679 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 /* Guard against closed socket */
682 if (s->sock_fd < 0)
683 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000684
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685 /* Handling this condition here simplifies the select loops */
686 if (interval < 0.0)
687 return 1;
688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Prefer poll, if available, since you can poll() any fd
690 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 {
693 struct pollfd pollfd;
694 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 pollfd.fd = s->sock_fd;
697 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000700 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 n = poll(&pollfd, 1, timeout);
702 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 {
705 /* Construct the arguments to select */
706 fd_set fds;
707 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000708 tv.tv_sec = (int)interval;
709 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 FD_ZERO(&fds);
711 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 /* See if the socket is ready */
714 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000715 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
716 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000718 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
719 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (n < 0)
724 return -1;
725 if (n == 0)
726 return 1;
727 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728}
729
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000730static int
731internal_select(PySocketSockObject *s, int writing)
732{
733 return internal_select_ex(s, writing, s->sock_timeout);
734}
735
736/*
737 Two macros for automatic retry of select() in case of false positives
738 (for example, select() could indicate a socket is ready for reading
739 but the data then discarded by the OS because of a wrong checksum).
740 Here is an example of use:
741
742 BEGIN_SELECT_LOOP(s)
743 Py_BEGIN_ALLOW_THREADS
744 timeout = internal_select_ex(s, 0, interval);
745 if (!timeout)
746 outlen = recv(s->sock_fd, cbuf, len, flags);
747 Py_END_ALLOW_THREADS
748 if (timeout == 1) {
749 PyErr_SetString(socket_timeout, "timed out");
750 return -1;
751 }
752 END_SELECT_LOOP(s)
753*/
754
755#define BEGIN_SELECT_LOOP(s) \
756 { \
757 _PyTime_timeval now, deadline = {0, 0}; \
758 double interval = s->sock_timeout; \
759 int has_timeout = s->sock_timeout > 0.0; \
760 if (has_timeout) { \
761 _PyTime_gettimeofday(&now); \
762 deadline = now; \
763 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
764 } \
765 while (1) { \
766 errno = 0; \
767
768#define END_SELECT_LOOP(s) \
769 if (!has_timeout || \
770 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
771 break; \
772 _PyTime_gettimeofday(&now); \
773 interval = _PyTime_INTERVAL(now, deadline); \
774 } \
775 } \
776
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000777/* Initialize a new socket object. */
778
Tim Petersa12b4cf2002-07-18 22:38:44 +0000779static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000780
Martin v. Löwis1a214512008-06-11 05:26:20 +0000781static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000782init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 s->sock_fd = fd;
786 s->sock_family = family;
787 s->sock_type = type;
788 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000791#ifdef SOCK_NONBLOCK
792 if (type & SOCK_NONBLOCK)
793 s->sock_timeout = 0.0;
794 else
795#endif
796 {
797 s->sock_timeout = defaulttimeout;
798 if (defaulttimeout >= 0.0)
799 internal_setblocking(s, 0);
800 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000801
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000802}
803
804
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805/* Create a new socket object.
806 This just creates the object and initializes it.
807 If the creation fails, return NULL and set an exception (implicit
808 in NEWOBJ()). */
809
Guido van Rossum73624e91994-10-10 17:59:00 +0000810static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000811new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 PySocketSockObject *s;
814 s = (PySocketSockObject *)
815 PyType_GenericNew(&sock_type, NULL, NULL);
816 if (s != NULL)
817 init_sockobject(s, fd, family, type, proto);
818 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819}
820
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821
Guido van Rossum48a680c2001-03-02 06:34:14 +0000822/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000823 thread to be in gethostbyname or getaddrinfo */
824#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
825PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000826#endif
827
828
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829/* Convert a string specifying a host name or one of a few symbolic
830 names to a numeric IP address. This usually calls gethostbyname()
831 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000832 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833 an error occurred; then an exception is raised. */
834
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000836setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 struct addrinfo hints, *res;
839 int error;
840 int d1, d2, d3, d4;
841 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
844 if (name[0] == '\0') {
845 int siz;
846 memset(&hints, 0, sizeof(hints));
847 hints.ai_family = af;
848 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
849 hints.ai_flags = AI_PASSIVE;
850 Py_BEGIN_ALLOW_THREADS
851 ACQUIRE_GETADDRINFO_LOCK
852 error = getaddrinfo(NULL, "0", &hints, &res);
853 Py_END_ALLOW_THREADS
854 /* We assume that those thread-unsafe getaddrinfo() versions
855 *are* safe regarding their return value, ie. that a
856 subsequent call to getaddrinfo() does not destroy the
857 outcome of the first call. */
858 RELEASE_GETADDRINFO_LOCK
859 if (error) {
860 set_gaierror(error);
861 return -1;
862 }
863 switch (res->ai_family) {
864 case AF_INET:
865 siz = 4;
866 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000867#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 case AF_INET6:
869 siz = 16;
870 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 default:
873 freeaddrinfo(res);
874 PyErr_SetString(socket_error,
875 "unsupported address family");
876 return -1;
877 }
878 if (res->ai_next) {
879 freeaddrinfo(res);
880 PyErr_SetString(socket_error,
881 "wildcard resolved to multiple address");
882 return -1;
883 }
884 if (res->ai_addrlen < addr_ret_size)
885 addr_ret_size = res->ai_addrlen;
886 memcpy(addr_ret, res->ai_addr, addr_ret_size);
887 freeaddrinfo(res);
888 return siz;
889 }
890 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
891 struct sockaddr_in *sin;
892 if (af != AF_INET && af != AF_UNSPEC) {
893 PyErr_SetString(socket_error,
894 "address family mismatched");
895 return -1;
896 }
897 sin = (struct sockaddr_in *)addr_ret;
898 memset((void *) sin, '\0', sizeof(*sin));
899 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000900#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 sin->sin_addr.s_addr = INADDR_BROADCAST;
904 return sizeof(sin->sin_addr);
905 }
906 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
907 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
908 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
909 struct sockaddr_in *sin;
910 sin = (struct sockaddr_in *)addr_ret;
911 sin->sin_addr.s_addr = htonl(
912 ((long) d1 << 24) | ((long) d2 << 16) |
913 ((long) d3 << 8) | ((long) d4 << 0));
914 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000915#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 return 4;
919 }
920 memset(&hints, 0, sizeof(hints));
921 hints.ai_family = af;
922 Py_BEGIN_ALLOW_THREADS
923 ACQUIRE_GETADDRINFO_LOCK
924 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000925#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 if (error == EAI_NONAME && af == AF_UNSPEC) {
927 /* On Tru64 V5.1, numeric-to-addr conversion fails
928 if no address family is given. Assume IPv4 for now.*/
929 hints.ai_family = AF_INET;
930 error = getaddrinfo(name, NULL, &hints, &res);
931 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 Py_END_ALLOW_THREADS
934 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
935 if (error) {
936 set_gaierror(error);
937 return -1;
938 }
939 if (res->ai_addrlen < addr_ret_size)
940 addr_ret_size = res->ai_addrlen;
941 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
942 freeaddrinfo(res);
943 switch (addr_ret->sa_family) {
944 case AF_INET:
945 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000946#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 case AF_INET6:
948 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 default:
951 PyErr_SetString(socket_error, "unknown address family");
952 return -1;
953 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954}
955
Guido van Rossum30a685f1991-06-27 15:51:29 +0000956
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957/* Create a string object representing an IP address.
958 This is always a string of the form 'dd.dd.dd.dd' (with variable
959 size numbers). */
960
Guido van Rossum73624e91994-10-10 17:59:00 +0000961static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000962makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 char buf[NI_MAXHOST];
965 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
968 NI_NUMERICHOST);
969 if (error) {
970 set_gaierror(error);
971 return NULL;
972 }
973 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974}
975
976
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000977#ifdef USE_BLUETOOTH
978/* Convert a string representation of a Bluetooth address into a numeric
979 address. Returns the length (6), or raises an exception and returns -1 if
980 an error occurred. */
981
982static int
983setbdaddr(char *name, bdaddr_t *bdaddr)
984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 unsigned int b0, b1, b2, b3, b4, b5;
986 char ch;
987 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
990 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
991 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
992 bdaddr->b[0] = b0;
993 bdaddr->b[1] = b1;
994 bdaddr->b[2] = b2;
995 bdaddr->b[3] = b3;
996 bdaddr->b[4] = b4;
997 bdaddr->b[5] = b5;
998 return 6;
999 } else {
1000 PyErr_SetString(socket_error, "bad bluetooth address");
1001 return -1;
1002 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001003}
1004
1005/* Create a string representation of the Bluetooth address. This is always a
1006 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1007 value (zero padded if necessary). */
1008
1009static PyObject *
1010makebdaddr(bdaddr_t *bdaddr)
1011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1015 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1016 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1017 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001018}
1019#endif
1020
1021
Guido van Rossum30a685f1991-06-27 15:51:29 +00001022/* Create an object representing the given socket address,
1023 suitable for passing it back to bind(), connect() etc.
1024 The family field of the sockaddr structure is inspected
1025 to determine what kind of address it really is. */
1026
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001027/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001028static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001029makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 if (addrlen == 0) {
1032 /* No address -- may be recvfrom() from known socket */
1033 Py_INCREF(Py_None);
1034 return Py_None;
1035 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 case AF_INET:
1040 {
1041 struct sockaddr_in *a;
1042 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1043 PyObject *ret = NULL;
1044 if (addrobj) {
1045 a = (struct sockaddr_in *)addr;
1046 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1047 Py_DECREF(addrobj);
1048 }
1049 return ret;
1050 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001051
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001052#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 case AF_UNIX:
1054 {
1055 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001056#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1058 addrlen -= offsetof(struct sockaddr_un, sun_path);
1059 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1060 }
1061 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001062#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 {
1064 /* regular NULL-terminated string */
1065 return PyUnicode_FromString(a->sun_path);
1066 }
1067 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001068#endif /* AF_UNIX */
1069
Martin v. Löwis11017b12006-01-14 18:12:57 +00001070#if defined(AF_NETLINK)
1071 case AF_NETLINK:
1072 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1074 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001075 }
1076#endif /* AF_NETLINK */
1077
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001078#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 case AF_INET6:
1080 {
1081 struct sockaddr_in6 *a;
1082 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1083 PyObject *ret = NULL;
1084 if (addrobj) {
1085 a = (struct sockaddr_in6 *)addr;
1086 ret = Py_BuildValue("Oiii",
1087 addrobj,
1088 ntohs(a->sin6_port),
1089 a->sin6_flowinfo,
1090 a->sin6_scope_id);
1091 Py_DECREF(addrobj);
1092 }
1093 return ret;
1094 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001095#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case AF_BLUETOOTH:
1099 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 case BTPROTO_L2CAP:
1102 {
1103 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1104 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1105 PyObject *ret = NULL;
1106 if (addrobj) {
1107 ret = Py_BuildValue("Oi",
1108 addrobj,
1109 _BT_L2_MEMB(a, psm));
1110 Py_DECREF(addrobj);
1111 }
1112 return ret;
1113 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 case BTPROTO_RFCOMM:
1116 {
1117 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1118 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1119 PyObject *ret = NULL;
1120 if (addrobj) {
1121 ret = Py_BuildValue("Oi",
1122 addrobj,
1123 _BT_RC_MEMB(a, channel));
1124 Py_DECREF(addrobj);
1125 }
1126 return ret;
1127 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 case BTPROTO_HCI:
1130 {
1131 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001132#if defined(__NetBSD__) || defined(__DragonFly__)
1133 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1134#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 PyObject *ret = NULL;
1136 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1137 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001140
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001141#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 case BTPROTO_SCO:
1143 {
1144 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1145 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1146 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001147#endif
1148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 default:
1150 PyErr_SetString(PyExc_ValueError,
1151 "Unknown Bluetooth protocol");
1152 return NULL;
1153 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154#endif
1155
Antoine Pitroub156a462010-10-27 20:13:57 +00001156#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 case AF_PACKET:
1158 {
1159 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1160 char *ifname = "";
1161 struct ifreq ifr;
1162 /* need to look up interface name give index */
1163 if (a->sll_ifindex) {
1164 ifr.ifr_ifindex = a->sll_ifindex;
1165 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1166 ifname = ifr.ifr_name;
1167 }
1168 return Py_BuildValue("shbhy#",
1169 ifname,
1170 ntohs(a->sll_protocol),
1171 a->sll_pkttype,
1172 a->sll_hatype,
1173 a->sll_addr,
1174 a->sll_halen);
1175 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001176#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001177
Christian Heimes043d6f62008-01-07 17:19:16 +00001178#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 case AF_TIPC:
1180 {
1181 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1182 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1183 return Py_BuildValue("IIIII",
1184 a->addrtype,
1185 a->addr.nameseq.type,
1186 a->addr.nameseq.lower,
1187 a->addr.nameseq.upper,
1188 a->scope);
1189 } else if (a->addrtype == TIPC_ADDR_NAME) {
1190 return Py_BuildValue("IIIII",
1191 a->addrtype,
1192 a->addr.name.name.type,
1193 a->addr.name.name.instance,
1194 a->addr.name.name.instance,
1195 a->scope);
1196 } else if (a->addrtype == TIPC_ADDR_ID) {
1197 return Py_BuildValue("IIIII",
1198 a->addrtype,
1199 a->addr.id.node,
1200 a->addr.id.ref,
1201 0,
1202 a->scope);
1203 } else {
1204 PyErr_SetString(PyExc_ValueError,
1205 "Invalid address type");
1206 return NULL;
1207 }
1208 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001209#endif
1210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 default:
1214 /* If we don't know the address family, don't raise an
1215 exception -- return it as an (int, bytes) tuple. */
1216 return Py_BuildValue("iy#",
1217 addr->sa_family,
1218 addr->sa_data,
1219 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222}
1223
Guido van Rossum30a685f1991-06-27 15:51:29 +00001224
1225/* Parse a socket address argument according to the socket object's
1226 address family. Return 1 if the address was in the proper format,
1227 0 of not. The address is returned through addr_ret, its length
1228 through len_ret. */
1229
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001231getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001235
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001236#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 case AF_UNIX:
1238 {
1239 struct sockaddr_un* addr;
1240 char *path;
1241 int len;
1242 if (!PyArg_Parse(args, "s#", &path, &len))
1243 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001246#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 if (len > 0 && path[0] == 0) {
1248 /* Linux abstract namespace extension */
1249 if (len > sizeof addr->sun_path) {
1250 PyErr_SetString(socket_error,
1251 "AF_UNIX path too long");
1252 return 0;
1253 }
1254 }
1255 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001256#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 {
1258 /* regular NULL-terminated string */
1259 if (len >= sizeof addr->sun_path) {
1260 PyErr_SetString(socket_error,
1261 "AF_UNIX path too long");
1262 return 0;
1263 }
1264 addr->sun_path[len] = 0;
1265 }
1266 addr->sun_family = s->sock_family;
1267 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001268#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001270#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 return 1;
1274 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001275#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001276
Martin v. Löwis11017b12006-01-14 18:12:57 +00001277#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 case AF_NETLINK:
1279 {
1280 struct sockaddr_nl* addr;
1281 int pid, groups;
1282 addr = (struct sockaddr_nl *)addr_ret;
1283 if (!PyTuple_Check(args)) {
1284 PyErr_Format(
1285 PyExc_TypeError,
1286 "getsockaddrarg: "
1287 "AF_NETLINK address must be tuple, not %.500s",
1288 Py_TYPE(args)->tp_name);
1289 return 0;
1290 }
1291 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1292 return 0;
1293 addr->nl_family = AF_NETLINK;
1294 addr->nl_pid = pid;
1295 addr->nl_groups = groups;
1296 *len_ret = sizeof(*addr);
1297 return 1;
1298 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001299#endif
1300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 case AF_INET:
1302 {
1303 struct sockaddr_in* addr;
1304 char *host;
1305 int port, result;
1306 if (!PyTuple_Check(args)) {
1307 PyErr_Format(
1308 PyExc_TypeError,
1309 "getsockaddrarg: "
1310 "AF_INET address must be tuple, not %.500s",
1311 Py_TYPE(args)->tp_name);
1312 return 0;
1313 }
1314 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1315 "idna", &host, &port))
1316 return 0;
1317 addr=(struct sockaddr_in*)addr_ret;
1318 result = setipaddr(host, (struct sockaddr *)addr,
1319 sizeof(*addr), AF_INET);
1320 PyMem_Free(host);
1321 if (result < 0)
1322 return 0;
1323 if (port < 0 || port > 0xffff) {
1324 PyErr_SetString(
1325 PyExc_OverflowError,
1326 "getsockaddrarg: port must be 0-65535.");
1327 return 0;
1328 }
1329 addr->sin_family = AF_INET;
1330 addr->sin_port = htons((short)port);
1331 *len_ret = sizeof *addr;
1332 return 1;
1333 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001334
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001335#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case AF_INET6:
1337 {
1338 struct sockaddr_in6* addr;
1339 char *host;
1340 int port, flowinfo, scope_id, result;
1341 flowinfo = scope_id = 0;
1342 if (!PyTuple_Check(args)) {
1343 PyErr_Format(
1344 PyExc_TypeError,
1345 "getsockaddrarg: "
1346 "AF_INET6 address must be tuple, not %.500s",
1347 Py_TYPE(args)->tp_name);
1348 return 0;
1349 }
1350 if (!PyArg_ParseTuple(args, "eti|ii",
1351 "idna", &host, &port, &flowinfo,
1352 &scope_id)) {
1353 return 0;
1354 }
1355 addr = (struct sockaddr_in6*)addr_ret;
1356 result = setipaddr(host, (struct sockaddr *)addr,
1357 sizeof(*addr), AF_INET6);
1358 PyMem_Free(host);
1359 if (result < 0)
1360 return 0;
1361 if (port < 0 || port > 0xffff) {
1362 PyErr_SetString(
1363 PyExc_OverflowError,
1364 "getsockaddrarg: port must be 0-65535.");
1365 return 0;
1366 }
1367 addr->sin6_family = s->sock_family;
1368 addr->sin6_port = htons((short)port);
1369 addr->sin6_flowinfo = flowinfo;
1370 addr->sin6_scope_id = scope_id;
1371 *len_ret = sizeof *addr;
1372 return 1;
1373 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001374#endif
1375
Hye-Shik Chang81268602004-02-02 06:05:24 +00001376#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 case AF_BLUETOOTH:
1378 {
1379 switch (s->sock_proto) {
1380 case BTPROTO_L2CAP:
1381 {
1382 struct sockaddr_l2 *addr;
1383 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 addr = (struct sockaddr_l2 *)addr_ret;
1386 memset(addr, 0, sizeof(struct sockaddr_l2));
1387 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1388 if (!PyArg_ParseTuple(args, "si", &straddr,
1389 &_BT_L2_MEMB(addr, psm))) {
1390 PyErr_SetString(socket_error, "getsockaddrarg: "
1391 "wrong format");
1392 return 0;
1393 }
1394 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1395 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 *len_ret = sizeof *addr;
1398 return 1;
1399 }
1400 case BTPROTO_RFCOMM:
1401 {
1402 struct sockaddr_rc *addr;
1403 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 addr = (struct sockaddr_rc *)addr_ret;
1406 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1407 if (!PyArg_ParseTuple(args, "si", &straddr,
1408 &_BT_RC_MEMB(addr, channel))) {
1409 PyErr_SetString(socket_error, "getsockaddrarg: "
1410 "wrong format");
1411 return 0;
1412 }
1413 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1414 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 *len_ret = sizeof *addr;
1417 return 1;
1418 }
1419 case BTPROTO_HCI:
1420 {
1421 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001422#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001423 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001424
Alexander Belopolskye239d232010-12-08 23:31:48 +00001425 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001426 if (straddr == NULL) {
1427 PyErr_SetString(socket_error, "getsockaddrarg: "
1428 "wrong format");
1429 return 0;
1430 }
1431 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1432 return 0;
1433#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1435 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1436 PyErr_SetString(socket_error, "getsockaddrarg: "
1437 "wrong format");
1438 return 0;
1439 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 *len_ret = sizeof *addr;
1442 return 1;
1443 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001444#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 case BTPROTO_SCO:
1446 {
1447 struct sockaddr_sco *addr;
1448 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 addr = (struct sockaddr_sco *)addr_ret;
1451 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1452 if (!PyBytes_Check(args)) {
1453 PyErr_SetString(socket_error, "getsockaddrarg: "
1454 "wrong format");
1455 return 0;
1456 }
1457 straddr = PyBytes_AS_STRING(args);
1458 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1459 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 *len_ret = sizeof *addr;
1462 return 1;
1463 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 default:
1466 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1467 return 0;
1468 }
1469 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001470#endif
1471
Antoine Pitroub156a462010-10-27 20:13:57 +00001472#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 case AF_PACKET:
1474 {
1475 struct sockaddr_ll* addr;
1476 struct ifreq ifr;
1477 char *interfaceName;
1478 int protoNumber;
1479 int hatype = 0;
1480 int pkttype = 0;
1481 char *haddr = NULL;
1482 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 if (!PyTuple_Check(args)) {
1485 PyErr_Format(
1486 PyExc_TypeError,
1487 "getsockaddrarg: "
1488 "AF_PACKET address must be tuple, not %.500s",
1489 Py_TYPE(args)->tp_name);
1490 return 0;
1491 }
1492 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1493 &protoNumber, &pkttype, &hatype,
1494 &haddr, &halen))
1495 return 0;
1496 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1497 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1498 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1499 s->errorhandler();
1500 return 0;
1501 }
1502 if (halen > 8) {
1503 PyErr_SetString(PyExc_ValueError,
1504 "Hardware address must be 8 bytes or less");
1505 return 0;
1506 }
1507 if (protoNumber < 0 || protoNumber > 0xffff) {
1508 PyErr_SetString(
1509 PyExc_OverflowError,
1510 "getsockaddrarg: protoNumber must be 0-65535.");
1511 return 0;
1512 }
1513 addr = (struct sockaddr_ll*)addr_ret;
1514 addr->sll_family = AF_PACKET;
1515 addr->sll_protocol = htons((short)protoNumber);
1516 addr->sll_ifindex = ifr.ifr_ifindex;
1517 addr->sll_pkttype = pkttype;
1518 addr->sll_hatype = hatype;
1519 if (halen != 0) {
1520 memcpy(&addr->sll_addr, haddr, halen);
1521 }
1522 addr->sll_halen = halen;
1523 *len_ret = sizeof *addr;
1524 return 1;
1525 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001526#endif
1527
Christian Heimes043d6f62008-01-07 17:19:16 +00001528#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 case AF_TIPC:
1530 {
1531 unsigned int atype, v1, v2, v3;
1532 unsigned int scope = TIPC_CLUSTER_SCOPE;
1533 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 if (!PyTuple_Check(args)) {
1536 PyErr_Format(
1537 PyExc_TypeError,
1538 "getsockaddrarg: "
1539 "AF_TIPC address must be tuple, not %.500s",
1540 Py_TYPE(args)->tp_name);
1541 return 0;
1542 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 if (!PyArg_ParseTuple(args,
1545 "IIII|I;Invalid TIPC address format",
1546 &atype, &v1, &v2, &v3, &scope))
1547 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 addr = (struct sockaddr_tipc *) addr_ret;
1550 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 addr->family = AF_TIPC;
1553 addr->scope = scope;
1554 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 if (atype == TIPC_ADDR_NAMESEQ) {
1557 addr->addr.nameseq.type = v1;
1558 addr->addr.nameseq.lower = v2;
1559 addr->addr.nameseq.upper = v3;
1560 } else if (atype == TIPC_ADDR_NAME) {
1561 addr->addr.name.name.type = v1;
1562 addr->addr.name.name.instance = v2;
1563 } else if (atype == TIPC_ADDR_ID) {
1564 addr->addr.id.node = v1;
1565 addr->addr.id.ref = v2;
1566 } else {
1567 /* Shouldn't happen */
1568 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1569 return 0;
1570 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 return 1;
1575 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001576#endif
1577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 default:
1581 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1582 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001585}
1586
Guido van Rossum30a685f1991-06-27 15:51:29 +00001587
Guido van Rossum48a680c2001-03-02 06:34:14 +00001588/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001589 Return 1 if the family is known, 0 otherwise. The length is returned
1590 through len_ret. */
1591
1592static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001593getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001596
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001597#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 case AF_UNIX:
1599 {
1600 *len_ret = sizeof (struct sockaddr_un);
1601 return 1;
1602 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001603#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001604#if defined(AF_NETLINK)
1605 case AF_NETLINK:
1606 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 *len_ret = sizeof (struct sockaddr_nl);
1608 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001609 }
1610#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 case AF_INET:
1613 {
1614 *len_ret = sizeof (struct sockaddr_in);
1615 return 1;
1616 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001617
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001618#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 case AF_INET6:
1620 {
1621 *len_ret = sizeof (struct sockaddr_in6);
1622 return 1;
1623 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001624#endif
1625
Hye-Shik Chang81268602004-02-02 06:05:24 +00001626#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 case AF_BLUETOOTH:
1628 {
1629 switch(s->sock_proto)
1630 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 case BTPROTO_L2CAP:
1633 *len_ret = sizeof (struct sockaddr_l2);
1634 return 1;
1635 case BTPROTO_RFCOMM:
1636 *len_ret = sizeof (struct sockaddr_rc);
1637 return 1;
1638 case BTPROTO_HCI:
1639 *len_ret = sizeof (struct sockaddr_hci);
1640 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001641#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 case BTPROTO_SCO:
1643 *len_ret = sizeof (struct sockaddr_sco);
1644 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 default:
1647 PyErr_SetString(socket_error, "getsockaddrlen: "
1648 "unknown BT protocol");
1649 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 }
1652 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001653#endif
1654
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001655#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 case AF_PACKET:
1657 {
1658 *len_ret = sizeof (struct sockaddr_ll);
1659 return 1;
1660 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001661#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001662
Christian Heimes043d6f62008-01-07 17:19:16 +00001663#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 case AF_TIPC:
1665 {
1666 *len_ret = sizeof (struct sockaddr_tipc);
1667 return 1;
1668 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001669#endif
1670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 default:
1674 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1675 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001678}
1679
1680
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001681/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682
Guido van Rossum73624e91994-10-10 17:59:00 +00001683static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001684sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 sock_addr_t addrbuf;
1687 SOCKET_T newfd = INVALID_SOCKET;
1688 socklen_t addrlen;
1689 PyObject *sock = NULL;
1690 PyObject *addr = NULL;
1691 PyObject *res = NULL;
1692 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 if (!getsockaddrlen(s, &addrlen))
1694 return NULL;
1695 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 if (!IS_SELECTABLE(s))
1698 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001699
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001700 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001702 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001703 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 if (timeout == 1) {
1709 PyErr_SetString(socket_timeout, "timed out");
1710 return NULL;
1711 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001712 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 if (newfd == INVALID_SOCKET)
1715 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 sock = PyLong_FromSocket_t(newfd);
1718 if (sock == NULL) {
1719 SOCKETCLOSE(newfd);
1720 goto finally;
1721 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1724 addrlen, s->sock_proto);
1725 if (addr == NULL)
1726 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001729
Guido van Rossum67f7a382002-06-06 21:08:16 +00001730finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 Py_XDECREF(sock);
1732 Py_XDECREF(addr);
1733 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734}
1735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001736PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001737"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001738\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001739Wait for an incoming connection. Return a new socket file descriptor\n\
1740representing the connection, and the address of the client.\n\
1741For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742
Guido van Rossum11ba0942002-06-13 15:07:44 +00001743/* s.setblocking(flag) method. Argument:
1744 False -- non-blocking mode; same as settimeout(0)
1745 True -- blocking mode; same as settimeout(None)
1746*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001747
Guido van Rossum73624e91994-10-10 17:59:00 +00001748static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001749sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 block = PyLong_AsLong(arg);
1754 if (block == -1 && PyErr_Occurred())
1755 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 s->sock_timeout = block ? -1.0 : 0.0;
1758 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 Py_INCREF(Py_None);
1761 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001762}
Guido van Rossume4485b01994-09-07 14:32:49 +00001763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001764PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001765"setblocking(flag)\n\
1766\n\
1767Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001768setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001769setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001770
Guido van Rossum11ba0942002-06-13 15:07:44 +00001771/* s.settimeout(timeout) method. Argument:
1772 None -- no timeout, blocking mode; same as setblocking(True)
1773 0.0 -- non-blocking mode; same as setblocking(False)
1774 > 0 -- timeout mode; operations time out after timeout seconds
1775 < 0 -- illegal; raises an exception
1776*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001778sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 if (arg == Py_None)
1783 timeout = -1.0;
1784 else {
1785 timeout = PyFloat_AsDouble(arg);
1786 if (timeout < 0.0) {
1787 if (!PyErr_Occurred())
1788 PyErr_SetString(PyExc_ValueError,
1789 "Timeout value out of range");
1790 return NULL;
1791 }
1792 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 s->sock_timeout = timeout;
1795 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 Py_INCREF(Py_None);
1798 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001799}
1800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001801PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001802"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001803\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001804Set a timeout on socket operations. 'timeout' can be a float,\n\
1805giving in seconds, or None. Setting a timeout of None disables\n\
1806the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001807Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001808
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001809/* s.gettimeout() method.
1810 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001811static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001812sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (s->sock_timeout < 0.0) {
1815 Py_INCREF(Py_None);
1816 return Py_None;
1817 }
1818 else
1819 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001820}
1821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001822PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001823"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001824\n\
1825Returns the timeout in floating seconds associated with socket \n\
1826operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001827operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001828
Guido van Rossumaee08791992-09-08 09:05:33 +00001829/* s.setsockopt() method.
1830 With an integer third argument, sets an integer option.
1831 With a string third argument, sets an option from a buffer;
1832 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001833
Guido van Rossum73624e91994-10-10 17:59:00 +00001834static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001835sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 int level;
1838 int optname;
1839 int res;
1840 char *buf;
1841 int buflen;
1842 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 if (PyArg_ParseTuple(args, "iii:setsockopt",
1845 &level, &optname, &flag)) {
1846 buf = (char *) &flag;
1847 buflen = sizeof flag;
1848 }
1849 else {
1850 PyErr_Clear();
1851 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
1852 &level, &optname, &buf, &buflen))
1853 return NULL;
1854 }
1855 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1856 if (res < 0)
1857 return s->errorhandler();
1858 Py_INCREF(Py_None);
1859 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001860}
1861
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001862PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001863"setsockopt(level, option, value)\n\
1864\n\
1865Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001866The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001867
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001868
Guido van Rossumaee08791992-09-08 09:05:33 +00001869/* s.getsockopt() method.
1870 With two arguments, retrieves an integer option.
1871 With a third integer argument, retrieves a string buffer of that size;
1872 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001873
Guido van Rossum73624e91994-10-10 17:59:00 +00001874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001875sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 int level;
1878 int optname;
1879 int res;
1880 PyObject *buf;
1881 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1884 &level, &optname, &buflen))
1885 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 if (buflen == 0) {
1888 int flag = 0;
1889 socklen_t flagsize = sizeof flag;
1890 res = getsockopt(s->sock_fd, level, optname,
1891 (void *)&flag, &flagsize);
1892 if (res < 0)
1893 return s->errorhandler();
1894 return PyLong_FromLong(flag);
1895 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001896#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 /* socklen_t is unsigned so no negative test is needed,
1898 test buflen == 0 is previously done */
1899 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001900#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 PyErr_SetString(socket_error,
1904 "getsockopt buflen out of range");
1905 return NULL;
1906 }
1907 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
1908 if (buf == NULL)
1909 return NULL;
1910 res = getsockopt(s->sock_fd, level, optname,
1911 (void *)PyBytes_AS_STRING(buf), &buflen);
1912 if (res < 0) {
1913 Py_DECREF(buf);
1914 return s->errorhandler();
1915 }
1916 _PyBytes_Resize(&buf, buflen);
1917 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001918}
1919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001920PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001921"getsockopt(level, option[, buffersize]) -> value\n\
1922\n\
1923Get a socket option. See the Unix manual for level and option.\n\
1924If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001925string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001926
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001927
Fred Drake728819a2000-07-01 03:40:12 +00001928/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001929
Guido van Rossum73624e91994-10-10 17:59:00 +00001930static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001931sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 sock_addr_t addrbuf;
1934 int addrlen;
1935 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1938 return NULL;
1939 Py_BEGIN_ALLOW_THREADS
1940 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1941 Py_END_ALLOW_THREADS
1942 if (res < 0)
1943 return s->errorhandler();
1944 Py_INCREF(Py_None);
1945 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001946}
1947
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001948PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001949"bind(address)\n\
1950\n\
1951Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001952pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001953sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001954
Guido van Rossum30a685f1991-06-27 15:51:29 +00001955
1956/* s.close() method.
1957 Set the file descriptor to -1 so operations tried subsequently
1958 will surely fail. */
1959
Guido van Rossum73624e91994-10-10 17:59:00 +00001960static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001961sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 if ((fd = s->sock_fd) != -1) {
1966 s->sock_fd = -1;
1967 Py_BEGIN_ALLOW_THREADS
1968 (void) SOCKETCLOSE(fd);
1969 Py_END_ALLOW_THREADS
1970 }
1971 Py_INCREF(Py_None);
1972 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001973}
1974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001976"close()\n\
1977\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001979
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001980static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001981sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001982{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001983 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001984 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001985 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001986}
1987
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001988PyDoc_STRVAR(detach_doc,
1989"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001990\n\
1991Close the socket object without closing the underlying file descriptor.\
1992The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001993can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001994
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001995static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001996internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 timeout = 0;
2002 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002003
2004#ifdef MS_WINDOWS
2005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 if (s->sock_timeout > 0.0) {
2007 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2008 IS_SELECTABLE(s)) {
2009 /* This is a mess. Best solution: trust select */
2010 fd_set fds;
2011 fd_set fds_exc;
2012 struct timeval tv;
2013 tv.tv_sec = (int)s->sock_timeout;
2014 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2015 FD_ZERO(&fds);
2016 FD_SET(s->sock_fd, &fds);
2017 FD_ZERO(&fds_exc);
2018 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002019 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2020 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (res == 0) {
2022 res = WSAEWOULDBLOCK;
2023 timeout = 1;
2024 } else if (res > 0) {
2025 if (FD_ISSET(s->sock_fd, &fds))
2026 /* The socket is in the writable set - this
2027 means connected */
2028 res = 0;
2029 else {
2030 /* As per MS docs, we need to call getsockopt()
2031 to get the underlying error */
2032 int res_size = sizeof res;
2033 /* It must be in the exception set */
2034 assert(FD_ISSET(s->sock_fd, &fds_exc));
2035 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2036 (char *)&res, &res_size))
2037 /* getsockopt also clears WSAGetLastError,
2038 so reset it back. */
2039 WSASetLastError(res);
2040 else
2041 res = WSAGetLastError();
2042 }
2043 }
2044 /* else if (res < 0) an error occurred */
2045 }
2046 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 if (res < 0)
2049 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002050
2051#else
2052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (s->sock_timeout > 0.0) {
2054 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2055 timeout = internal_select(s, 1);
2056 if (timeout == 0) {
2057 /* Bug #1019808: in case of an EINPROGRESS,
2058 use getsockopt(SO_ERROR) to get the real
2059 error. */
2060 socklen_t res_size = sizeof res;
2061 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2062 SO_ERROR, &res, &res_size);
2063 if (res == EISCONN)
2064 res = 0;
2065 errno = res;
2066 }
2067 else if (timeout == -1) {
2068 res = errno; /* had error */
2069 }
2070 else
2071 res = EWOULDBLOCK; /* timed out */
2072 }
2073 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (res < 0)
2076 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002077
2078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002082}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002083
Fred Drake728819a2000-07-01 03:40:12 +00002084/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002085
Guido van Rossum73624e91994-10-10 17:59:00 +00002086static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002087sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 sock_addr_t addrbuf;
2090 int addrlen;
2091 int res;
2092 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2095 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 Py_BEGIN_ALLOW_THREADS
2098 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2099 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 if (timeout == 1) {
2102 PyErr_SetString(socket_timeout, "timed out");
2103 return NULL;
2104 }
2105 if (res != 0)
2106 return s->errorhandler();
2107 Py_INCREF(Py_None);
2108 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002109}
2110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002111PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002112"connect(address)\n\
2113\n\
2114Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002115is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002116
Guido van Rossum30a685f1991-06-27 15:51:29 +00002117
Fred Drake728819a2000-07-01 03:40:12 +00002118/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002119
2120static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002121sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 sock_addr_t addrbuf;
2124 int addrlen;
2125 int res;
2126 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2129 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 Py_BEGIN_ALLOW_THREADS
2132 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2133 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 /* Signals are not errors (though they may raise exceptions). Adapted
2136 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002137#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 if (res == EINTR && PyErr_CheckSignals())
2139 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002140#endif
2141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002143}
2144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002145PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002146"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002147\n\
2148This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002149instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002150
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002151
Guido van Rossumed233a51992-06-23 09:07:03 +00002152/* s.fileno() method */
2153
Guido van Rossum73624e91994-10-10 17:59:00 +00002154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002155sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002158}
2159
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002160PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002161"fileno() -> integer\n\
2162\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002163Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002164
Guido van Rossumed233a51992-06-23 09:07:03 +00002165
Guido van Rossumc89705d1992-11-26 08:54:07 +00002166/* s.getsockname() method */
2167
Guido van Rossum73624e91994-10-10 17:59:00 +00002168static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002169sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 sock_addr_t addrbuf;
2172 int res;
2173 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 if (!getsockaddrlen(s, &addrlen))
2176 return NULL;
2177 memset(&addrbuf, 0, addrlen);
2178 Py_BEGIN_ALLOW_THREADS
2179 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2180 Py_END_ALLOW_THREADS
2181 if (res < 0)
2182 return s->errorhandler();
2183 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2184 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002185}
2186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188"getsockname() -> address info\n\
2189\n\
2190Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002191info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002192
Guido van Rossumc89705d1992-11-26 08:54:07 +00002193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002195/* s.getpeername() method */
2196
Guido van Rossum73624e91994-10-10 17:59:00 +00002197static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002198sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 sock_addr_t addrbuf;
2201 int res;
2202 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 if (!getsockaddrlen(s, &addrlen))
2205 return NULL;
2206 memset(&addrbuf, 0, addrlen);
2207 Py_BEGIN_ALLOW_THREADS
2208 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2209 Py_END_ALLOW_THREADS
2210 if (res < 0)
2211 return s->errorhandler();
2212 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2213 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002214}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002216PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002217"getpeername() -> address info\n\
2218\n\
2219Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002220info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002221
Guido van Rossumb6775db1994-08-01 11:34:53 +00002222#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002223
2224
Guido van Rossum30a685f1991-06-27 15:51:29 +00002225/* s.listen(n) method */
2226
Guido van Rossum73624e91994-10-10 17:59:00 +00002227static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002228sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 int backlog;
2231 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 backlog = PyLong_AsLong(arg);
2234 if (backlog == -1 && PyErr_Occurred())
2235 return NULL;
2236 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002237 /* To avoid problems on systems that don't allow a negative backlog
2238 * (which doesn't make sense anyway) we force a minimum value of 0. */
2239 if (backlog < 0)
2240 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 res = listen(s->sock_fd, backlog);
2242 Py_END_ALLOW_THREADS
2243 if (res < 0)
2244 return s->errorhandler();
2245 Py_INCREF(Py_None);
2246 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002247}
2248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002249PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002250"listen(backlog)\n\
2251\n\
2252Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002253least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2254unaccepted connections that the system will allow before refusing new\n\
2255connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002256
2257
Thomas Wouters477c8d52006-05-27 19:21:47 +00002258/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002259 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002260 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002261 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002262 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002263 * also possible that we return a number of bytes smaller than the request
2264 * bytes.
2265 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002266
Antoine Pitrou19467d22010-08-17 19:33:30 +00002267static Py_ssize_t
2268sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002269{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002270 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002272#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 int remaining;
2274 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002275#endif
2276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 if (!IS_SELECTABLE(s)) {
2278 select_error();
2279 return -1;
2280 }
2281 if (len == 0) {
2282 /* If 0 bytes were requested, do nothing. */
2283 return 0;
2284 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002285
2286#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002287 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002289 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 if (!timeout)
2291 outlen = recv(s->sock_fd, cbuf, len, flags);
2292 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 if (timeout == 1) {
2295 PyErr_SetString(socket_timeout, "timed out");
2296 return -1;
2297 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002298 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 if (outlen < 0) {
2300 /* Note: the call to errorhandler() ALWAYS indirectly returned
2301 NULL, so ignore its return value */
2302 s->errorhandler();
2303 return -1;
2304 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002305#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 read_buf = cbuf;
2307 remaining = len;
2308 while (remaining != 0) {
2309 unsigned int segment;
2310 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 segment = remaining /SEGMENT_SIZE;
2313 if (segment != 0) {
2314 segment = SEGMENT_SIZE;
2315 }
2316 else {
2317 segment = remaining;
2318 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002319
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002320 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002322 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 if (!timeout)
2324 nread = recv(s->sock_fd, read_buf, segment, flags);
2325 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 if (timeout == 1) {
2327 PyErr_SetString(socket_timeout, "timed out");
2328 return -1;
2329 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002330 END_SELECT_LOOP(s)
2331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 if (nread < 0) {
2333 s->errorhandler();
2334 return -1;
2335 }
2336 if (nread != remaining) {
2337 read_buf += nread;
2338 break;
2339 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 remaining -= segment;
2342 read_buf += segment;
2343 }
2344 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002345#endif /* !__VMS */
2346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002348}
2349
Guido van Rossum48a680c2001-03-02 06:34:14 +00002350
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002351/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002352
Guido van Rossum73624e91994-10-10 17:59:00 +00002353static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002354sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002355{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002356 Py_ssize_t recvlen, outlen;
2357 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002359
Antoine Pitrou19467d22010-08-17 19:33:30 +00002360 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 if (recvlen < 0) {
2364 PyErr_SetString(PyExc_ValueError,
2365 "negative buffersize in recv");
2366 return NULL;
2367 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 /* Allocate a new string. */
2370 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2371 if (buf == NULL)
2372 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 /* Call the guts */
2375 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2376 if (outlen < 0) {
2377 /* An error occurred, release the string and return an
2378 error. */
2379 Py_DECREF(buf);
2380 return NULL;
2381 }
2382 if (outlen != recvlen) {
2383 /* We did not read as many bytes as we anticipated, resize the
2384 string if possible and be successful. */
2385 _PyBytes_Resize(&buf, outlen);
2386 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002389}
2390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002392"recv(buffersize[, flags]) -> data\n\
2393\n\
2394Receive up to buffersize bytes from the socket. For the optional flags\n\
2395argument, see the Unix manual. When no data is available, block until\n\
2396at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002397the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002398
Guido van Rossum30a685f1991-06-27 15:51:29 +00002399
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002400/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002401
Thomas Wouters477c8d52006-05-27 19:21:47 +00002402static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002403sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002406
Antoine Pitrou19467d22010-08-17 19:33:30 +00002407 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 Py_buffer pbuf;
2409 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002410 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002413 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 &pbuf, &recvlen, &flags))
2415 return NULL;
2416 buf = pbuf.buf;
2417 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 if (recvlen < 0) {
2420 PyBuffer_Release(&pbuf);
2421 PyErr_SetString(PyExc_ValueError,
2422 "negative buffersize in recv_into");
2423 return NULL;
2424 }
2425 if (recvlen == 0) {
2426 /* If nbytes was not specified, use the buffer's length */
2427 recvlen = buflen;
2428 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 /* Check if the buffer is large enough */
2431 if (buflen < recvlen) {
2432 PyBuffer_Release(&pbuf);
2433 PyErr_SetString(PyExc_ValueError,
2434 "buffer too small for requested bytes");
2435 return NULL;
2436 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 /* Call the guts */
2439 readlen = sock_recv_guts(s, buf, recvlen, flags);
2440 if (readlen < 0) {
2441 /* Return an error. */
2442 PyBuffer_Release(&pbuf);
2443 return NULL;
2444 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 PyBuffer_Release(&pbuf);
2447 /* Return the number of bytes read. Note that we do not do anything
2448 special here in the case that readlen < recvlen. */
2449 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002450}
2451
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002452PyDoc_STRVAR(recv_into_doc,
2453"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002454\n\
2455A version of recv() that stores its data into a buffer rather than creating \n\
2456a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2457is not specified (or 0), receive up to the size available in the given buffer.\n\
2458\n\
2459See recv() for documentation about the flags.");
2460
2461
2462/*
Christian Heimes99170a52007-12-19 02:07:34 +00002463 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2464 * into a char buffer. If you have any inc/def ref to do to the objects that
2465 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002466 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002467 * that it is also possible that we return a number of bytes smaller than the
2468 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002469 *
2470 * 'addr' is a return value for the address object. Note that you must decref
2471 * it yourself.
2472 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002473static Py_ssize_t
2474sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 sock_addr_t addrbuf;
2478 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002479 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 if (!getsockaddrlen(s, &addrlen))
2485 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 if (!IS_SELECTABLE(s)) {
2488 select_error();
2489 return -1;
2490 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002491
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002492 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 Py_BEGIN_ALLOW_THREADS
2494 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002495 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002497#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002498#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 n = recvfrom(s->sock_fd, cbuf, len, flags,
2500 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002501#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 n = recvfrom(s->sock_fd, cbuf, len, flags,
2503 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002504#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002505#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 n = recvfrom(s->sock_fd, cbuf, len, flags,
2507 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 }
2510 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 if (timeout == 1) {
2513 PyErr_SetString(socket_timeout, "timed out");
2514 return -1;
2515 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002516 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (n < 0) {
2518 s->errorhandler();
2519 return -1;
2520 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2523 addrlen, s->sock_proto)))
2524 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002527}
2528
2529/* s.recvfrom(nbytes [,flags]) method */
2530
2531static PyObject *
2532sock_recvfrom(PySocketSockObject *s, PyObject *args)
2533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 PyObject *buf = NULL;
2535 PyObject *addr = NULL;
2536 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002537 int flags = 0;
2538 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539
Antoine Pitrou19467d22010-08-17 19:33:30 +00002540 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 if (recvlen < 0) {
2544 PyErr_SetString(PyExc_ValueError,
2545 "negative buffersize in recvfrom");
2546 return NULL;
2547 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2550 if (buf == NULL)
2551 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2554 recvlen, flags, &addr);
2555 if (outlen < 0) {
2556 goto finally;
2557 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (outlen != recvlen) {
2560 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002561 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002563 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 goto finally;
2565 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002568
2569finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 Py_XDECREF(buf);
2571 Py_XDECREF(addr);
2572 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2577\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002578Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579
Thomas Wouters477c8d52006-05-27 19:21:47 +00002580
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002581/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002582
2583static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002584sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587
Antoine Pitrou19467d22010-08-17 19:33:30 +00002588 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 Py_buffer pbuf;
2590 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002591 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002594
Antoine Pitrou19467d22010-08-17 19:33:30 +00002595 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 kwlist, &pbuf,
2597 &recvlen, &flags))
2598 return NULL;
2599 buf = pbuf.buf;
2600 buflen = pbuf.len;
2601 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (recvlen < 0) {
2604 PyBuffer_Release(&pbuf);
2605 PyErr_SetString(PyExc_ValueError,
2606 "negative buffersize in recvfrom_into");
2607 return NULL;
2608 }
2609 if (recvlen == 0) {
2610 /* If nbytes was not specified, use the buffer's length */
2611 recvlen = buflen;
2612 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2615 if (readlen < 0) {
2616 PyBuffer_Release(&pbuf);
2617 /* Return an error */
2618 Py_XDECREF(addr);
2619 return NULL;
2620 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 PyBuffer_Release(&pbuf);
2623 /* Return the number of bytes read and the address. Note that we do
2624 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002625 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002626}
2627
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002628PyDoc_STRVAR(recvfrom_into_doc,
2629"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002630\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002631Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002632
2633
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002634/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002635
Guido van Rossum73624e91994-10-10 17:59:00 +00002636static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002637sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002640 Py_ssize_t len, n = -1;
2641 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
2645 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (!IS_SELECTABLE(s)) {
2648 PyBuffer_Release(&pbuf);
2649 return select_error();
2650 }
2651 buf = pbuf.buf;
2652 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002653
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002654 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002656 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002658#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002660#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002665 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 PyErr_SetString(socket_timeout, "timed out");
2667 return NULL;
2668 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002669 END_SELECT_LOOP(s)
2670
2671 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 if (n < 0)
2673 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00002674 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002675}
2676
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002677PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002678"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002679\n\
2680Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002681argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002682sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002683
2684
2685/* s.sendall(data [,flags]) method */
2686
2687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002688sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002691 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002692 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
2696 return NULL;
2697 buf = pbuf.buf;
2698 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 if (!IS_SELECTABLE(s)) {
2701 PyBuffer_Release(&pbuf);
2702 return select_error();
2703 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002706 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 timeout = internal_select(s, 1);
2708 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002709 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002710#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002711 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002712#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002713 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002714#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002715 }
2716 Py_END_ALLOW_THREADS
2717 if (timeout == 1) {
2718 PyBuffer_Release(&pbuf);
2719 PyErr_SetString(socket_timeout, "timed out");
2720 return NULL;
2721 }
2722 /* PyErr_CheckSignals() might change errno */
2723 saved_errno = errno;
2724 /* We must run our signal handlers before looping again.
2725 send() can return a successful partial write when it is
2726 interrupted, so we can't restrict ourselves to EINTR. */
2727 if (PyErr_CheckSignals()) {
2728 PyBuffer_Release(&pbuf);
2729 return NULL;
2730 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002732 /* If interrupted, try again */
2733 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002735 else
2736 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 }
2738 buf += n;
2739 len -= n;
2740 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 if (n < 0)
2744 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 Py_INCREF(Py_None);
2747 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002748}
2749
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002750PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002751"sendall(data[, flags])\n\
2752\n\
2753Send a data string to the socket. For the optional flags\n\
2754argument, see the Unix manual. This calls send() repeatedly\n\
2755until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002756to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002757
Guido van Rossum30a685f1991-06-27 15:51:29 +00002758
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002759/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002760
Guido van Rossum73624e91994-10-10 17:59:00 +00002761static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 Py_buffer pbuf;
2765 PyObject *addro;
2766 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01002767 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 sock_addr_t addrbuf;
2769 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01002772 arglen = PyTuple_Size(args);
2773 switch (arglen) {
2774 case 2:
2775 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
2776 break;
2777 case 3:
2778 PyArg_ParseTuple(args, "y*iO:sendto",
2779 &pbuf, &flags, &addro);
2780 break;
2781 default:
2782 PyErr_Format(PyExc_TypeError,
2783 "sendto() takes 2 or 3 arguments (%d given)",
2784 arglen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01002786 if (PyErr_Occurred())
2787 return NULL;
2788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 buf = pbuf.buf;
2790 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 if (!IS_SELECTABLE(s)) {
2793 PyBuffer_Release(&pbuf);
2794 return select_error();
2795 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2798 PyBuffer_Release(&pbuf);
2799 return NULL;
2800 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002801
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002802 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002804 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 if (!timeout)
2806 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2807 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002810 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 PyErr_SetString(socket_timeout, "timed out");
2812 return NULL;
2813 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002814 END_SELECT_LOOP(s)
2815 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 if (n < 0)
2817 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00002818 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002819}
2820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002821PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002822"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002823\n\
2824Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002825For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002826
Guido van Rossum30a685f1991-06-27 15:51:29 +00002827
2828/* s.shutdown(how) method */
2829
Guido van Rossum73624e91994-10-10 17:59:00 +00002830static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002831sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 int how;
2834 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 how = PyLong_AsLong(arg);
2837 if (how == -1 && PyErr_Occurred())
2838 return NULL;
2839 Py_BEGIN_ALLOW_THREADS
2840 res = shutdown(s->sock_fd, how);
2841 Py_END_ALLOW_THREADS
2842 if (res < 0)
2843 return s->errorhandler();
2844 Py_INCREF(Py_None);
2845 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002846}
2847
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002848PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002849"shutdown(flag)\n\
2850\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002851Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2852of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002853
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00002854#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00002855static PyObject*
2856sock_ioctl(PySocketSockObject *s, PyObject *arg)
2857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 unsigned long cmd = SIO_RCVALL;
2859 PyObject *argO;
2860 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00002861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2863 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 switch (cmd) {
2866 case SIO_RCVALL: {
2867 unsigned int option = RCVALL_ON;
2868 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2869 return NULL;
2870 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2871 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2872 return set_error();
2873 }
2874 return PyLong_FromUnsignedLong(recv); }
2875 case SIO_KEEPALIVE_VALS: {
2876 struct tcp_keepalive ka;
2877 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2878 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2879 return NULL;
2880 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2881 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2882 return set_error();
2883 }
2884 return PyLong_FromUnsignedLong(recv); }
2885 default:
2886 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2887 return NULL;
2888 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00002889}
2890PyDoc_STRVAR(sock_ioctl_doc,
2891"ioctl(cmd, option) -> long\n\
2892\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00002893Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2894SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2895SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00002896
2897#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002898
2899/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002900
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
2903 accept_doc},
2904 {"bind", (PyCFunction)sock_bind, METH_O,
2905 bind_doc},
2906 {"close", (PyCFunction)sock_close, METH_NOARGS,
2907 close_doc},
2908 {"connect", (PyCFunction)sock_connect, METH_O,
2909 connect_doc},
2910 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2911 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002912 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
2913 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2915 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002916#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 {"getpeername", (PyCFunction)sock_getpeername,
2918 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 {"getsockname", (PyCFunction)sock_getsockname,
2921 METH_NOARGS, getsockname_doc},
2922 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2923 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00002924#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2926 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00002927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 {"listen", (PyCFunction)sock_listen, METH_O,
2929 listen_doc},
2930 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2931 recv_doc},
2932 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2933 recv_into_doc},
2934 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2935 recvfrom_doc},
2936 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2937 recvfrom_into_doc},
2938 {"send", (PyCFunction)sock_send, METH_VARARGS,
2939 send_doc},
2940 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2941 sendall_doc},
2942 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2943 sendto_doc},
2944 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2945 setblocking_doc},
2946 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2947 settimeout_doc},
2948 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2949 gettimeout_doc},
2950 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2951 setsockopt_doc},
2952 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2953 shutdown_doc},
2954 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002955};
2956
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002957/* SockObject members */
2958static PyMemberDef sock_memberlist[] = {
2959 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2960 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2961 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2962 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2963 {0},
2964};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002965
Guido van Rossum73624e91994-10-10 17:59:00 +00002966/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002967 First close the file description. */
2968
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002969static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002970sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002971{
Antoine Pitroue033e062010-10-29 10:38:18 +00002972 if (s->sock_fd != -1) {
2973 PyObject *exc, *val, *tb;
2974 Py_ssize_t old_refcount = Py_REFCNT(s);
2975 ++Py_REFCNT(s);
2976 PyErr_Fetch(&exc, &val, &tb);
2977 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
2978 "unclosed %R", s))
2979 /* Spurious errors can appear at shutdown */
2980 if (PyErr_ExceptionMatches(PyExc_Warning))
2981 PyErr_WriteUnraisable((PyObject *) s);
2982 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00002984 Py_REFCNT(s) = old_refcount;
2985 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002987}
2988
Guido van Rossum30a685f1991-06-27 15:51:29 +00002989
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002990static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002991sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002992{
Fred Drakea04eaad2000-06-30 02:46:07 +00002993#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 if (s->sock_fd > LONG_MAX) {
2995 /* this can occur on Win64, and actually there is a special
2996 ugly printf formatter for decimal pointer length integer
2997 printing, only bother if necessary*/
2998 PyErr_SetString(PyExc_OverflowError,
2999 "no printf formatter to display "
3000 "the socket descriptor in decimal");
3001 return NULL;
3002 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 return PyUnicode_FromFormat(
3005 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3006 (long)s->sock_fd, s->sock_family,
3007 s->sock_type,
3008 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003009}
3010
3011
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003012/* Create a new, uninitialized socket object. */
3013
3014static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003015sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 new = type->tp_alloc(type, 0);
3020 if (new != NULL) {
3021 ((PySocketSockObject *)new)->sock_fd = -1;
3022 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3023 ((PySocketSockObject *)new)->errorhandler = &set_error;
3024 }
3025 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003026}
3027
3028
3029/* Initialize a new socket object. */
3030
3031/*ARGSUSED*/
3032static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003033sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 PySocketSockObject *s = (PySocketSockObject *)self;
3036 PyObject *fdobj = NULL;
3037 SOCKET_T fd = INVALID_SOCKET;
3038 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3039 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3042 "|iiiO:socket", keywords,
3043 &family, &type, &proto, &fdobj))
3044 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 if (fdobj != NULL && fdobj != Py_None) {
3047 fd = PyLong_AsSocket_t(fdobj);
3048 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3049 return -1;
3050 if (fd == INVALID_SOCKET) {
3051 PyErr_SetString(PyExc_ValueError,
3052 "can't use invalid socket value");
3053 return -1;
3054 }
3055 }
3056 else {
3057 Py_BEGIN_ALLOW_THREADS
3058 fd = socket(family, type, proto);
3059 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 if (fd == INVALID_SOCKET) {
3062 set_error();
3063 return -1;
3064 }
3065 }
3066 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003069
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003070}
3071
3072
Guido van Rossumb6775db1994-08-01 11:34:53 +00003073/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003074
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003075static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3077 "_socket.socket", /* tp_name */
3078 sizeof(PySocketSockObject), /* tp_basicsize */
3079 0, /* tp_itemsize */
3080 (destructor)sock_dealloc, /* tp_dealloc */
3081 0, /* tp_print */
3082 0, /* tp_getattr */
3083 0, /* tp_setattr */
3084 0, /* tp_reserved */
3085 (reprfunc)sock_repr, /* tp_repr */
3086 0, /* tp_as_number */
3087 0, /* tp_as_sequence */
3088 0, /* tp_as_mapping */
3089 0, /* tp_hash */
3090 0, /* tp_call */
3091 0, /* tp_str */
3092 PyObject_GenericGetAttr, /* tp_getattro */
3093 0, /* tp_setattro */
3094 0, /* tp_as_buffer */
3095 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3096 sock_doc, /* tp_doc */
3097 0, /* tp_traverse */
3098 0, /* tp_clear */
3099 0, /* tp_richcompare */
3100 0, /* tp_weaklistoffset */
3101 0, /* tp_iter */
3102 0, /* tp_iternext */
3103 sock_methods, /* tp_methods */
3104 sock_memberlist, /* tp_members */
3105 0, /* tp_getset */
3106 0, /* tp_base */
3107 0, /* tp_dict */
3108 0, /* tp_descr_get */
3109 0, /* tp_descr_set */
3110 0, /* tp_dictoffset */
3111 sock_initobj, /* tp_init */
3112 PyType_GenericAlloc, /* tp_alloc */
3113 sock_new, /* tp_new */
3114 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003115};
3116
Guido van Rossum30a685f1991-06-27 15:51:29 +00003117
Guido van Rossum81194471991-07-27 21:42:02 +00003118/* Python interface to gethostname(). */
3119
3120/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003121static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003122socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003123{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003124#ifdef MS_WINDOWS
3125 /* Don't use winsock's gethostname, as this returns the ANSI
3126 version of the hostname, whereas we need a Unicode string.
3127 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003128 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
3129 DWORD size = sizeof(buf) / sizeof(wchar_t);
3130 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003131 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3132 if (GetLastError() == ERROR_MORE_DATA) {
3133 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003134 if (size == 0) /* XXX: I'm not sure how to handle this */
3135 return PyUnicode_FromUnicode(NULL, 0);
3136 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003137 if (!result)
3138 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003139 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3140 PyUnicode_AS_UNICODE(result),
3141 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003142 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003143 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003144 }
3145 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3146 }
3147 return PyUnicode_FromUnicode(buf, size);
3148#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 char buf[1024];
3150 int res;
3151 Py_BEGIN_ALLOW_THREADS
3152 res = gethostname(buf, (int) sizeof buf - 1);
3153 Py_END_ALLOW_THREADS
3154 if (res < 0)
3155 return set_error();
3156 buf[sizeof buf - 1] = '\0';
3157 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003158#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003159}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003161PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003162"gethostname() -> string\n\
3163\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003164Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003165
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003166#ifdef HAVE_SETHOSTNAME
3167PyDoc_STRVAR(sethostname_doc,
3168"sethostname(name)\n\n\
3169Sets the hostname to name.");
3170
3171static PyObject *
3172socket_sethostname(PyObject *self, PyObject *args)
3173{
3174 PyObject *hnobj;
3175 Py_buffer buf;
3176 int res, flag = 0;
3177
3178 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3179 PyErr_Clear();
3180 if (!PyArg_ParseTuple(args, "O&:sethostname",
3181 PyUnicode_FSConverter, &hnobj))
3182 return NULL;
3183 flag = 1;
3184 }
3185 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3186 if (!res) {
3187 res = sethostname(buf.buf, buf.len);
3188 PyBuffer_Release(&buf);
3189 }
3190 if (flag)
3191 Py_DECREF(hnobj);
3192 if (res)
3193 return set_error();
3194 Py_RETURN_NONE;
3195}
3196#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003197
Guido van Rossum30a685f1991-06-27 15:51:29 +00003198/* Python interface to gethostbyname(name). */
3199
3200/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003201static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003202socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 char *name;
3205 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003206 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003207
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003208 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 return NULL;
3210 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003211 goto finally;
3212 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3213finally:
3214 PyMem_Free(name);
3215 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003216}
3217
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003218PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003219"gethostbyname(host) -> address\n\
3220\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003221Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003222
3223
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003224/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3225
3226static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003227gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 char **pch;
3230 PyObject *rtn_tuple = (PyObject *)NULL;
3231 PyObject *name_list = (PyObject *)NULL;
3232 PyObject *addr_list = (PyObject *)NULL;
3233 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 if (h == NULL) {
3236 /* Let's get real error message to return */
3237 set_herror(h_errno);
3238 return NULL;
3239 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (h->h_addrtype != af) {
3242 /* Let's get real error message to return */
3243 PyErr_SetString(socket_error,
3244 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 return NULL;
3247 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 case AF_INET:
3252 if (alen < sizeof(struct sockaddr_in))
3253 return NULL;
3254 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003255
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003256#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 case AF_INET6:
3258 if (alen < sizeof(struct sockaddr_in6))
3259 return NULL;
3260 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003261#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 if ((name_list = PyList_New(0)) == NULL)
3266 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 if ((addr_list = PyList_New(0)) == NULL)
3269 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 /* SF #1511317: h_aliases can be NULL */
3272 if (h->h_aliases) {
3273 for (pch = h->h_aliases; *pch != NULL; pch++) {
3274 int status;
3275 tmp = PyUnicode_FromString(*pch);
3276 if (tmp == NULL)
3277 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 status = PyList_Append(name_list, tmp);
3280 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 if (status)
3283 goto err;
3284 }
3285 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3288 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 case AF_INET:
3293 {
3294 struct sockaddr_in sin;
3295 memset(&sin, 0, sizeof(sin));
3296 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003297#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3301 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 if (pch == h->h_addr_list && alen >= sizeof(sin))
3304 memcpy((char *) addr, &sin, sizeof(sin));
3305 break;
3306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003307
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003308#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 case AF_INET6:
3310 {
3311 struct sockaddr_in6 sin6;
3312 memset(&sin6, 0, sizeof(sin6));
3313 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003314#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3318 tmp = makeipaddr((struct sockaddr *)&sin6,
3319 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3322 memcpy((char *) addr, &sin6, sizeof(sin6));
3323 break;
3324 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003325#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 default: /* can't happen */
3328 PyErr_SetString(socket_error,
3329 "unsupported address family");
3330 return NULL;
3331 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 if (tmp == NULL)
3334 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 status = PyList_Append(addr_list, tmp);
3337 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 if (status)
3340 goto err;
3341 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003344
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003345 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 Py_XDECREF(name_list);
3347 Py_XDECREF(addr_list);
3348 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003349}
3350
3351
3352/* Python interface to gethostbyname_ex(name). */
3353
3354/*ARGSUSED*/
3355static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003356socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 char *name;
3359 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003360#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003362#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003366 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003367#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003369#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003371#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 char buf[16384];
3373 int buf_len = (sizeof buf) - 1;
3374 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003375#endif
3376#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003378#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003379#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003380
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003381 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 return NULL;
3383 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003384 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003386#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003387#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3389 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003390#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003392#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 memset((void *) &data, '\0', sizeof(data));
3394 result = gethostbyname_r(name, &hp_allocated, &data);
3395 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003396#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003397#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003398#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003402#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 Py_END_ALLOW_THREADS
3404 /* Some C libraries would require addr.__ss_family instead of
3405 addr.ss_family.
3406 Therefore, we cast the sockaddr_storage into sockaddr to
3407 access sa_family. */
3408 sa = (struct sockaddr*)&addr;
3409 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3410 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003411#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003413#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003414finally:
3415 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003417}
3418
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003419PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003420"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3421\n\
3422Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003423for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003424
3425
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003426/* Python interface to gethostbyaddr(IP). */
3427
3428/*ARGSUSED*/
3429static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003430socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003431{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003432#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003434#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 struct sockaddr *sa = (struct sockaddr *)&addr;
3438 char *ip_num;
3439 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003440 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003441#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003443#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003445#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 /* glibcs up to 2.10 assume that the buf argument to
3447 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3448 does not ensure. The attribute below instructs the compiler
3449 to maintain this alignment. */
3450 char buf[16384] Py_ALIGNED(8);
3451 int buf_len = (sizeof buf) - 1;
3452 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003453#endif
3454#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003456#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003457#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 char *ap;
3459 int al;
3460 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003461
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003462 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 return NULL;
3464 af = AF_UNSPEC;
3465 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003466 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 af = sa->sa_family;
3468 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00003469 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 switch (af) {
3471 case AF_INET:
3472 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3473 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3474 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003475#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003476 case AF_INET6:
3477 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3478 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3479 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003481 default:
3482 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003483 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 }
3485 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003486#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003487#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 result = gethostbyaddr_r(ap, al, af,
3489 &hp_allocated, buf, buf_len,
3490 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003491#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 h = gethostbyaddr_r(ap, al, af,
3493 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003494#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 memset((void *) &data, '\0', sizeof(data));
3496 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3497 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003498#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003499#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003500#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003504#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 Py_END_ALLOW_THREADS
3506 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003507#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003509#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003510finally:
3511 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003513}
3514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003515PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003516"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3517\n\
3518Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003519for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003520
Guido van Rossum30a685f1991-06-27 15:51:29 +00003521
3522/* Python interface to getservbyname(name).
3523 This only returns the port number, since the other info is already
3524 known or not useful (like the list of aliases). */
3525
3526/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003528socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 char *name, *proto=NULL;
3531 struct servent *sp;
3532 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3533 return NULL;
3534 Py_BEGIN_ALLOW_THREADS
3535 sp = getservbyname(name, proto);
3536 Py_END_ALLOW_THREADS
3537 if (sp == NULL) {
3538 PyErr_SetString(socket_error, "service/proto not found");
3539 return NULL;
3540 }
3541 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003542}
3543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003544PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003545"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003546\n\
3547Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003548The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3549otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003550
Guido van Rossum30a685f1991-06-27 15:51:29 +00003551
Barry Warsaw11b91a02004-06-28 00:50:43 +00003552/* Python interface to getservbyport(port).
3553 This only returns the service name, since the other info is already
3554 known or not useful (like the list of aliases). */
3555
3556/*ARGSUSED*/
3557static PyObject *
3558socket_getservbyport(PyObject *self, PyObject *args)
3559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 int port;
3561 char *proto=NULL;
3562 struct servent *sp;
3563 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3564 return NULL;
3565 if (port < 0 || port > 0xffff) {
3566 PyErr_SetString(
3567 PyExc_OverflowError,
3568 "getservbyport: port must be 0-65535.");
3569 return NULL;
3570 }
3571 Py_BEGIN_ALLOW_THREADS
3572 sp = getservbyport(htons((short)port), proto);
3573 Py_END_ALLOW_THREADS
3574 if (sp == NULL) {
3575 PyErr_SetString(socket_error, "port/proto not found");
3576 return NULL;
3577 }
3578 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003579}
3580
3581PyDoc_STRVAR(getservbyport_doc,
3582"getservbyport(port[, protocolname]) -> string\n\
3583\n\
3584Return the service name from a port number and protocol name.\n\
3585The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3586otherwise any protocol will match.");
3587
Guido van Rossum3901d851996-12-19 16:35:04 +00003588/* Python interface to getprotobyname(name).
3589 This only returns the protocol number, since the other info is
3590 already known or not useful (like the list of aliases). */
3591
3592/*ARGSUSED*/
3593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003594socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 char *name;
3597 struct protoent *sp;
3598 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3599 return NULL;
3600 Py_BEGIN_ALLOW_THREADS
3601 sp = getprotobyname(name);
3602 Py_END_ALLOW_THREADS
3603 if (sp == NULL) {
3604 PyErr_SetString(socket_error, "protocol not found");
3605 return NULL;
3606 }
3607 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00003608}
3609
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003610PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003611"getprotobyname(name) -> integer\n\
3612\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003613Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003614
Guido van Rossum3901d851996-12-19 16:35:04 +00003615
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003616#ifndef NO_DUP
3617/* dup() function for socket fds */
3618
3619static PyObject *
3620socket_dup(PyObject *self, PyObject *fdobj)
3621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 SOCKET_T fd, newfd;
3623 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003624
3625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 fd = PyLong_AsSocket_t(fdobj);
3627 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3628 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003630 newfd = dup_socket(fd);
3631 if (newfd == INVALID_SOCKET)
3632 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 newfdobj = PyLong_FromSocket_t(newfd);
3635 if (newfdobj == NULL)
3636 SOCKETCLOSE(newfd);
3637 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003638}
3639
3640PyDoc_STRVAR(dup_doc,
3641"dup(integer) -> integer\n\
3642\n\
3643Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
3644sockets; on some platforms os.dup() won't work for socket file descriptors.");
3645#endif
3646
3647
Dave Cole331708b2004-08-09 04:51:41 +00003648#ifdef HAVE_SOCKETPAIR
3649/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003650 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003651 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003652
3653/*ARGSUSED*/
3654static PyObject *
3655socket_socketpair(PyObject *self, PyObject *args)
3656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 PySocketSockObject *s0 = NULL, *s1 = NULL;
3658 SOCKET_T sv[2];
3659 int family, type = SOCK_STREAM, proto = 0;
3660 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003661
3662#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003664#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3668 &family, &type, &proto))
3669 return NULL;
3670 /* Create a pair of socket fds */
3671 if (socketpair(family, type, proto, sv) < 0)
3672 return set_error();
3673 s0 = new_sockobject(sv[0], family, type, proto);
3674 if (s0 == NULL)
3675 goto finally;
3676 s1 = new_sockobject(sv[1], family, type, proto);
3677 if (s1 == NULL)
3678 goto finally;
3679 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003680
3681finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 if (res == NULL) {
3683 if (s0 == NULL)
3684 SOCKETCLOSE(sv[0]);
3685 if (s1 == NULL)
3686 SOCKETCLOSE(sv[1]);
3687 }
3688 Py_XDECREF(s0);
3689 Py_XDECREF(s1);
3690 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003691}
3692
3693PyDoc_STRVAR(socketpair_doc,
3694"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3695\n\
3696Create a pair of socket objects from the sockets returned by the platform\n\
3697socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003698The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003699AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003700
3701#endif /* HAVE_SOCKETPAIR */
3702
3703
Guido van Rossum006bf911996-06-12 04:04:55 +00003704static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003705socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3710 return NULL;
3711 }
3712 if (x1 < 0) {
3713 PyErr_SetString(PyExc_OverflowError,
3714 "can't convert negative number to unsigned long");
3715 return NULL;
3716 }
3717 x2 = (unsigned int)ntohs((unsigned short)x1);
3718 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003719}
3720
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003721PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003722"ntohs(integer) -> integer\n\
3723\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003724Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003725
3726
Guido van Rossum006bf911996-06-12 04:04:55 +00003727static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003728socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 if (PyLong_Check(arg)) {
3733 x = PyLong_AsUnsignedLong(arg);
3734 if (x == (unsigned long) -1 && PyErr_Occurred())
3735 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003736#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 {
3738 unsigned long y;
3739 /* only want the trailing 32 bits */
3740 y = x & 0xFFFFFFFFUL;
3741 if (y ^ x)
3742 return PyErr_Format(PyExc_OverflowError,
3743 "long int larger than 32 bits");
3744 x = y;
3745 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 }
3748 else
3749 return PyErr_Format(PyExc_TypeError,
3750 "expected int/long, %s found",
3751 Py_TYPE(arg)->tp_name);
3752 if (x == (unsigned long) -1 && PyErr_Occurred())
3753 return NULL;
3754 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003755}
3756
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003757PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003758"ntohl(integer) -> integer\n\
3759\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003760Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003761
3762
Guido van Rossum006bf911996-06-12 04:04:55 +00003763static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003764socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3769 return NULL;
3770 }
3771 if (x1 < 0) {
3772 PyErr_SetString(PyExc_OverflowError,
3773 "can't convert negative number to unsigned long");
3774 return NULL;
3775 }
3776 x2 = (unsigned int)htons((unsigned short)x1);
3777 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003778}
3779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003780PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003781"htons(integer) -> integer\n\
3782\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003783Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003784
3785
Guido van Rossum006bf911996-06-12 04:04:55 +00003786static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003787socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003789 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 if (PyLong_Check(arg)) {
3792 x = PyLong_AsUnsignedLong(arg);
3793 if (x == (unsigned long) -1 && PyErr_Occurred())
3794 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003795#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 {
3797 unsigned long y;
3798 /* only want the trailing 32 bits */
3799 y = x & 0xFFFFFFFFUL;
3800 if (y ^ x)
3801 return PyErr_Format(PyExc_OverflowError,
3802 "long int larger than 32 bits");
3803 x = y;
3804 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 }
3807 else
3808 return PyErr_Format(PyExc_TypeError,
3809 "expected int/long, %s found",
3810 Py_TYPE(arg)->tp_name);
3811 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003812}
3813
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003814PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003815"htonl(integer) -> integer\n\
3816\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003817Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003818
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003819/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003821PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003822"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003823\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003824Convert 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 +00003825binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003826
3827static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003828socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003829{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003830#ifndef INADDR_NONE
3831#define INADDR_NONE (-1)
3832#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003833#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003835#endif
3836
3837#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00003838#if (SIZEOF_INT != 4)
3839#error "Not sure if in_addr_t exists and int is not 32-bits."
3840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 /* Have to use inet_addr() instead */
3842 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3847 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003848
Tim Peters1df9fdd2003-02-13 03:13:40 +00003849
3850#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00003851
3852#ifdef USE_INET_ATON_WEAKLINK
3853 if (inet_aton != NULL) {
3854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003855 if (inet_aton(ip_addr, &buf))
3856 return PyBytes_FromStringAndSize((char *)(&buf),
3857 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 PyErr_SetString(socket_error,
3860 "illegal IP address string passed to inet_aton");
3861 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003862
Thomas Wouters477c8d52006-05-27 19:21:47 +00003863#ifdef USE_INET_ATON_WEAKLINK
3864 } else {
3865#endif
3866
3867#endif
3868
3869#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 /* special-case this address as inet_addr might return INADDR_NONE
3872 * for this */
3873 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3874 packed_addr = 0xFFFFFFFF;
3875 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 if (packed_addr == INADDR_NONE) { /* invalid address */
3880 PyErr_SetString(socket_error,
3881 "illegal IP address string passed to inet_aton");
3882 return NULL;
3883 }
3884 }
3885 return PyBytes_FromStringAndSize((char *) &packed_addr,
3886 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00003887
3888#ifdef USE_INET_ATON_WEAKLINK
3889 }
3890#endif
3891
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003892#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003893}
3894
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003895PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003896"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003897\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003898Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003899
3900static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003901socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 char *packed_str;
3904 int addr_len;
3905 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
3908 return NULL;
3909 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003911 if (addr_len != sizeof(packed_addr)) {
3912 PyErr_SetString(socket_error,
3913 "packed IP wrong length for inet_ntoa");
3914 return NULL;
3915 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003919 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003920}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003921
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003922#ifdef HAVE_INET_PTON
3923
3924PyDoc_STRVAR(inet_pton_doc,
3925"inet_pton(af, ip) -> packed IP address string\n\
3926\n\
3927Convert an IP address from string format to a packed string suitable\n\
3928for use with low-level network functions.");
3929
3930static PyObject *
3931socket_inet_pton(PyObject *self, PyObject *args)
3932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003933 int af;
3934 char* ip;
3935 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003936#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003937 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003938#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3942 return NULL;
3943 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003944
Martin v. Löwis04697e82004-06-02 12:35:29 +00003945#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 if(af == AF_INET6) {
3947 PyErr_SetString(socket_error,
3948 "can't use AF_INET6, IPv6 is disabled");
3949 return NULL;
3950 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003951#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 retval = inet_pton(af, ip, packed);
3954 if (retval < 0) {
3955 PyErr_SetFromErrno(socket_error);
3956 return NULL;
3957 } else if (retval == 0) {
3958 PyErr_SetString(socket_error,
3959 "illegal IP address string passed to inet_pton");
3960 return NULL;
3961 } else if (af == AF_INET) {
3962 return PyBytes_FromStringAndSize(packed,
3963 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003964#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 } else if (af == AF_INET6) {
3966 return PyBytes_FromStringAndSize(packed,
3967 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 } else {
3970 PyErr_SetString(socket_error, "unknown address family");
3971 return NULL;
3972 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003973}
Thomas Wouters477c8d52006-05-27 19:21:47 +00003974
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003975PyDoc_STRVAR(inet_ntop_doc,
3976"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3977\n\
3978Convert a packed IP address of the given family to string format.");
3979
3980static PyObject *
3981socket_inet_ntop(PyObject *self, PyObject *args)
3982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 int af;
3984 char* packed;
3985 int len;
3986 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003987#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003989#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003990 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003991#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00003992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 /* Guarantee NUL-termination for PyUnicode_FromString() below */
3994 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003996 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
3997 return NULL;
3998 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 if (af == AF_INET) {
4001 if (len != sizeof(struct in_addr)) {
4002 PyErr_SetString(PyExc_ValueError,
4003 "invalid length of packed IP address string");
4004 return NULL;
4005 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004006#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004007 } else if (af == AF_INET6) {
4008 if (len != sizeof(struct in6_addr)) {
4009 PyErr_SetString(PyExc_ValueError,
4010 "invalid length of packed IP address string");
4011 return NULL;
4012 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004014 } else {
4015 PyErr_Format(PyExc_ValueError,
4016 "unknown address family %d", af);
4017 return NULL;
4018 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 retval = inet_ntop(af, packed, ip, sizeof(ip));
4021 if (!retval) {
4022 PyErr_SetFromErrno(socket_error);
4023 return NULL;
4024 } else {
4025 return PyUnicode_FromString(retval);
4026 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 /* NOTREACHED */
4029 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4030 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004031}
4032
4033#endif /* HAVE_INET_PTON */
4034
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004035/* Python interface to getaddrinfo(host, port). */
4036
4037/*ARGSUSED*/
4038static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004039socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004040{
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004041 static char* kwnames[] = {"host", "port", "family", "type", "proto",
4042 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 struct addrinfo hints, *res;
4044 struct addrinfo *res0 = NULL;
4045 PyObject *hobj = NULL;
4046 PyObject *pobj = (PyObject *)NULL;
4047 char pbuf[30];
4048 char *hptr, *pptr;
4049 int family, socktype, protocol, flags;
4050 int error;
4051 PyObject *all = (PyObject *)NULL;
4052 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 family = socktype = protocol = flags = 0;
4055 family = AF_UNSPEC;
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004056 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
4057 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 &protocol, &flags)) {
4059 return NULL;
4060 }
4061 if (hobj == Py_None) {
4062 hptr = NULL;
4063 } else if (PyUnicode_Check(hobj)) {
4064 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4065 if (!idna)
4066 return NULL;
4067 assert(PyBytes_Check(idna));
4068 hptr = PyBytes_AS_STRING(idna);
4069 } else if (PyBytes_Check(hobj)) {
4070 hptr = PyBytes_AsString(hobj);
4071 } else {
4072 PyErr_SetString(PyExc_TypeError,
4073 "getaddrinfo() argument 1 must be string or None");
4074 return NULL;
4075 }
4076 if (PyLong_CheckExact(pobj)) {
4077 long value = PyLong_AsLong(pobj);
4078 if (value == -1 && PyErr_Occurred())
4079 goto err;
4080 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4081 pptr = pbuf;
4082 } else if (PyUnicode_Check(pobj)) {
4083 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004084 if (pptr == NULL)
4085 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004087 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 } else if (pobj == Py_None) {
4089 pptr = (char *)NULL;
4090 } else {
4091 PyErr_SetString(socket_error, "Int or String expected");
4092 goto err;
4093 }
4094 memset(&hints, 0, sizeof(hints));
4095 hints.ai_family = family;
4096 hints.ai_socktype = socktype;
4097 hints.ai_protocol = protocol;
4098 hints.ai_flags = flags;
4099 Py_BEGIN_ALLOW_THREADS
4100 ACQUIRE_GETADDRINFO_LOCK
4101 error = getaddrinfo(hptr, pptr, &hints, &res0);
4102 Py_END_ALLOW_THREADS
4103 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4104 if (error) {
4105 set_gaierror(error);
4106 goto err;
4107 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 if ((all = PyList_New(0)) == NULL)
4110 goto err;
4111 for (res = res0; res; res = res->ai_next) {
4112 PyObject *single;
4113 PyObject *addr =
4114 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4115 if (addr == NULL)
4116 goto err;
4117 single = Py_BuildValue("iiisO", res->ai_family,
4118 res->ai_socktype, res->ai_protocol,
4119 res->ai_canonname ? res->ai_canonname : "",
4120 addr);
4121 Py_DECREF(addr);
4122 if (single == NULL)
4123 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 if (PyList_Append(all, single))
4126 goto err;
4127 Py_XDECREF(single);
4128 }
4129 Py_XDECREF(idna);
4130 if (res0)
4131 freeaddrinfo(res0);
4132 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004133 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 Py_XDECREF(all);
4135 Py_XDECREF(idna);
4136 if (res0)
4137 freeaddrinfo(res0);
4138 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004139}
4140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004141PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004142"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4143 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004144\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004145Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004146
4147/* Python interface to getnameinfo(sa, flags). */
4148
4149/*ARGSUSED*/
4150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004151socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 PyObject *sa = (PyObject *)NULL;
4154 int flags;
4155 char *hostp;
4156 int port, flowinfo, scope_id;
4157 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4158 struct addrinfo hints, *res = NULL;
4159 int error;
4160 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 flags = flowinfo = scope_id = 0;
4163 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4164 return NULL;
4165 if (!PyTuple_Check(sa)) {
4166 PyErr_SetString(PyExc_TypeError,
4167 "getnameinfo() argument 1 must be a tuple");
4168 return NULL;
4169 }
4170 if (!PyArg_ParseTuple(sa, "si|ii",
4171 &hostp, &port, &flowinfo, &scope_id))
4172 return NULL;
4173 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4174 memset(&hints, 0, sizeof(hints));
4175 hints.ai_family = AF_UNSPEC;
4176 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004177 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 Py_BEGIN_ALLOW_THREADS
4179 ACQUIRE_GETADDRINFO_LOCK
4180 error = getaddrinfo(hostp, pbuf, &hints, &res);
4181 Py_END_ALLOW_THREADS
4182 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4183 if (error) {
4184 set_gaierror(error);
4185 goto fail;
4186 }
4187 if (res->ai_next) {
4188 PyErr_SetString(socket_error,
4189 "sockaddr resolved to multiple addresses");
4190 goto fail;
4191 }
4192 switch (res->ai_family) {
4193 case AF_INET:
4194 {
4195 if (PyTuple_GET_SIZE(sa) != 2) {
4196 PyErr_SetString(socket_error,
4197 "IPv4 sockaddr must be 2 tuple");
4198 goto fail;
4199 }
4200 break;
4201 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004202#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004203 case AF_INET6:
4204 {
4205 struct sockaddr_in6 *sin6;
4206 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4207 sin6->sin6_flowinfo = flowinfo;
4208 sin6->sin6_scope_id = scope_id;
4209 break;
4210 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004213 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4215 if (error) {
4216 set_gaierror(error);
4217 goto fail;
4218 }
4219 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004220
4221fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 if (res)
4223 freeaddrinfo(res);
4224 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004225}
4226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004227PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004228"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004229\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004230Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004231
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004232
4233/* Python API to getting and setting the default timeout value. */
4234
4235static PyObject *
4236socket_getdefaulttimeout(PyObject *self)
4237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 if (defaulttimeout < 0.0) {
4239 Py_INCREF(Py_None);
4240 return Py_None;
4241 }
4242 else
4243 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004244}
4245
4246PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004247"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004248\n\
4249Returns the default timeout in floating seconds for new socket objects.\n\
4250A value of None indicates that new socket objects have no timeout.\n\
4251When the socket module is first imported, the default is None.");
4252
4253static PyObject *
4254socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 if (arg == Py_None)
4259 timeout = -1.0;
4260 else {
4261 timeout = PyFloat_AsDouble(arg);
4262 if (timeout < 0.0) {
4263 if (!PyErr_Occurred())
4264 PyErr_SetString(PyExc_ValueError,
4265 "Timeout value out of range");
4266 return NULL;
4267 }
4268 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 Py_INCREF(Py_None);
4273 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004274}
4275
4276PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004277"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004278\n\
4279Set the default timeout in floating seconds for new socket objects.\n\
4280A value of None indicates that new socket objects have no timeout.\n\
4281When the socket module is first imported, the default is None.");
4282
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004283#ifdef HAVE_IF_NAMEINDEX
4284/* Python API for getting interface indices and names */
4285
4286static PyObject *
4287socket_if_nameindex(PyObject *self, PyObject *arg)
4288{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004289 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02004290 int i;
4291 struct if_nameindex *ni;
4292
4293 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004294 if (ni == NULL) {
Charles-François Natali60713592011-05-20 16:55:06 +02004295 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004296 return NULL;
4297 }
4298
4299 list = PyList_New(0);
4300 if (list == NULL) {
4301 if_freenameindex(ni);
4302 return NULL;
4303 }
4304
Charles-François Natali60713592011-05-20 16:55:06 +02004305 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
4306 PyObject *ni_tuple = Py_BuildValue("IO&",
4307 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004308
4309 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
4310 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02004311 Py_DECREF(list);
4312 if_freenameindex(ni);
4313 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004314 }
4315 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004316 }
4317
4318 if_freenameindex(ni);
4319 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004320}
4321
4322PyDoc_STRVAR(if_nameindex_doc,
4323"if_nameindex()\n\
4324\n\
4325Returns a list of network interface information (index, name) tuples.");
4326
Charles-François Natali60713592011-05-20 16:55:06 +02004327static PyObject *
4328socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004329{
Charles-François Natali60713592011-05-20 16:55:06 +02004330 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004331 unsigned long index;
4332
Charles-François Natali60713592011-05-20 16:55:06 +02004333 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
4334 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004335 return NULL;
4336
Charles-François Natali60713592011-05-20 16:55:06 +02004337 index = if_nametoindex(PyBytes_AS_STRING(oname));
4338 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004339 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02004340 /* if_nametoindex() doesn't set errno */
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004341 PyErr_SetString(socket_error, "no interface with this name");
4342 return NULL;
4343 }
4344
4345 return PyLong_FromUnsignedLong(index);
4346}
4347
4348PyDoc_STRVAR(if_nametoindex_doc,
4349"if_nametoindex(if_name)\n\
4350\n\
4351Returns the interface index corresponding to the interface name if_name.");
4352
Charles-François Natali60713592011-05-20 16:55:06 +02004353static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004354socket_if_indextoname(PyObject *self, PyObject *arg)
4355{
Charles-François Natali60713592011-05-20 16:55:06 +02004356 unsigned long index;
4357 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004358
Charles-François Natali60713592011-05-20 16:55:06 +02004359 index = PyLong_AsUnsignedLong(arg);
4360 if (index == (unsigned long) -1)
4361 return NULL;
4362
4363 if (if_indextoname(index, name) == NULL) {
4364 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004365 return NULL;
4366 }
4367
Charles-François Natali60713592011-05-20 16:55:06 +02004368 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004369}
4370
4371PyDoc_STRVAR(if_indextoname_doc,
4372"if_indextoname(if_index)\n\
4373\n\
4374Returns the interface name corresponding to the interface index if_index.");
4375
4376#endif /* HAVE_IF_NAMEINDEX */
4377
4378
Guido van Rossum30a685f1991-06-27 15:51:29 +00004379/* List of functions exported by this module. */
4380
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004381static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 {"gethostbyname", socket_gethostbyname,
4383 METH_VARARGS, gethostbyname_doc},
4384 {"gethostbyname_ex", socket_gethostbyname_ex,
4385 METH_VARARGS, ghbn_ex_doc},
4386 {"gethostbyaddr", socket_gethostbyaddr,
4387 METH_VARARGS, gethostbyaddr_doc},
4388 {"gethostname", socket_gethostname,
4389 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004390#ifdef HAVE_SETHOSTNAME
4391 {"sethostname", socket_sethostname,
4392 METH_VARARGS, sethostname_doc},
4393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 {"getservbyname", socket_getservbyname,
4395 METH_VARARGS, getservbyname_doc},
4396 {"getservbyport", socket_getservbyport,
4397 METH_VARARGS, getservbyport_doc},
4398 {"getprotobyname", socket_getprotobyname,
4399 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004400#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 {"dup", socket_dup,
4402 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004403#endif
Dave Cole331708b2004-08-09 04:51:41 +00004404#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 {"socketpair", socket_socketpair,
4406 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 {"ntohs", socket_ntohs,
4409 METH_VARARGS, ntohs_doc},
4410 {"ntohl", socket_ntohl,
4411 METH_O, ntohl_doc},
4412 {"htons", socket_htons,
4413 METH_VARARGS, htons_doc},
4414 {"htonl", socket_htonl,
4415 METH_O, htonl_doc},
4416 {"inet_aton", socket_inet_aton,
4417 METH_VARARGS, inet_aton_doc},
4418 {"inet_ntoa", socket_inet_ntoa,
4419 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004420#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 {"inet_pton", socket_inet_pton,
4422 METH_VARARGS, inet_pton_doc},
4423 {"inet_ntop", socket_inet_ntop,
4424 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004425#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004426 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
4427 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 {"getnameinfo", socket_getnameinfo,
4429 METH_VARARGS, getnameinfo_doc},
4430 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4431 METH_NOARGS, getdefaulttimeout_doc},
4432 {"setdefaulttimeout", socket_setdefaulttimeout,
4433 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004434#ifdef HAVE_IF_NAMEINDEX
4435 {"if_nameindex", socket_if_nameindex,
4436 METH_NOARGS, if_nameindex_doc},
4437 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02004438 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004439 {"if_indextoname", socket_if_indextoname,
4440 METH_O, if_indextoname_doc},
4441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004443};
4444
Guido van Rossum30a685f1991-06-27 15:51:29 +00004445
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004446#ifdef MS_WINDOWS
4447#define OS_INIT_DEFINED
4448
4449/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004450
4451static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004452os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004455}
4456
4457static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004458os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 WSADATA WSAData;
4461 int ret;
4462 ret = WSAStartup(0x0101, &WSAData);
4463 switch (ret) {
4464 case 0: /* No error */
4465 Py_AtExit(os_cleanup);
4466 return 1; /* Success */
4467 case WSASYSNOTREADY:
4468 PyErr_SetString(PyExc_ImportError,
4469 "WSAStartup failed: network not ready");
4470 break;
4471 case WSAVERNOTSUPPORTED:
4472 case WSAEINVAL:
4473 PyErr_SetString(
4474 PyExc_ImportError,
4475 "WSAStartup failed: requested version not supported");
4476 break;
4477 default:
4478 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
4479 break;
4480 }
4481 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004482}
4483
Guido van Rossum8d665e61996-06-26 18:22:49 +00004484#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004485
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004486
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004487#ifdef PYOS_OS2
4488#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004489
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004490/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004491
4492static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004493os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004494{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004495#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 if (rc == 0) {
4499 return 1; /* Success */
4500 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004505#else
Ezio Melotti13925002011-03-16 11:05:33 +02004506 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004508#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004509}
4510
4511#endif /* PYOS_OS2 */
4512
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004513
4514#ifndef OS_INIT_DEFINED
4515static int
4516os_init(void)
4517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004519}
4520#endif
4521
4522
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004523/* C API table - always add new things to the end for binary
4524 compatibility. */
4525static
4526PySocketModule_APIObject PySocketModuleAPI =
4527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00004529 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004531};
4532
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004533
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004534/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004535
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004536 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004537 "socket.py" which implements some additional functionality.
4538 The import of "_socket" may fail with an ImportError exception if
4539 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02004540 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004541 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004542*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004544PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004545"Implementation module for socket operations.\n\
4546\n\
4547See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004548
Martin v. Löwis1a214512008-06-11 05:26:20 +00004549static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 PyModuleDef_HEAD_INIT,
4551 PySocket_MODULE_NAME,
4552 socket_doc,
4553 -1,
4554 socket_methods,
4555 NULL,
4556 NULL,
4557 NULL,
4558 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004559};
4560
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004561PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004562PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 if (!os_init())
4567 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 Py_TYPE(&sock_type) = &PyType_Type;
4570 m = PyModule_Create(&socketmodule);
4571 if (m == NULL)
4572 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 socket_error = PyErr_NewException("socket.error",
4575 PyExc_IOError, NULL);
4576 if (socket_error == NULL)
4577 return NULL;
4578 PySocketModuleAPI.error = socket_error;
4579 Py_INCREF(socket_error);
4580 PyModule_AddObject(m, "error", socket_error);
4581 socket_herror = PyErr_NewException("socket.herror",
4582 socket_error, NULL);
4583 if (socket_herror == NULL)
4584 return NULL;
4585 Py_INCREF(socket_herror);
4586 PyModule_AddObject(m, "herror", socket_herror);
4587 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4588 NULL);
4589 if (socket_gaierror == NULL)
4590 return NULL;
4591 Py_INCREF(socket_gaierror);
4592 PyModule_AddObject(m, "gaierror", socket_gaierror);
4593 socket_timeout = PyErr_NewException("socket.timeout",
4594 socket_error, NULL);
4595 if (socket_timeout == NULL)
4596 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00004597 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 Py_INCREF(socket_timeout);
4599 PyModule_AddObject(m, "timeout", socket_timeout);
4600 Py_INCREF((PyObject *)&sock_type);
4601 if (PyModule_AddObject(m, "SocketType",
4602 (PyObject *)&sock_type) != 0)
4603 return NULL;
4604 Py_INCREF((PyObject *)&sock_type);
4605 if (PyModule_AddObject(m, "socket",
4606 (PyObject *)&sock_type) != 0)
4607 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00004608
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004609#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004611#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004612 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 Py_INCREF(has_ipv6);
4615 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 /* Export C API */
4618 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4619 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4620 ) != 0)
4621 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004624#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004628#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004630#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004631#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004633#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004634#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 /* Amateur Radio AX.25 */
4636 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004637#endif
4638#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004640#endif
4641#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 /* Appletalk DDP */
4643 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004644#endif
4645#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 /* Amateur radio NetROM */
4647 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004648#endif
4649#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 /* Multiprotocol bridge */
4651 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004652#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004653#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 /* ATM PVCs */
4655 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004656#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004657#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 /* Reserved for Werner's ATM */
4659 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004660#endif
4661#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 /* Reserved for X.25 project */
4663 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004664#endif
4665#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004667#endif
4668#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 /* Amateur Radio X.25 PLP */
4670 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004671#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004672#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 /* Reserved for DECnet project */
4674 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004675#endif
4676#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 /* Reserved for 802.2LLC project */
4678 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004679#endif
4680#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 /* Security callback pseudo AF */
4682 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004683#endif
4684#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 /* PF_KEY key management API */
4686 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004687#endif
4688#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 /* */
4690 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4691 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004692#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004694#endif
4695#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4699 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004700#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004702#endif
4703#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004705#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004706#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004707 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004708#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004709#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004711#endif
4712#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004716#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004718#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004719#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004721#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004722#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004723#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 /* Alias to emulate 4.4BSD */
4725 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004726#endif
4727#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 /* Ash */
4729 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004730#endif
4731#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 /* Acorn Econet */
4733 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004734#endif
4735#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 /* ATM SVCs */
4737 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004738#endif
4739#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 /* Linux SNA Project (nutters!) */
4741 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004742#endif
4743#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 /* IRDA sockets */
4745 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004746#endif
4747#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 /* PPPoX sockets */
4749 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004750#endif
4751#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 /* Wanpipe API Sockets */
4753 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004754#endif
4755#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 /* Linux LLC */
4757 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004758#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004759
Hye-Shik Chang81268602004-02-02 06:05:24 +00004760#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4762 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4763 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4764 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004765#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004767#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004768#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004769#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004770 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4773 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004775 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4776 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4777 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004778#endif
4779
Antoine Pitroub156a462010-10-27 20:13:57 +00004780#ifdef AF_PACKET
4781 PyModule_AddIntMacro(m, AF_PACKET);
4782#endif
4783#ifdef PF_PACKET
4784 PyModule_AddIntMacro(m, PF_PACKET);
4785#endif
4786#ifdef PACKET_HOST
4787 PyModule_AddIntMacro(m, PACKET_HOST);
4788#endif
4789#ifdef PACKET_BROADCAST
4790 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4791#endif
4792#ifdef PACKET_MULTICAST
4793 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4794#endif
4795#ifdef PACKET_OTHERHOST
4796 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4797#endif
4798#ifdef PACKET_OUTGOING
4799 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4800#endif
4801#ifdef PACKET_LOOPBACK
4802 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4803#endif
4804#ifdef PACKET_FASTROUTE
4805 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004806#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004807
Christian Heimes043d6f62008-01-07 17:19:16 +00004808#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 /* for addresses */
4812 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4813 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4814 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00004815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4817 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4818 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00004819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 /* for setsockopt() */
4821 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4822 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4823 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4824 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4825 TIPC_DEST_DROPPABLE);
4826 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00004827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4829 TIPC_LOW_IMPORTANCE);
4830 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4831 TIPC_MEDIUM_IMPORTANCE);
4832 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4833 TIPC_HIGH_IMPORTANCE);
4834 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4835 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00004836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 /* for subscriptions */
4838 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4839 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00004840#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 /* doesn't seem to be available everywhere */
4842 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00004843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4845 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4846 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4847 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4848 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4849 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00004850#endif
4851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 /* Socket types */
4853 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4854 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004855/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4857 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004858#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004860#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00004861#ifdef SOCK_CLOEXEC
4862 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
4863#endif
4864#ifdef SOCK_NONBLOCK
4865 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
4866#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868#ifdef SO_DEBUG
4869 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871#ifdef SO_ACCEPTCONN
4872 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874#ifdef SO_REUSEADDR
4875 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004876#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004877#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004879#endif
4880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881#ifdef SO_KEEPALIVE
4882 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884#ifdef SO_DONTROUTE
4885 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887#ifdef SO_BROADCAST
4888 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890#ifdef SO_USELOOPBACK
4891 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004893#ifdef SO_LINGER
4894 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004896#ifdef SO_OOBINLINE
4897 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899#ifdef SO_REUSEPORT
4900 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902#ifdef SO_SNDBUF
4903 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905#ifdef SO_RCVBUF
4906 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908#ifdef SO_SNDLOWAT
4909 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911#ifdef SO_RCVLOWAT
4912 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914#ifdef SO_SNDTIMEO
4915 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917#ifdef SO_RCVTIMEO
4918 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920#ifdef SO_ERROR
4921 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923#ifdef SO_TYPE
4924 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926#ifdef SO_SETFIB
4927 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00004928#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 /* Maximum number of connections for "listen" */
4931#ifdef SOMAXCONN
4932 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004933#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
4936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 /* Flags for send, recv */
4938#ifdef MSG_OOB
4939 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941#ifdef MSG_PEEK
4942 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944#ifdef MSG_DONTROUTE
4945 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004946#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947#ifdef MSG_DONTWAIT
4948 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950#ifdef MSG_EOR
4951 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953#ifdef MSG_TRUNC
4954 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956#ifdef MSG_CTRUNC
4957 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959#ifdef MSG_WAITALL
4960 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962#ifdef MSG_BTAG
4963 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965#ifdef MSG_ETAG
4966 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004967#endif
4968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 /* Protocol level and numbers, usable for [gs]etsockopt */
4970#ifdef SOL_SOCKET
4971 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973#ifdef SOL_IP
4974 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978#ifdef SOL_IPX
4979 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981#ifdef SOL_AX25
4982 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984#ifdef SOL_ATALK
4985 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987#ifdef SOL_NETROM
4988 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990#ifdef SOL_ROSE
4991 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993#ifdef SOL_TCP
4994 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004995#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998#ifdef SOL_UDP
4999 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005000#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003#ifdef IPPROTO_IP
5004 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005005#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008#ifdef IPPROTO_HOPOPTS
5009 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011#ifdef IPPROTO_ICMP
5012 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005013#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016#ifdef IPPROTO_IGMP
5017 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019#ifdef IPPROTO_GGP
5020 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022#ifdef IPPROTO_IPV4
5023 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025#ifdef IPPROTO_IPV6
5026 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028#ifdef IPPROTO_IPIP
5029 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031#ifdef IPPROTO_TCP
5032 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005033#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036#ifdef IPPROTO_EGP
5037 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039#ifdef IPPROTO_PUP
5040 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005042#ifdef IPPROTO_UDP
5043 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005044#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047#ifdef IPPROTO_IDP
5048 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050#ifdef IPPROTO_HELLO
5051 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053#ifdef IPPROTO_ND
5054 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056#ifdef IPPROTO_TP
5057 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059#ifdef IPPROTO_IPV6
5060 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005062#ifdef IPPROTO_ROUTING
5063 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065#ifdef IPPROTO_FRAGMENT
5066 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068#ifdef IPPROTO_RSVP
5069 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071#ifdef IPPROTO_GRE
5072 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074#ifdef IPPROTO_ESP
5075 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077#ifdef IPPROTO_AH
5078 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080#ifdef IPPROTO_MOBILE
5081 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083#ifdef IPPROTO_ICMPV6
5084 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086#ifdef IPPROTO_NONE
5087 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089#ifdef IPPROTO_DSTOPTS
5090 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092#ifdef IPPROTO_XTP
5093 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095#ifdef IPPROTO_EON
5096 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098#ifdef IPPROTO_PIM
5099 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101#ifdef IPPROTO_IPCOMP
5102 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104#ifdef IPPROTO_VRRP
5105 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107#ifdef IPPROTO_BIP
5108 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005109#endif
5110/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111#ifdef IPPROTO_RAW
5112 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005113#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116#ifdef IPPROTO_MAX
5117 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005118#endif
5119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 /* Some port configuration */
5121#ifdef IPPORT_RESERVED
5122 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005123#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126#ifdef IPPORT_USERRESERVED
5127 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005128#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005130#endif
5131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 /* Some reserved IP v.4 addresses */
5133#ifdef INADDR_ANY
5134 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005135#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138#ifdef INADDR_BROADCAST
5139 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005140#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143#ifdef INADDR_LOOPBACK
5144 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005145#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148#ifdef INADDR_UNSPEC_GROUP
5149 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005150#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153#ifdef INADDR_ALLHOSTS_GROUP
5154 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5155 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005156#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159#ifdef INADDR_MAX_LOCAL_GROUP
5160 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5161 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005162#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165#ifdef INADDR_NONE
5166 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005167#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005169#endif
5170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 /* IPv4 [gs]etsockopt options */
5172#ifdef IP_OPTIONS
5173 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175#ifdef IP_HDRINCL
5176 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178#ifdef IP_TOS
5179 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181#ifdef IP_TTL
5182 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184#ifdef IP_RECVOPTS
5185 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187#ifdef IP_RECVRETOPTS
5188 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190#ifdef IP_RECVDSTADDR
5191 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193#ifdef IP_RETOPTS
5194 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196#ifdef IP_MULTICAST_IF
5197 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199#ifdef IP_MULTICAST_TTL
5200 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202#ifdef IP_MULTICAST_LOOP
5203 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205#ifdef IP_ADD_MEMBERSHIP
5206 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208#ifdef IP_DROP_MEMBERSHIP
5209 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211#ifdef IP_DEFAULT_MULTICAST_TTL
5212 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5213 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215#ifdef IP_DEFAULT_MULTICAST_LOOP
5216 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5217 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219#ifdef IP_MAX_MEMBERSHIPS
5220 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005221#endif
5222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5224#ifdef IPV6_JOIN_GROUP
5225 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227#ifdef IPV6_LEAVE_GROUP
5228 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230#ifdef IPV6_MULTICAST_HOPS
5231 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233#ifdef IPV6_MULTICAST_IF
5234 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236#ifdef IPV6_MULTICAST_LOOP
5237 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239#ifdef IPV6_UNICAST_HOPS
5240 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005243#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005247#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005249#endif
5250#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005252#endif
5253#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005255#endif
5256#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005258#endif
5259#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005261#endif
5262#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005264#endif
5265#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005267#endif
5268#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005270#endif
5271#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005273#endif
5274#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005276#endif
5277#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005279#endif
5280#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005282#endif
5283#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005285#endif
5286#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005288#endif
5289#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005291#endif
5292#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005294#endif
5295#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005297#endif
5298#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005300#endif
5301#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005303#endif
5304#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005306#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 /* TCP options */
5309#ifdef TCP_NODELAY
5310 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312#ifdef TCP_MAXSEG
5313 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315#ifdef TCP_CORK
5316 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318#ifdef TCP_KEEPIDLE
5319 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321#ifdef TCP_KEEPINTVL
5322 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324#ifdef TCP_KEEPCNT
5325 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327#ifdef TCP_SYNCNT
5328 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330#ifdef TCP_LINGER2
5331 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333#ifdef TCP_DEFER_ACCEPT
5334 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336#ifdef TCP_WINDOW_CLAMP
5337 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339#ifdef TCP_INFO
5340 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342#ifdef TCP_QUICKACK
5343 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005344#endif
5345
Guido van Rossum09be4091999-08-09 14:40:40 +00005346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 /* IPX options */
5348#ifdef IPX_TYPE
5349 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005350#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005353#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005355#endif
5356#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358#endif
5359#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005361#endif
5362#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005364#endif
5365#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005367#endif
5368#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370#endif
5371#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005373#endif
5374#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005376#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005377#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005379#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005380#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005382#endif
5383#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005385#endif
5386#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005388#endif
5389#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005391#endif
5392#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005394#endif
5395#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005397#endif
5398#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005400#endif
5401#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005403#endif
5404#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005406#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005407#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005409#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005410#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005412#endif
5413#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005415#endif
5416#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005418#endif
5419#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005421#endif
5422#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005424#endif
5425#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005427#endif
5428#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005430#endif
5431#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005433#endif
5434#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005436#endif
5437#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005439#endif
5440#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005442#endif
5443#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005445#endif
5446#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005448#endif
5449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005451#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005453#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005455#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005457#endif
5458#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005460#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005462#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005464#endif
5465#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005467#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005469#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005471#endif
5472
Christian Heimesfaf2f632008-01-06 16:59:19 +00005473#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 {
5475 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5476 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5477 int i;
5478 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5479 PyObject *tmp;
5480 tmp = PyLong_FromUnsignedLong(codes[i]);
5481 if (tmp == NULL)
5482 return NULL;
5483 PyModule_AddObject(m, names[i], tmp);
5484 }
5485 }
5486 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5487 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5488 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005489#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005491#endif
5492#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005494#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00005495#endif /* _MSTCPIP_ */
5496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005498#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005502}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005503
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005504
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005505#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00005506#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005507
5508/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005509/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005510
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005511int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005512inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00005515#if (SIZEOF_INT != 4)
5516#error "Not sure if in_addr_t exists and int is not 32-bits."
5517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 unsigned int packed_addr;
5519 packed_addr = inet_addr(src);
5520 if (packed_addr == INADDR_NONE)
5521 return 0;
5522 memcpy(dst, &packed_addr, 4);
5523 return 1;
5524 }
5525 /* Should set errno to EAFNOSUPPORT */
5526 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005527}
5528
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005529const char *
5530inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 if (af == AF_INET) {
5533 struct in_addr packed_addr;
5534 if (size < 16)
5535 /* Should set errno to ENOSPC. */
5536 return NULL;
5537 memcpy(&packed_addr, src, sizeof(packed_addr));
5538 return strncpy(dst, inet_ntoa(packed_addr), size);
5539 }
5540 /* Should set errno to EAFNOSUPPORT */
5541 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005542}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005543
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005544#endif
Christian Heimesb6150692007-11-15 23:37:07 +00005545#endif