blob: ee3a5110d1f0e70511339b7a981495e58b0dc830 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Guido van Rossum27e177d1995-03-16 15:43:47 +000018- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000098#undef MAX
99#define MAX(x, y) ((x) < (y) ? (y) : (x))
100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103"socket([family[, type[, proto]]]) -> socket object\n\
104\n\
105Open a socket of the given type. The family argument specifies the\n\
106address family; it defaults to AF_INET. The type argument specifies\n\
107whether this is a stream (SOCK_STREAM, this is the default)\n\
108or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
109specifying the default protocol. Keyword arguments are accepted.\n\
110\n\
111A socket object represents one endpoint of a network connection.\n\
112\n\
113Methods of socket objects (keyword arguments not allowed):\n\
114\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116bind(addr) -- bind the socket to a local address\n\
117close() -- close the socket\n\
118connect(addr) -- connect the socket to a remote address\n\
119connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000120_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121fileno() -- return underlying file descriptor\n\
122getpeername() -- return remote address [*]\n\
123getsockname() -- return local address\n\
124getsockopt(level, optname[, buflen]) -- get socket options\n\
125gettimeout() -- return timeout or None\n\
126listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700139if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700140if_nametoindex(name) -- return the corresponding interface index\n\
141if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000144
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000145/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000146 I hope some day someone can clean this up please... */
147
Guido van Rossum9376b741999-09-15 22:01:40 +0000148/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
149 script doesn't get this right, so we hardcode some platform checks below.
150 On the other hand, not all Linux versions agree, so there the settings
151 computed by the configure script are needed! */
152
153#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R_3_ARG
155# undef HAVE_GETHOSTBYNAME_R_5_ARG
156# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000157#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000158
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);
Victor Stinner77af1722011-05-26 14:05:59 +02002785 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01002787 if (PyErr_Occurred())
2788 return NULL;
2789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 buf = pbuf.buf;
2791 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 if (!IS_SELECTABLE(s)) {
2794 PyBuffer_Release(&pbuf);
2795 return select_error();
2796 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2799 PyBuffer_Release(&pbuf);
2800 return NULL;
2801 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002802
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002803 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002805 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 if (!timeout)
2807 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2808 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002811 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 PyErr_SetString(socket_timeout, "timed out");
2813 return NULL;
2814 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002815 END_SELECT_LOOP(s)
2816 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 if (n < 0)
2818 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00002819 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002820}
2821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002822PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002823"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002824\n\
2825Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002826For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002827
Guido van Rossum30a685f1991-06-27 15:51:29 +00002828
2829/* s.shutdown(how) method */
2830
Guido van Rossum73624e91994-10-10 17:59:00 +00002831static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002832sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 int how;
2835 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 how = PyLong_AsLong(arg);
2838 if (how == -1 && PyErr_Occurred())
2839 return NULL;
2840 Py_BEGIN_ALLOW_THREADS
2841 res = shutdown(s->sock_fd, how);
2842 Py_END_ALLOW_THREADS
2843 if (res < 0)
2844 return s->errorhandler();
2845 Py_INCREF(Py_None);
2846 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002847}
2848
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002849PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002850"shutdown(flag)\n\
2851\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002852Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2853of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002854
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00002855#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00002856static PyObject*
2857sock_ioctl(PySocketSockObject *s, PyObject *arg)
2858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 unsigned long cmd = SIO_RCVALL;
2860 PyObject *argO;
2861 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00002862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2864 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00002865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 switch (cmd) {
2867 case SIO_RCVALL: {
2868 unsigned int option = RCVALL_ON;
2869 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2870 return NULL;
2871 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2872 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2873 return set_error();
2874 }
2875 return PyLong_FromUnsignedLong(recv); }
2876 case SIO_KEEPALIVE_VALS: {
2877 struct tcp_keepalive ka;
2878 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2879 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2880 return NULL;
2881 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2882 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2883 return set_error();
2884 }
2885 return PyLong_FromUnsignedLong(recv); }
2886 default:
2887 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2888 return NULL;
2889 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00002890}
2891PyDoc_STRVAR(sock_ioctl_doc,
2892"ioctl(cmd, option) -> long\n\
2893\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00002894Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2895SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2896SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00002897
2898#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002899
2900/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002901
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002902static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
2904 accept_doc},
2905 {"bind", (PyCFunction)sock_bind, METH_O,
2906 bind_doc},
2907 {"close", (PyCFunction)sock_close, METH_NOARGS,
2908 close_doc},
2909 {"connect", (PyCFunction)sock_connect, METH_O,
2910 connect_doc},
2911 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2912 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002913 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
2914 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2916 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002917#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 {"getpeername", (PyCFunction)sock_getpeername,
2919 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 {"getsockname", (PyCFunction)sock_getsockname,
2922 METH_NOARGS, getsockname_doc},
2923 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2924 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00002925#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2927 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00002928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 {"listen", (PyCFunction)sock_listen, METH_O,
2930 listen_doc},
2931 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2932 recv_doc},
2933 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2934 recv_into_doc},
2935 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2936 recvfrom_doc},
2937 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2938 recvfrom_into_doc},
2939 {"send", (PyCFunction)sock_send, METH_VARARGS,
2940 send_doc},
2941 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2942 sendall_doc},
2943 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2944 sendto_doc},
2945 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2946 setblocking_doc},
2947 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2948 settimeout_doc},
2949 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2950 gettimeout_doc},
2951 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2952 setsockopt_doc},
2953 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2954 shutdown_doc},
2955 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002956};
2957
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002958/* SockObject members */
2959static PyMemberDef sock_memberlist[] = {
2960 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2961 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2962 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2963 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2964 {0},
2965};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002966
Guido van Rossum73624e91994-10-10 17:59:00 +00002967/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002968 First close the file description. */
2969
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002970static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002971sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002972{
Antoine Pitroue033e062010-10-29 10:38:18 +00002973 if (s->sock_fd != -1) {
2974 PyObject *exc, *val, *tb;
2975 Py_ssize_t old_refcount = Py_REFCNT(s);
2976 ++Py_REFCNT(s);
2977 PyErr_Fetch(&exc, &val, &tb);
2978 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
2979 "unclosed %R", s))
2980 /* Spurious errors can appear at shutdown */
2981 if (PyErr_ExceptionMatches(PyExc_Warning))
2982 PyErr_WriteUnraisable((PyObject *) s);
2983 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00002985 Py_REFCNT(s) = old_refcount;
2986 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002988}
2989
Guido van Rossum30a685f1991-06-27 15:51:29 +00002990
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002991static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002992sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002993{
Fred Drakea04eaad2000-06-30 02:46:07 +00002994#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 if (s->sock_fd > LONG_MAX) {
2996 /* this can occur on Win64, and actually there is a special
2997 ugly printf formatter for decimal pointer length integer
2998 printing, only bother if necessary*/
2999 PyErr_SetString(PyExc_OverflowError,
3000 "no printf formatter to display "
3001 "the socket descriptor in decimal");
3002 return NULL;
3003 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 return PyUnicode_FromFormat(
3006 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3007 (long)s->sock_fd, s->sock_family,
3008 s->sock_type,
3009 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003010}
3011
3012
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003013/* Create a new, uninitialized socket object. */
3014
3015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 new = type->tp_alloc(type, 0);
3021 if (new != NULL) {
3022 ((PySocketSockObject *)new)->sock_fd = -1;
3023 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3024 ((PySocketSockObject *)new)->errorhandler = &set_error;
3025 }
3026 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003027}
3028
3029
3030/* Initialize a new socket object. */
3031
3032/*ARGSUSED*/
3033static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003034sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 PySocketSockObject *s = (PySocketSockObject *)self;
3037 PyObject *fdobj = NULL;
3038 SOCKET_T fd = INVALID_SOCKET;
3039 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3040 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3043 "|iiiO:socket", keywords,
3044 &family, &type, &proto, &fdobj))
3045 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 if (fdobj != NULL && fdobj != Py_None) {
3048 fd = PyLong_AsSocket_t(fdobj);
3049 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3050 return -1;
3051 if (fd == INVALID_SOCKET) {
3052 PyErr_SetString(PyExc_ValueError,
3053 "can't use invalid socket value");
3054 return -1;
3055 }
3056 }
3057 else {
3058 Py_BEGIN_ALLOW_THREADS
3059 fd = socket(family, type, proto);
3060 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 if (fd == INVALID_SOCKET) {
3063 set_error();
3064 return -1;
3065 }
3066 }
3067 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003070
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003071}
3072
3073
Guido van Rossumb6775db1994-08-01 11:34:53 +00003074/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003075
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003076static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3078 "_socket.socket", /* tp_name */
3079 sizeof(PySocketSockObject), /* tp_basicsize */
3080 0, /* tp_itemsize */
3081 (destructor)sock_dealloc, /* tp_dealloc */
3082 0, /* tp_print */
3083 0, /* tp_getattr */
3084 0, /* tp_setattr */
3085 0, /* tp_reserved */
3086 (reprfunc)sock_repr, /* tp_repr */
3087 0, /* tp_as_number */
3088 0, /* tp_as_sequence */
3089 0, /* tp_as_mapping */
3090 0, /* tp_hash */
3091 0, /* tp_call */
3092 0, /* tp_str */
3093 PyObject_GenericGetAttr, /* tp_getattro */
3094 0, /* tp_setattro */
3095 0, /* tp_as_buffer */
3096 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3097 sock_doc, /* tp_doc */
3098 0, /* tp_traverse */
3099 0, /* tp_clear */
3100 0, /* tp_richcompare */
3101 0, /* tp_weaklistoffset */
3102 0, /* tp_iter */
3103 0, /* tp_iternext */
3104 sock_methods, /* tp_methods */
3105 sock_memberlist, /* tp_members */
3106 0, /* tp_getset */
3107 0, /* tp_base */
3108 0, /* tp_dict */
3109 0, /* tp_descr_get */
3110 0, /* tp_descr_set */
3111 0, /* tp_dictoffset */
3112 sock_initobj, /* tp_init */
3113 PyType_GenericAlloc, /* tp_alloc */
3114 sock_new, /* tp_new */
3115 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003116};
3117
Guido van Rossum30a685f1991-06-27 15:51:29 +00003118
Guido van Rossum81194471991-07-27 21:42:02 +00003119/* Python interface to gethostname(). */
3120
3121/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003122static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003123socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003124{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003125#ifdef MS_WINDOWS
3126 /* Don't use winsock's gethostname, as this returns the ANSI
3127 version of the hostname, whereas we need a Unicode string.
3128 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003129 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
3130 DWORD size = sizeof(buf) / sizeof(wchar_t);
3131 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003132 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3133 if (GetLastError() == ERROR_MORE_DATA) {
3134 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003135 if (size == 0) /* XXX: I'm not sure how to handle this */
3136 return PyUnicode_FromUnicode(NULL, 0);
3137 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003138 if (!result)
3139 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003140 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3141 PyUnicode_AS_UNICODE(result),
3142 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003143 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003144 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003145 }
3146 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3147 }
Victor Stinner77af1722011-05-26 14:05:59 +02003148 return PyUnicode_FromUnicode(buf, size);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003149#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 char buf[1024];
3151 int res;
3152 Py_BEGIN_ALLOW_THREADS
3153 res = gethostname(buf, (int) sizeof buf - 1);
3154 Py_END_ALLOW_THREADS
3155 if (res < 0)
3156 return set_error();
3157 buf[sizeof buf - 1] = '\0';
3158 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003159#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003160}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003162PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003163"gethostname() -> string\n\
3164\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003165Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003166
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003167#ifdef HAVE_SETHOSTNAME
3168PyDoc_STRVAR(sethostname_doc,
3169"sethostname(name)\n\n\
3170Sets the hostname to name.");
3171
3172static PyObject *
3173socket_sethostname(PyObject *self, PyObject *args)
3174{
3175 PyObject *hnobj;
3176 Py_buffer buf;
3177 int res, flag = 0;
3178
3179 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3180 PyErr_Clear();
3181 if (!PyArg_ParseTuple(args, "O&:sethostname",
3182 PyUnicode_FSConverter, &hnobj))
3183 return NULL;
3184 flag = 1;
3185 }
3186 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3187 if (!res) {
3188 res = sethostname(buf.buf, buf.len);
3189 PyBuffer_Release(&buf);
3190 }
3191 if (flag)
3192 Py_DECREF(hnobj);
3193 if (res)
3194 return set_error();
3195 Py_RETURN_NONE;
3196}
3197#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003198
Guido van Rossum30a685f1991-06-27 15:51:29 +00003199/* Python interface to gethostbyname(name). */
3200
3201/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003202static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003203socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 char *name;
3206 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003207 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003208
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003209 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 return NULL;
3211 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003212 goto finally;
3213 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3214finally:
3215 PyMem_Free(name);
3216 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003217}
3218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003219PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003220"gethostbyname(host) -> address\n\
3221\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003222Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003223
3224
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003225/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3226
3227static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003228gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 char **pch;
3231 PyObject *rtn_tuple = (PyObject *)NULL;
3232 PyObject *name_list = (PyObject *)NULL;
3233 PyObject *addr_list = (PyObject *)NULL;
3234 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 if (h == NULL) {
3237 /* Let's get real error message to return */
3238 set_herror(h_errno);
3239 return NULL;
3240 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 if (h->h_addrtype != af) {
3243 /* Let's get real error message to return */
3244 PyErr_SetString(socket_error,
3245 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 return NULL;
3248 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 case AF_INET:
3253 if (alen < sizeof(struct sockaddr_in))
3254 return NULL;
3255 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003256
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003257#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 case AF_INET6:
3259 if (alen < sizeof(struct sockaddr_in6))
3260 return NULL;
3261 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003262#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 if ((name_list = PyList_New(0)) == NULL)
3267 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 if ((addr_list = PyList_New(0)) == NULL)
3270 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 /* SF #1511317: h_aliases can be NULL */
3273 if (h->h_aliases) {
3274 for (pch = h->h_aliases; *pch != NULL; pch++) {
3275 int status;
3276 tmp = PyUnicode_FromString(*pch);
3277 if (tmp == NULL)
3278 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 status = PyList_Append(name_list, tmp);
3281 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 if (status)
3284 goto err;
3285 }
3286 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3289 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 case AF_INET:
3294 {
3295 struct sockaddr_in sin;
3296 memset(&sin, 0, sizeof(sin));
3297 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003298#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3302 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 if (pch == h->h_addr_list && alen >= sizeof(sin))
3305 memcpy((char *) addr, &sin, sizeof(sin));
3306 break;
3307 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003308
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003309#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 case AF_INET6:
3311 {
3312 struct sockaddr_in6 sin6;
3313 memset(&sin6, 0, sizeof(sin6));
3314 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003315#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3319 tmp = makeipaddr((struct sockaddr *)&sin6,
3320 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3323 memcpy((char *) addr, &sin6, sizeof(sin6));
3324 break;
3325 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003326#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 default: /* can't happen */
3329 PyErr_SetString(socket_error,
3330 "unsupported address family");
3331 return NULL;
3332 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 if (tmp == NULL)
3335 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 status = PyList_Append(addr_list, tmp);
3338 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 if (status)
3341 goto err;
3342 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003345
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003346 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 Py_XDECREF(name_list);
3348 Py_XDECREF(addr_list);
3349 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003350}
3351
3352
3353/* Python interface to gethostbyname_ex(name). */
3354
3355/*ARGSUSED*/
3356static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003357socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 char *name;
3360 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003361#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003363#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003367 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003368#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003370#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003372#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 char buf[16384];
3374 int buf_len = (sizeof buf) - 1;
3375 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003376#endif
3377#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003379#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003380#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003381
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003382 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 return NULL;
3384 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003385 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003387#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003388#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3390 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003391#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003393#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 memset((void *) &data, '\0', sizeof(data));
3395 result = gethostbyname_r(name, &hp_allocated, &data);
3396 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003397#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003398#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003399#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003403#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 Py_END_ALLOW_THREADS
3405 /* Some C libraries would require addr.__ss_family instead of
3406 addr.ss_family.
3407 Therefore, we cast the sockaddr_storage into sockaddr to
3408 access sa_family. */
3409 sa = (struct sockaddr*)&addr;
3410 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3411 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003412#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003414#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003415finally:
3416 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003418}
3419
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003420PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003421"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3422\n\
3423Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003424for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003425
3426
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003427/* Python interface to gethostbyaddr(IP). */
3428
3429/*ARGSUSED*/
3430static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003431socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003432{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003433#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003435#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 struct sockaddr *sa = (struct sockaddr *)&addr;
3439 char *ip_num;
3440 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003441 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003442#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003444#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003446#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 /* glibcs up to 2.10 assume that the buf argument to
3448 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3449 does not ensure. The attribute below instructs the compiler
3450 to maintain this alignment. */
3451 char buf[16384] Py_ALIGNED(8);
3452 int buf_len = (sizeof buf) - 1;
3453 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003454#endif
3455#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003457#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003458#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 char *ap;
3460 int al;
3461 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003462
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003463 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 return NULL;
3465 af = AF_UNSPEC;
3466 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003467 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 af = sa->sa_family;
3469 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00003470 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 switch (af) {
3472 case AF_INET:
3473 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3474 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3475 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003476#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 case AF_INET6:
3478 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3479 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3480 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 default:
3483 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003484 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 }
3486 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003487#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003488#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 result = gethostbyaddr_r(ap, al, af,
3490 &hp_allocated, buf, buf_len,
3491 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003492#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 h = gethostbyaddr_r(ap, al, af,
3494 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003495#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 memset((void *) &data, '\0', sizeof(data));
3497 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3498 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003499#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003500#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003501#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003505#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 Py_END_ALLOW_THREADS
3507 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003508#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003509 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003510#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003511finally:
3512 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003514}
3515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003516PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003517"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3518\n\
3519Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003520for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003521
Guido van Rossum30a685f1991-06-27 15:51:29 +00003522
3523/* Python interface to getservbyname(name).
3524 This only returns the port number, since the other info is already
3525 known or not useful (like the list of aliases). */
3526
3527/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003529socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 char *name, *proto=NULL;
3532 struct servent *sp;
3533 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3534 return NULL;
3535 Py_BEGIN_ALLOW_THREADS
3536 sp = getservbyname(name, proto);
3537 Py_END_ALLOW_THREADS
3538 if (sp == NULL) {
3539 PyErr_SetString(socket_error, "service/proto not found");
3540 return NULL;
3541 }
3542 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003543}
3544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003545PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003546"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003547\n\
3548Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003549The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3550otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003551
Guido van Rossum30a685f1991-06-27 15:51:29 +00003552
Barry Warsaw11b91a02004-06-28 00:50:43 +00003553/* Python interface to getservbyport(port).
3554 This only returns the service name, since the other info is already
3555 known or not useful (like the list of aliases). */
3556
3557/*ARGSUSED*/
3558static PyObject *
3559socket_getservbyport(PyObject *self, PyObject *args)
3560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 int port;
3562 char *proto=NULL;
3563 struct servent *sp;
3564 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3565 return NULL;
3566 if (port < 0 || port > 0xffff) {
3567 PyErr_SetString(
3568 PyExc_OverflowError,
3569 "getservbyport: port must be 0-65535.");
3570 return NULL;
3571 }
3572 Py_BEGIN_ALLOW_THREADS
3573 sp = getservbyport(htons((short)port), proto);
3574 Py_END_ALLOW_THREADS
3575 if (sp == NULL) {
3576 PyErr_SetString(socket_error, "port/proto not found");
3577 return NULL;
3578 }
3579 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003580}
3581
3582PyDoc_STRVAR(getservbyport_doc,
3583"getservbyport(port[, protocolname]) -> string\n\
3584\n\
3585Return the service name from a port number and protocol name.\n\
3586The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3587otherwise any protocol will match.");
3588
Guido van Rossum3901d851996-12-19 16:35:04 +00003589/* Python interface to getprotobyname(name).
3590 This only returns the protocol number, since the other info is
3591 already known or not useful (like the list of aliases). */
3592
3593/*ARGSUSED*/
3594static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003595socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 char *name;
3598 struct protoent *sp;
3599 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3600 return NULL;
3601 Py_BEGIN_ALLOW_THREADS
3602 sp = getprotobyname(name);
3603 Py_END_ALLOW_THREADS
3604 if (sp == NULL) {
3605 PyErr_SetString(socket_error, "protocol not found");
3606 return NULL;
3607 }
3608 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00003609}
3610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003611PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003612"getprotobyname(name) -> integer\n\
3613\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003614Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003615
Guido van Rossum3901d851996-12-19 16:35:04 +00003616
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003617#ifndef NO_DUP
3618/* dup() function for socket fds */
3619
3620static PyObject *
3621socket_dup(PyObject *self, PyObject *fdobj)
3622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003623 SOCKET_T fd, newfd;
3624 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003625
3626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003627 fd = PyLong_AsSocket_t(fdobj);
3628 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3629 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 newfd = dup_socket(fd);
3632 if (newfd == INVALID_SOCKET)
3633 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 newfdobj = PyLong_FromSocket_t(newfd);
3636 if (newfdobj == NULL)
3637 SOCKETCLOSE(newfd);
3638 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003639}
3640
3641PyDoc_STRVAR(dup_doc,
3642"dup(integer) -> integer\n\
3643\n\
3644Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
3645sockets; on some platforms os.dup() won't work for socket file descriptors.");
3646#endif
3647
3648
Dave Cole331708b2004-08-09 04:51:41 +00003649#ifdef HAVE_SOCKETPAIR
3650/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003651 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003652 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003653
3654/*ARGSUSED*/
3655static PyObject *
3656socket_socketpair(PyObject *self, PyObject *args)
3657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 PySocketSockObject *s0 = NULL, *s1 = NULL;
3659 SOCKET_T sv[2];
3660 int family, type = SOCK_STREAM, proto = 0;
3661 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003662
3663#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003664 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003665#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3669 &family, &type, &proto))
3670 return NULL;
3671 /* Create a pair of socket fds */
3672 if (socketpair(family, type, proto, sv) < 0)
3673 return set_error();
3674 s0 = new_sockobject(sv[0], family, type, proto);
3675 if (s0 == NULL)
3676 goto finally;
3677 s1 = new_sockobject(sv[1], family, type, proto);
3678 if (s1 == NULL)
3679 goto finally;
3680 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003681
3682finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 if (res == NULL) {
3684 if (s0 == NULL)
3685 SOCKETCLOSE(sv[0]);
3686 if (s1 == NULL)
3687 SOCKETCLOSE(sv[1]);
3688 }
3689 Py_XDECREF(s0);
3690 Py_XDECREF(s1);
3691 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003692}
3693
3694PyDoc_STRVAR(socketpair_doc,
3695"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3696\n\
3697Create a pair of socket objects from the sockets returned by the platform\n\
3698socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003699The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003700AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003701
3702#endif /* HAVE_SOCKETPAIR */
3703
3704
Guido van Rossum006bf911996-06-12 04:04:55 +00003705static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003706socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3711 return NULL;
3712 }
3713 if (x1 < 0) {
3714 PyErr_SetString(PyExc_OverflowError,
3715 "can't convert negative number to unsigned long");
3716 return NULL;
3717 }
3718 x2 = (unsigned int)ntohs((unsigned short)x1);
3719 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003720}
3721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003722PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003723"ntohs(integer) -> integer\n\
3724\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003725Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003726
3727
Guido van Rossum006bf911996-06-12 04:04:55 +00003728static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003729socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 if (PyLong_Check(arg)) {
3734 x = PyLong_AsUnsignedLong(arg);
3735 if (x == (unsigned long) -1 && PyErr_Occurred())
3736 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003737#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 {
3739 unsigned long y;
3740 /* only want the trailing 32 bits */
3741 y = x & 0xFFFFFFFFUL;
3742 if (y ^ x)
3743 return PyErr_Format(PyExc_OverflowError,
3744 "long int larger than 32 bits");
3745 x = y;
3746 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 }
3749 else
3750 return PyErr_Format(PyExc_TypeError,
3751 "expected int/long, %s found",
3752 Py_TYPE(arg)->tp_name);
3753 if (x == (unsigned long) -1 && PyErr_Occurred())
3754 return NULL;
3755 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003756}
3757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003758PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003759"ntohl(integer) -> integer\n\
3760\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003761Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003762
3763
Guido van Rossum006bf911996-06-12 04:04:55 +00003764static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003765socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3770 return NULL;
3771 }
3772 if (x1 < 0) {
3773 PyErr_SetString(PyExc_OverflowError,
3774 "can't convert negative number to unsigned long");
3775 return NULL;
3776 }
3777 x2 = (unsigned int)htons((unsigned short)x1);
3778 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003779}
3780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003781PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003782"htons(integer) -> integer\n\
3783\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003784Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003785
3786
Guido van Rossum006bf911996-06-12 04:04:55 +00003787static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003788socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 if (PyLong_Check(arg)) {
3793 x = PyLong_AsUnsignedLong(arg);
3794 if (x == (unsigned long) -1 && PyErr_Occurred())
3795 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003796#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 {
3798 unsigned long y;
3799 /* only want the trailing 32 bits */
3800 y = x & 0xFFFFFFFFUL;
3801 if (y ^ x)
3802 return PyErr_Format(PyExc_OverflowError,
3803 "long int larger than 32 bits");
3804 x = y;
3805 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 }
3808 else
3809 return PyErr_Format(PyExc_TypeError,
3810 "expected int/long, %s found",
3811 Py_TYPE(arg)->tp_name);
3812 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003813}
3814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003815PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003816"htonl(integer) -> integer\n\
3817\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003818Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003819
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003820/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003822PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003823"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003824\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003825Convert 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 +00003826binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003827
3828static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003829socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003830{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003831#ifndef INADDR_NONE
3832#define INADDR_NONE (-1)
3833#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003834#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003836#endif
3837
3838#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00003839#if (SIZEOF_INT != 4)
3840#error "Not sure if in_addr_t exists and int is not 32-bits."
3841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003842 /* Have to use inet_addr() instead */
3843 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3848 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003849
Tim Peters1df9fdd2003-02-13 03:13:40 +00003850
3851#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00003852
3853#ifdef USE_INET_ATON_WEAKLINK
3854 if (inet_aton != NULL) {
3855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 if (inet_aton(ip_addr, &buf))
3857 return PyBytes_FromStringAndSize((char *)(&buf),
3858 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003860 PyErr_SetString(socket_error,
3861 "illegal IP address string passed to inet_aton");
3862 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003863
Thomas Wouters477c8d52006-05-27 19:21:47 +00003864#ifdef USE_INET_ATON_WEAKLINK
3865 } else {
3866#endif
3867
3868#endif
3869
3870#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 /* special-case this address as inet_addr might return INADDR_NONE
3873 * for this */
3874 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3875 packed_addr = 0xFFFFFFFF;
3876 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003880 if (packed_addr == INADDR_NONE) { /* invalid address */
3881 PyErr_SetString(socket_error,
3882 "illegal IP address string passed to inet_aton");
3883 return NULL;
3884 }
3885 }
3886 return PyBytes_FromStringAndSize((char *) &packed_addr,
3887 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00003888
3889#ifdef USE_INET_ATON_WEAKLINK
3890 }
3891#endif
3892
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003893#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003894}
3895
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003896PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003897"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003898\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003899Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003900
3901static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003902socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 char *packed_str;
3905 int addr_len;
3906 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003908 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
3909 return NULL;
3910 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 if (addr_len != sizeof(packed_addr)) {
3913 PyErr_SetString(socket_error,
3914 "packed IP wrong length for inet_ntoa");
3915 return NULL;
3916 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003921}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003922
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003923#ifdef HAVE_INET_PTON
3924
3925PyDoc_STRVAR(inet_pton_doc,
3926"inet_pton(af, ip) -> packed IP address string\n\
3927\n\
3928Convert an IP address from string format to a packed string suitable\n\
3929for use with low-level network functions.");
3930
3931static PyObject *
3932socket_inet_pton(PyObject *self, PyObject *args)
3933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003934 int af;
3935 char* ip;
3936 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003937#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003939#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3943 return NULL;
3944 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003945
Martin v. Löwis04697e82004-06-02 12:35:29 +00003946#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 if(af == AF_INET6) {
3948 PyErr_SetString(socket_error,
3949 "can't use AF_INET6, IPv6 is disabled");
3950 return NULL;
3951 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003952#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 retval = inet_pton(af, ip, packed);
3955 if (retval < 0) {
3956 PyErr_SetFromErrno(socket_error);
3957 return NULL;
3958 } else if (retval == 0) {
3959 PyErr_SetString(socket_error,
3960 "illegal IP address string passed to inet_pton");
3961 return NULL;
3962 } else if (af == AF_INET) {
3963 return PyBytes_FromStringAndSize(packed,
3964 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003965#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 } else if (af == AF_INET6) {
3967 return PyBytes_FromStringAndSize(packed,
3968 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003970 } else {
3971 PyErr_SetString(socket_error, "unknown address family");
3972 return NULL;
3973 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003974}
Thomas Wouters477c8d52006-05-27 19:21:47 +00003975
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003976PyDoc_STRVAR(inet_ntop_doc,
3977"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3978\n\
3979Convert a packed IP address of the given family to string format.");
3980
3981static PyObject *
3982socket_inet_ntop(PyObject *self, PyObject *args)
3983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003984 int af;
3985 char* packed;
3986 int len;
3987 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003988#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003990#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003992#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00003993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 /* Guarantee NUL-termination for PyUnicode_FromString() below */
3995 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
3998 return NULL;
3999 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 if (af == AF_INET) {
4002 if (len != sizeof(struct in_addr)) {
4003 PyErr_SetString(PyExc_ValueError,
4004 "invalid length of packed IP address string");
4005 return NULL;
4006 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004007#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 } else if (af == AF_INET6) {
4009 if (len != sizeof(struct in6_addr)) {
4010 PyErr_SetString(PyExc_ValueError,
4011 "invalid length of packed IP address string");
4012 return NULL;
4013 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004015 } else {
4016 PyErr_Format(PyExc_ValueError,
4017 "unknown address family %d", af);
4018 return NULL;
4019 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 retval = inet_ntop(af, packed, ip, sizeof(ip));
4022 if (!retval) {
4023 PyErr_SetFromErrno(socket_error);
4024 return NULL;
4025 } else {
4026 return PyUnicode_FromString(retval);
4027 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 /* NOTREACHED */
4030 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4031 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004032}
4033
4034#endif /* HAVE_INET_PTON */
4035
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004036/* Python interface to getaddrinfo(host, port). */
4037
4038/*ARGSUSED*/
4039static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004040socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004041{
Victor Stinner77af1722011-05-26 14:05:59 +02004042 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004043 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 struct addrinfo hints, *res;
4045 struct addrinfo *res0 = NULL;
4046 PyObject *hobj = NULL;
4047 PyObject *pobj = (PyObject *)NULL;
4048 char pbuf[30];
4049 char *hptr, *pptr;
4050 int family, socktype, protocol, flags;
4051 int error;
4052 PyObject *all = (PyObject *)NULL;
4053 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 family = socktype = protocol = flags = 0;
4056 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004057 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004058 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 &protocol, &flags)) {
4060 return NULL;
4061 }
4062 if (hobj == Py_None) {
4063 hptr = NULL;
4064 } else if (PyUnicode_Check(hobj)) {
4065 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4066 if (!idna)
4067 return NULL;
4068 assert(PyBytes_Check(idna));
4069 hptr = PyBytes_AS_STRING(idna);
4070 } else if (PyBytes_Check(hobj)) {
4071 hptr = PyBytes_AsString(hobj);
4072 } else {
4073 PyErr_SetString(PyExc_TypeError,
4074 "getaddrinfo() argument 1 must be string or None");
4075 return NULL;
4076 }
4077 if (PyLong_CheckExact(pobj)) {
4078 long value = PyLong_AsLong(pobj);
4079 if (value == -1 && PyErr_Occurred())
4080 goto err;
4081 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4082 pptr = pbuf;
4083 } else if (PyUnicode_Check(pobj)) {
4084 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004085 if (pptr == NULL)
4086 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004088 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 } else if (pobj == Py_None) {
4090 pptr = (char *)NULL;
4091 } else {
4092 PyErr_SetString(socket_error, "Int or String expected");
4093 goto err;
4094 }
4095 memset(&hints, 0, sizeof(hints));
4096 hints.ai_family = family;
4097 hints.ai_socktype = socktype;
4098 hints.ai_protocol = protocol;
4099 hints.ai_flags = flags;
4100 Py_BEGIN_ALLOW_THREADS
4101 ACQUIRE_GETADDRINFO_LOCK
4102 error = getaddrinfo(hptr, pptr, &hints, &res0);
4103 Py_END_ALLOW_THREADS
4104 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4105 if (error) {
4106 set_gaierror(error);
4107 goto err;
4108 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004110 if ((all = PyList_New(0)) == NULL)
4111 goto err;
4112 for (res = res0; res; res = res->ai_next) {
4113 PyObject *single;
4114 PyObject *addr =
4115 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4116 if (addr == NULL)
4117 goto err;
4118 single = Py_BuildValue("iiisO", res->ai_family,
4119 res->ai_socktype, res->ai_protocol,
4120 res->ai_canonname ? res->ai_canonname : "",
4121 addr);
4122 Py_DECREF(addr);
4123 if (single == NULL)
4124 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 if (PyList_Append(all, single))
4127 goto err;
4128 Py_XDECREF(single);
4129 }
4130 Py_XDECREF(idna);
4131 if (res0)
4132 freeaddrinfo(res0);
4133 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004134 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 Py_XDECREF(all);
4136 Py_XDECREF(idna);
4137 if (res0)
4138 freeaddrinfo(res0);
4139 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004140}
4141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004142PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004143"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4144 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004146Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004147
4148/* Python interface to getnameinfo(sa, flags). */
4149
4150/*ARGSUSED*/
4151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004152socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 PyObject *sa = (PyObject *)NULL;
4155 int flags;
4156 char *hostp;
4157 int port, flowinfo, scope_id;
4158 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4159 struct addrinfo hints, *res = NULL;
4160 int error;
4161 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 flags = flowinfo = scope_id = 0;
4164 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4165 return NULL;
4166 if (!PyTuple_Check(sa)) {
4167 PyErr_SetString(PyExc_TypeError,
4168 "getnameinfo() argument 1 must be a tuple");
4169 return NULL;
4170 }
4171 if (!PyArg_ParseTuple(sa, "si|ii",
4172 &hostp, &port, &flowinfo, &scope_id))
4173 return NULL;
4174 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4175 memset(&hints, 0, sizeof(hints));
4176 hints.ai_family = AF_UNSPEC;
4177 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004178 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 Py_BEGIN_ALLOW_THREADS
4180 ACQUIRE_GETADDRINFO_LOCK
4181 error = getaddrinfo(hostp, pbuf, &hints, &res);
4182 Py_END_ALLOW_THREADS
4183 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4184 if (error) {
4185 set_gaierror(error);
4186 goto fail;
4187 }
4188 if (res->ai_next) {
4189 PyErr_SetString(socket_error,
4190 "sockaddr resolved to multiple addresses");
4191 goto fail;
4192 }
4193 switch (res->ai_family) {
4194 case AF_INET:
4195 {
4196 if (PyTuple_GET_SIZE(sa) != 2) {
4197 PyErr_SetString(socket_error,
4198 "IPv4 sockaddr must be 2 tuple");
4199 goto fail;
4200 }
4201 break;
4202 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004203#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 case AF_INET6:
4205 {
4206 struct sockaddr_in6 *sin6;
4207 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4208 sin6->sin6_flowinfo = flowinfo;
4209 sin6->sin6_scope_id = scope_id;
4210 break;
4211 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004213 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004214 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4216 if (error) {
4217 set_gaierror(error);
4218 goto fail;
4219 }
4220 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004221
4222fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 if (res)
4224 freeaddrinfo(res);
4225 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226}
4227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004228PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004229"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004230\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004231Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004233
4234/* Python API to getting and setting the default timeout value. */
4235
4236static PyObject *
4237socket_getdefaulttimeout(PyObject *self)
4238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 if (defaulttimeout < 0.0) {
4240 Py_INCREF(Py_None);
4241 return Py_None;
4242 }
4243 else
4244 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004245}
4246
4247PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004248"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004249\n\
4250Returns the default timeout in floating seconds for new socket objects.\n\
4251A value of None indicates that new socket objects have no timeout.\n\
4252When the socket module is first imported, the default is None.");
4253
4254static PyObject *
4255socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 if (arg == Py_None)
4260 timeout = -1.0;
4261 else {
4262 timeout = PyFloat_AsDouble(arg);
4263 if (timeout < 0.0) {
4264 if (!PyErr_Occurred())
4265 PyErr_SetString(PyExc_ValueError,
4266 "Timeout value out of range");
4267 return NULL;
4268 }
4269 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 Py_INCREF(Py_None);
4274 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004275}
4276
4277PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004278"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004279\n\
4280Set the default timeout in floating seconds for new socket objects.\n\
4281A value of None indicates that new socket objects have no timeout.\n\
4282When the socket module is first imported, the default is None.");
4283
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004284#ifdef HAVE_IF_NAMEINDEX
4285/* Python API for getting interface indices and names */
4286
4287static PyObject *
4288socket_if_nameindex(PyObject *self, PyObject *arg)
4289{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004290 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02004291 int i;
4292 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02004293
Charles-François Natali60713592011-05-20 16:55:06 +02004294 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004295 if (ni == NULL) {
Charles-François Natali60713592011-05-20 16:55:06 +02004296 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004297 return NULL;
4298 }
4299
4300 list = PyList_New(0);
4301 if (list == NULL) {
4302 if_freenameindex(ni);
4303 return NULL;
4304 }
4305
Charles-François Natali60713592011-05-20 16:55:06 +02004306 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
4307 PyObject *ni_tuple = Py_BuildValue("IO&",
4308 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004309
4310 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
4311 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02004312 Py_DECREF(list);
4313 if_freenameindex(ni);
4314 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004315 }
4316 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004317 }
4318
4319 if_freenameindex(ni);
4320 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004321}
4322
4323PyDoc_STRVAR(if_nameindex_doc,
4324"if_nameindex()\n\
4325\n\
4326Returns a list of network interface information (index, name) tuples.");
4327
Charles-François Natali60713592011-05-20 16:55:06 +02004328static PyObject *
4329socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004330{
Charles-François Natali60713592011-05-20 16:55:06 +02004331 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004332 unsigned long index;
4333
Charles-François Natali60713592011-05-20 16:55:06 +02004334 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
4335 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004336 return NULL;
4337
Charles-François Natali60713592011-05-20 16:55:06 +02004338 index = if_nametoindex(PyBytes_AS_STRING(oname));
4339 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004340 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02004341 /* if_nametoindex() doesn't set errno */
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004342 PyErr_SetString(socket_error, "no interface with this name");
4343 return NULL;
4344 }
4345
4346 return PyLong_FromUnsignedLong(index);
4347}
4348
4349PyDoc_STRVAR(if_nametoindex_doc,
4350"if_nametoindex(if_name)\n\
4351\n\
4352Returns the interface index corresponding to the interface name if_name.");
4353
Charles-François Natali60713592011-05-20 16:55:06 +02004354static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004355socket_if_indextoname(PyObject *self, PyObject *arg)
4356{
Charles-François Natali60713592011-05-20 16:55:06 +02004357 unsigned long index;
4358 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004359
Charles-François Natali60713592011-05-20 16:55:06 +02004360 index = PyLong_AsUnsignedLong(arg);
4361 if (index == (unsigned long) -1)
4362 return NULL;
4363
4364 if (if_indextoname(index, name) == NULL) {
4365 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004366 return NULL;
4367 }
4368
Charles-François Natali60713592011-05-20 16:55:06 +02004369 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004370}
4371
4372PyDoc_STRVAR(if_indextoname_doc,
4373"if_indextoname(if_index)\n\
4374\n\
4375Returns the interface name corresponding to the interface index if_index.");
4376
4377#endif /* HAVE_IF_NAMEINDEX */
4378
4379
Guido van Rossum30a685f1991-06-27 15:51:29 +00004380/* List of functions exported by this module. */
4381
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004382static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 {"gethostbyname", socket_gethostbyname,
4384 METH_VARARGS, gethostbyname_doc},
4385 {"gethostbyname_ex", socket_gethostbyname_ex,
4386 METH_VARARGS, ghbn_ex_doc},
4387 {"gethostbyaddr", socket_gethostbyaddr,
4388 METH_VARARGS, gethostbyaddr_doc},
4389 {"gethostname", socket_gethostname,
4390 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004391#ifdef HAVE_SETHOSTNAME
4392 {"sethostname", socket_sethostname,
4393 METH_VARARGS, sethostname_doc},
4394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 {"getservbyname", socket_getservbyname,
4396 METH_VARARGS, getservbyname_doc},
4397 {"getservbyport", socket_getservbyport,
4398 METH_VARARGS, getservbyport_doc},
4399 {"getprotobyname", socket_getprotobyname,
4400 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004401#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 {"dup", socket_dup,
4403 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004404#endif
Dave Cole331708b2004-08-09 04:51:41 +00004405#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004406 {"socketpair", socket_socketpair,
4407 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 {"ntohs", socket_ntohs,
4410 METH_VARARGS, ntohs_doc},
4411 {"ntohl", socket_ntohl,
4412 METH_O, ntohl_doc},
4413 {"htons", socket_htons,
4414 METH_VARARGS, htons_doc},
4415 {"htonl", socket_htonl,
4416 METH_O, htonl_doc},
4417 {"inet_aton", socket_inet_aton,
4418 METH_VARARGS, inet_aton_doc},
4419 {"inet_ntoa", socket_inet_ntoa,
4420 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004421#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 {"inet_pton", socket_inet_pton,
4423 METH_VARARGS, inet_pton_doc},
4424 {"inet_ntop", socket_inet_ntop,
4425 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004426#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004427 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
4428 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 {"getnameinfo", socket_getnameinfo,
4430 METH_VARARGS, getnameinfo_doc},
4431 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4432 METH_NOARGS, getdefaulttimeout_doc},
4433 {"setdefaulttimeout", socket_setdefaulttimeout,
4434 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004435#ifdef HAVE_IF_NAMEINDEX
4436 {"if_nameindex", socket_if_nameindex,
4437 METH_NOARGS, if_nameindex_doc},
4438 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02004439 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004440 {"if_indextoname", socket_if_indextoname,
4441 METH_O, if_indextoname_doc},
4442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004444};
4445
Guido van Rossum30a685f1991-06-27 15:51:29 +00004446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004447#ifdef MS_WINDOWS
4448#define OS_INIT_DEFINED
4449
4450/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004451
4452static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004453os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004456}
4457
4458static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004459os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 WSADATA WSAData;
4462 int ret;
4463 ret = WSAStartup(0x0101, &WSAData);
4464 switch (ret) {
4465 case 0: /* No error */
4466 Py_AtExit(os_cleanup);
4467 return 1; /* Success */
4468 case WSASYSNOTREADY:
4469 PyErr_SetString(PyExc_ImportError,
4470 "WSAStartup failed: network not ready");
4471 break;
4472 case WSAVERNOTSUPPORTED:
4473 case WSAEINVAL:
4474 PyErr_SetString(
4475 PyExc_ImportError,
4476 "WSAStartup failed: requested version not supported");
4477 break;
4478 default:
4479 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
4480 break;
4481 }
4482 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004483}
4484
Guido van Rossum8d665e61996-06-26 18:22:49 +00004485#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004486
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004487
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004488#ifdef PYOS_OS2
4489#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004490
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004491/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004492
4493static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004494os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004495{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004496#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 if (rc == 0) {
4500 return 1; /* Success */
4501 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004506#else
Ezio Melotti13925002011-03-16 11:05:33 +02004507 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004509#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004510}
4511
4512#endif /* PYOS_OS2 */
4513
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004514
4515#ifndef OS_INIT_DEFINED
4516static int
4517os_init(void)
4518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004520}
4521#endif
4522
4523
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004524/* C API table - always add new things to the end for binary
4525 compatibility. */
4526static
4527PySocketModule_APIObject PySocketModuleAPI =
4528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00004530 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004532};
4533
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004534
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004535/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004537 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004538 "socket.py" which implements some additional functionality.
4539 The import of "_socket" may fail with an ImportError exception if
4540 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02004541 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004542 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004543*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004545PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004546"Implementation module for socket operations.\n\
4547\n\
4548See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004549
Martin v. Löwis1a214512008-06-11 05:26:20 +00004550static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 PyModuleDef_HEAD_INIT,
4552 PySocket_MODULE_NAME,
4553 socket_doc,
4554 -1,
4555 socket_methods,
4556 NULL,
4557 NULL,
4558 NULL,
4559 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004560};
4561
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004562PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004563PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 if (!os_init())
4568 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 Py_TYPE(&sock_type) = &PyType_Type;
4571 m = PyModule_Create(&socketmodule);
4572 if (m == NULL)
4573 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 socket_error = PyErr_NewException("socket.error",
4576 PyExc_IOError, NULL);
4577 if (socket_error == NULL)
4578 return NULL;
4579 PySocketModuleAPI.error = socket_error;
4580 Py_INCREF(socket_error);
4581 PyModule_AddObject(m, "error", socket_error);
4582 socket_herror = PyErr_NewException("socket.herror",
4583 socket_error, NULL);
4584 if (socket_herror == NULL)
4585 return NULL;
4586 Py_INCREF(socket_herror);
4587 PyModule_AddObject(m, "herror", socket_herror);
4588 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4589 NULL);
4590 if (socket_gaierror == NULL)
4591 return NULL;
4592 Py_INCREF(socket_gaierror);
4593 PyModule_AddObject(m, "gaierror", socket_gaierror);
4594 socket_timeout = PyErr_NewException("socket.timeout",
4595 socket_error, NULL);
4596 if (socket_timeout == NULL)
4597 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00004598 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 Py_INCREF(socket_timeout);
4600 PyModule_AddObject(m, "timeout", socket_timeout);
4601 Py_INCREF((PyObject *)&sock_type);
4602 if (PyModule_AddObject(m, "SocketType",
4603 (PyObject *)&sock_type) != 0)
4604 return NULL;
4605 Py_INCREF((PyObject *)&sock_type);
4606 if (PyModule_AddObject(m, "socket",
4607 (PyObject *)&sock_type) != 0)
4608 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00004609
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004610#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004612#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 Py_INCREF(has_ipv6);
4616 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 /* Export C API */
4619 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4620 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4621 ) != 0)
4622 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004625#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004629#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004631#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004632#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004634#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004635#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 /* Amateur Radio AX.25 */
4637 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004638#endif
4639#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004641#endif
4642#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 /* Appletalk DDP */
4644 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004645#endif
4646#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 /* Amateur radio NetROM */
4648 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004649#endif
4650#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 /* Multiprotocol bridge */
4652 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004653#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004654#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 /* ATM PVCs */
4656 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004657#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004658#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 /* Reserved for Werner's ATM */
4660 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004661#endif
4662#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 /* Reserved for X.25 project */
4664 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004665#endif
4666#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004668#endif
4669#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 /* Amateur Radio X.25 PLP */
4671 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004672#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004673#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 /* Reserved for DECnet project */
4675 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004676#endif
4677#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 /* Reserved for 802.2LLC project */
4679 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004680#endif
4681#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 /* Security callback pseudo AF */
4683 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004684#endif
4685#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 /* PF_KEY key management API */
4687 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004688#endif
4689#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 /* */
4691 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4692 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004693#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004695#endif
4696#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4700 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004701#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004703#endif
4704#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004706#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004707#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004709#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004710#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004712#endif
4713#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004716 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004717#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004719#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004720#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004722#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004723#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004724#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 /* Alias to emulate 4.4BSD */
4726 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004727#endif
4728#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 /* Ash */
4730 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004731#endif
4732#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 /* Acorn Econet */
4734 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004735#endif
4736#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 /* ATM SVCs */
4738 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004739#endif
4740#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004741 /* Linux SNA Project (nutters!) */
4742 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004743#endif
4744#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 /* IRDA sockets */
4746 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004747#endif
4748#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 /* PPPoX sockets */
4750 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004751#endif
4752#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 /* Wanpipe API Sockets */
4754 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004755#endif
4756#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 /* Linux LLC */
4758 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004759#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004760
Hye-Shik Chang81268602004-02-02 06:05:24 +00004761#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4763 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4764 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4765 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004766#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004768#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004769#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004770#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00004772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4774 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4777 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4778 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004779#endif
4780
Antoine Pitroub156a462010-10-27 20:13:57 +00004781#ifdef AF_PACKET
4782 PyModule_AddIntMacro(m, AF_PACKET);
4783#endif
4784#ifdef PF_PACKET
4785 PyModule_AddIntMacro(m, PF_PACKET);
4786#endif
4787#ifdef PACKET_HOST
4788 PyModule_AddIntMacro(m, PACKET_HOST);
4789#endif
4790#ifdef PACKET_BROADCAST
4791 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4792#endif
4793#ifdef PACKET_MULTICAST
4794 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4795#endif
4796#ifdef PACKET_OTHERHOST
4797 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4798#endif
4799#ifdef PACKET_OUTGOING
4800 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4801#endif
4802#ifdef PACKET_LOOPBACK
4803 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4804#endif
4805#ifdef PACKET_FASTROUTE
4806 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004807#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004808
Christian Heimes043d6f62008-01-07 17:19:16 +00004809#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00004811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 /* for addresses */
4813 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4814 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4815 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00004816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4818 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4819 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00004820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 /* for setsockopt() */
4822 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4823 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4824 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4825 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4826 TIPC_DEST_DROPPABLE);
4827 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00004828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004829 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4830 TIPC_LOW_IMPORTANCE);
4831 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4832 TIPC_MEDIUM_IMPORTANCE);
4833 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4834 TIPC_HIGH_IMPORTANCE);
4835 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4836 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00004837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 /* for subscriptions */
4839 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4840 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00004841#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 /* doesn't seem to be available everywhere */
4843 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00004844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4846 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4847 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4848 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4849 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4850 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00004851#endif
4852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 /* Socket types */
4854 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4855 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004856/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4858 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004859#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004861#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00004862#ifdef SOCK_CLOEXEC
4863 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
4864#endif
4865#ifdef SOCK_NONBLOCK
4866 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
4867#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869#ifdef SO_DEBUG
4870 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872#ifdef SO_ACCEPTCONN
4873 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875#ifdef SO_REUSEADDR
4876 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004877#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004878#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004880#endif
4881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882#ifdef SO_KEEPALIVE
4883 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885#ifdef SO_DONTROUTE
4886 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888#ifdef SO_BROADCAST
4889 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891#ifdef SO_USELOOPBACK
4892 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894#ifdef SO_LINGER
4895 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897#ifdef SO_OOBINLINE
4898 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900#ifdef SO_REUSEPORT
4901 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903#ifdef SO_SNDBUF
4904 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906#ifdef SO_RCVBUF
4907 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909#ifdef SO_SNDLOWAT
4910 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912#ifdef SO_RCVLOWAT
4913 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915#ifdef SO_SNDTIMEO
4916 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918#ifdef SO_RCVTIMEO
4919 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921#ifdef SO_ERROR
4922 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004924#ifdef SO_TYPE
4925 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927#ifdef SO_SETFIB
4928 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00004929#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 /* Maximum number of connections for "listen" */
4932#ifdef SOMAXCONN
4933 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004934#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004936#endif
4937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 /* Flags for send, recv */
4939#ifdef MSG_OOB
4940 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942#ifdef MSG_PEEK
4943 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945#ifdef MSG_DONTROUTE
4946 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948#ifdef MSG_DONTWAIT
4949 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951#ifdef MSG_EOR
4952 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954#ifdef MSG_TRUNC
4955 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957#ifdef MSG_CTRUNC
4958 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960#ifdef MSG_WAITALL
4961 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963#ifdef MSG_BTAG
4964 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966#ifdef MSG_ETAG
4967 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#endif
4969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 /* Protocol level and numbers, usable for [gs]etsockopt */
4971#ifdef SOL_SOCKET
4972 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974#ifdef SOL_IP
4975 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004976#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979#ifdef SOL_IPX
4980 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982#ifdef SOL_AX25
4983 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985#ifdef SOL_ATALK
4986 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988#ifdef SOL_NETROM
4989 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991#ifdef SOL_ROSE
4992 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994#ifdef SOL_TCP
4995 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004996#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999#ifdef SOL_UDP
5000 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005001#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004#ifdef IPPROTO_IP
5005 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005006#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009#ifdef IPPROTO_HOPOPTS
5010 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012#ifdef IPPROTO_ICMP
5013 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005014#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017#ifdef IPPROTO_IGMP
5018 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020#ifdef IPPROTO_GGP
5021 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023#ifdef IPPROTO_IPV4
5024 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026#ifdef IPPROTO_IPV6
5027 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029#ifdef IPPROTO_IPIP
5030 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032#ifdef IPPROTO_TCP
5033 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005034#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037#ifdef IPPROTO_EGP
5038 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040#ifdef IPPROTO_PUP
5041 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043#ifdef IPPROTO_UDP
5044 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005045#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048#ifdef IPPROTO_IDP
5049 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051#ifdef IPPROTO_HELLO
5052 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054#ifdef IPPROTO_ND
5055 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057#ifdef IPPROTO_TP
5058 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060#ifdef IPPROTO_IPV6
5061 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063#ifdef IPPROTO_ROUTING
5064 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066#ifdef IPPROTO_FRAGMENT
5067 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069#ifdef IPPROTO_RSVP
5070 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072#ifdef IPPROTO_GRE
5073 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075#ifdef IPPROTO_ESP
5076 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078#ifdef IPPROTO_AH
5079 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081#ifdef IPPROTO_MOBILE
5082 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084#ifdef IPPROTO_ICMPV6
5085 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087#ifdef IPPROTO_NONE
5088 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090#ifdef IPPROTO_DSTOPTS
5091 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093#ifdef IPPROTO_XTP
5094 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096#ifdef IPPROTO_EON
5097 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099#ifdef IPPROTO_PIM
5100 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102#ifdef IPPROTO_IPCOMP
5103 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105#ifdef IPPROTO_VRRP
5106 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108#ifdef IPPROTO_BIP
5109 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005110#endif
5111/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112#ifdef IPPROTO_RAW
5113 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117#ifdef IPPROTO_MAX
5118 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005119#endif
5120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 /* Some port configuration */
5122#ifdef IPPORT_RESERVED
5123 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127#ifdef IPPORT_USERRESERVED
5128 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005129#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005131#endif
5132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 /* Some reserved IP v.4 addresses */
5134#ifdef INADDR_ANY
5135 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005136#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139#ifdef INADDR_BROADCAST
5140 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005141#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144#ifdef INADDR_LOOPBACK
5145 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149#ifdef INADDR_UNSPEC_GROUP
5150 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005151#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154#ifdef INADDR_ALLHOSTS_GROUP
5155 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5156 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005157#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160#ifdef INADDR_MAX_LOCAL_GROUP
5161 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5162 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005163#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166#ifdef INADDR_NONE
5167 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005168#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005170#endif
5171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 /* IPv4 [gs]etsockopt options */
5173#ifdef IP_OPTIONS
5174 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176#ifdef IP_HDRINCL
5177 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179#ifdef IP_TOS
5180 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182#ifdef IP_TTL
5183 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185#ifdef IP_RECVOPTS
5186 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188#ifdef IP_RECVRETOPTS
5189 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191#ifdef IP_RECVDSTADDR
5192 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194#ifdef IP_RETOPTS
5195 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197#ifdef IP_MULTICAST_IF
5198 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200#ifdef IP_MULTICAST_TTL
5201 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203#ifdef IP_MULTICAST_LOOP
5204 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206#ifdef IP_ADD_MEMBERSHIP
5207 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209#ifdef IP_DROP_MEMBERSHIP
5210 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212#ifdef IP_DEFAULT_MULTICAST_TTL
5213 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5214 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216#ifdef IP_DEFAULT_MULTICAST_LOOP
5217 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5218 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220#ifdef IP_MAX_MEMBERSHIPS
5221 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005222#endif
5223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5225#ifdef IPV6_JOIN_GROUP
5226 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228#ifdef IPV6_LEAVE_GROUP
5229 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231#ifdef IPV6_MULTICAST_HOPS
5232 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234#ifdef IPV6_MULTICAST_IF
5235 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237#ifdef IPV6_MULTICAST_LOOP
5238 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240#ifdef IPV6_UNICAST_HOPS
5241 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005244#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005248#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005250#endif
5251#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005253#endif
5254#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005256#endif
5257#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005259#endif
5260#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005262#endif
5263#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005265#endif
5266#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005268#endif
5269#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005271#endif
5272#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005274#endif
5275#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005277#endif
5278#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005280#endif
5281#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005283#endif
5284#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
5287#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
5290#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005292#endif
5293#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005295#endif
5296#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
5299#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005301#endif
5302#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#endif
5305#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005307#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 /* TCP options */
5310#ifdef TCP_NODELAY
5311 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313#ifdef TCP_MAXSEG
5314 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316#ifdef TCP_CORK
5317 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319#ifdef TCP_KEEPIDLE
5320 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322#ifdef TCP_KEEPINTVL
5323 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325#ifdef TCP_KEEPCNT
5326 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328#ifdef TCP_SYNCNT
5329 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331#ifdef TCP_LINGER2
5332 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334#ifdef TCP_DEFER_ACCEPT
5335 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337#ifdef TCP_WINDOW_CLAMP
5338 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340#ifdef TCP_INFO
5341 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343#ifdef TCP_QUICKACK
5344 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005345#endif
5346
Guido van Rossum09be4091999-08-09 14:40:40 +00005347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 /* IPX options */
5349#ifdef IPX_TYPE
5350 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005351#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005354#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005356#endif
5357#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005359#endif
5360#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005362#endif
5363#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005365#endif
5366#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005368#endif
5369#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005371#endif
5372#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005374#endif
5375#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005377#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005378#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005380#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005381#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005383#endif
5384#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005386#endif
5387#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005389#endif
5390#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392#endif
5393#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005395#endif
5396#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398#endif
5399#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005401#endif
5402#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005404#endif
5405#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005407#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005408#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005410#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005411#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413#endif
5414#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005416#endif
5417#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419#endif
5420#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005422#endif
5423#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005425#endif
5426#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428#endif
5429#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431#endif
5432#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005434#endif
5435#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005437#endif
5438#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
5441#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005443#endif
5444#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005446#endif
5447#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
5450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005452#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005454#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005456#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005458#endif
5459#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005461#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005463#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005465#endif
5466#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005468#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005470#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005472#endif
5473
Christian Heimesfaf2f632008-01-06 16:59:19 +00005474#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 {
5476 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5477 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5478 int i;
5479 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5480 PyObject *tmp;
5481 tmp = PyLong_FromUnsignedLong(codes[i]);
5482 if (tmp == NULL)
5483 return NULL;
5484 PyModule_AddObject(m, names[i], tmp);
5485 }
5486 }
5487 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5488 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5489 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005490#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005492#endif
5493#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005495#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00005496#endif /* _MSTCPIP_ */
5497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005499#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005503}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005504
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005505
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005506#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00005507#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005508
5509/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005510/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005511
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005512int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005513inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00005516#if (SIZEOF_INT != 4)
5517#error "Not sure if in_addr_t exists and int is not 32-bits."
5518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 unsigned int packed_addr;
5520 packed_addr = inet_addr(src);
5521 if (packed_addr == INADDR_NONE)
5522 return 0;
5523 memcpy(dst, &packed_addr, 4);
5524 return 1;
5525 }
5526 /* Should set errno to EAFNOSUPPORT */
5527 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005528}
5529
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005530const char *
5531inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 if (af == AF_INET) {
5534 struct in_addr packed_addr;
5535 if (size < 16)
5536 /* Should set errno to ENOSPC. */
5537 return NULL;
5538 memcpy(&packed_addr, src, sizeof(packed_addr));
5539 return strncpy(dst, inet_ntoa(packed_addr), size);
5540 }
5541 /* Should set errno to EAFNOSUPPORT */
5542 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005543}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005544
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005545#endif
Christian Heimesb6150692007-11-15 23:37:07 +00005546#endif