blob: c5215211f5b96928e7ff70a85f848eb76618cb80 [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 Heimesfb2d25a2008-01-07 16:12:44 +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 Pitrouc83ea132010-05-09 14:46:46 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000022 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000023- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
Antoine Pitrouc83ea132010-05-09 14:46:46 +000024 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000025- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000026- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000027- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000028- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000029- socket.getservbyname(servicename[, protocolname]) --> port number
30- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000031- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000032- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000033- socket.ntohs(16 bit value) --> new int object
34- socket.ntohl(32 bit value) --> new int object
35- socket.htons(16 bit value) --> new int object
36- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000037- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouc83ea132010-05-09 14:46:46 +000038 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000039- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000041- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000042- socket.inet_aton(IP address) -> 32-bit packed IP representation
43- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000044- socket.getdefaulttimeout() -> None | float
45- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046- an Internet socket address is a pair (hostname, port)
47 where hostname can be anything recognized by gethostbyname()
48 (including the dd.dd.dd.dd notation) and port is in host byte order
49- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000051- an AF_PACKET socket address is a tuple containing a string
52 specifying the ethernet interface and an integer specifying
53 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000054 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000055 specify packet-type and ha-type/addr.
Christian Heimesfb2d25a2008-01-07 16:12:44 +000056- an AF_TIPC socket address is expressed as
57 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000058 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimesfb2d25a2008-01-07 16:12:44 +000059 and scope can be one of:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimesfb2d25a2008-01-07 16:12:44 +000061 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000062 if addr_type is TIPC_ADDR_NAME:
63 v1 is the server type
64 v2 is the port identifier
65 v3 is ignored
66 if addr_type is TIPC_ADDR_NAMESEQ:
67 v1 is the server type
68 v2 is the lower port number
69 v3 is the upper port number
70 if addr_type is TIPC_ADDR_ID:
71 v1 is the node
72 v2 is the ref
73 v3 is ignored
Christian Heimesfb2d25a2008-01-07 16:12:44 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000076Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078- names starting with sock_ are socket object methods
79- names starting with socket_ are module-level functions
80- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000081
Guido van Rossum6574b3e1991-06-25 21:36:08 +000082*/
83
Ronald Oussorend06b6f22006-04-23 11:59:25 +000084#ifdef __APPLE__
85 /*
86 * inet_aton is not available on OSX 10.3, yet we want to use a binary
87 * that was build on 10.4 or later to work on that release, weak linking
88 * comes to the rescue.
89 */
90# pragma weak inet_aton
91#endif
92
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000093#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000094#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000096#undef MAX
97#define MAX(x, y) ((x) < (y) ? (y) : (x))
98
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000099/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101"socket([family[, type[, proto]]]) -> socket object\n\
102\n\
103Open a socket of the given type. The family argument specifies the\n\
104address family; it defaults to AF_INET. The type argument specifies\n\
105whether this is a stream (SOCK_STREAM, this is the default)\n\
106or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
107specifying the default protocol. Keyword arguments are accepted.\n\
108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
113accept() -- accept a connection, returning new socket and client address\n\
114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
118dup() -- return a new socket object identical to the current one [*]\n\
119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
124listen(n) -- start listening for incoming connections\n\
125makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
126recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000127recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000128recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000129recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000130 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000131sendall(data[, flags]) -- send all data\n\
132send(data[, flags]) -- send data, may not send all of it\n\
133sendto(data[, flags], addr) -- send data to a given address\n\
134setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
135setsockopt(level, optname, value) -- set socket options\n\
136settimeout(None | float) -- set or clear the timeout\n\
137shutdown(how) -- shut down traffic in one or both directions\n\
138\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000140
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000141/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000142 I hope some day someone can clean this up please... */
143
Guido van Rossum9376b741999-09-15 22:01:40 +0000144/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
145 script doesn't get this right, so we hardcode some platform checks below.
146 On the other hand, not all Linux versions agree, so there the settings
147 computed by the configure script are needed! */
148
149#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150# undef HAVE_GETHOSTBYNAME_R_3_ARG
151# undef HAVE_GETHOSTBYNAME_R_5_ARG
152# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000153#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000154
Guido van Rossum7a122991999-04-13 04:07:32 +0000155#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000156# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000157#endif
158
Guido van Rossume7de2061999-03-24 17:24:33 +0000159#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160# if defined(_AIX) || defined(__osf__)
161# define HAVE_GETHOSTBYNAME_R_3_ARG
162# elif defined(__sun) || defined(__sgi)
163# define HAVE_GETHOSTBYNAME_R_5_ARG
164# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000165/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# else
167# undef HAVE_GETHOSTBYNAME_R
168# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000169#endif
170
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000171#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
172 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000173# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000174#endif
175
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000176/* To use __FreeBSD_version */
177#ifdef HAVE_SYS_PARAM_H
178#include <sys/param.h>
179#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000180/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000181 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182#if defined(WITH_THREAD) && (defined(__APPLE__) || \
183 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000184 defined(__OpenBSD__) || defined(__NetBSD__) || \
185 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186#define USE_GETADDRINFO_LOCK
187#endif
188
189#ifdef USE_GETADDRINFO_LOCK
190#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
191#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
192#else
193#define ACQUIRE_GETADDRINFO_LOCK
194#define RELEASE_GETADDRINFO_LOCK
195#endif
196
197#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000198# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000199#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000200
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000201#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000202# include <types.h>
203# include <io.h>
204# include <sys/ioctl.h>
205# include <utils.h>
206# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#endif
208
Martin v. Löwis9e437302002-12-06 12:57:26 +0000209#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000210# include <ioctl.h>
211#endif
212
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000214# define INCL_DOS
215# define INCL_DOSERRORS
216# define INCL_NOPMAPI
217# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000218#endif
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Martin Blais2856e5f2006-05-26 12:03:27 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Martin Blais2856e5f2006-05-26 12:03:27 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000255/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000257#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258
259/* Addressing includes */
260
Guido van Rossum6f489d91996-06-28 20:15:15 +0000261#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
263/* Non-MS WINDOWS includes */
264# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000265
Guido van Rossum9376b741999-09-15 22:01:40 +0000266/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267# ifdef __BEOS__
268# include <net/netdb.h>
269# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
270# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000271typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# ifndef RISCOS
277# include <fcntl.h>
278# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000279# include <sys/ioctl.h>
280# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000281# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000282int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000283# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284# endif
285
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000286#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000287
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000289# ifdef HAVE_FCNTL_H
290# include <fcntl.h>
291# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000292
Jeremy Hylton22308652001-02-02 03:23:09 +0000293#endif
294
Skip Montanaro7befb992004-02-10 16:50:21 +0000295#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000296
297#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000298# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000299#endif
300
Neal Norwitz39d22e52002-11-02 19:55:21 +0000301#ifndef O_NONBLOCK
302# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000303#endif
304
Trent Micka708d6e2004-09-07 17:48:26 +0000305/* include Python's addrinfo.h unless it causes trouble */
306#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
307 /* Do not include addinfo.h on some newer IRIX versions.
308 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
309 * for example, but not by 6.5.10.
310 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000311#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000312 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
313 * EAI_* constants are defined in (the already included) ws2tcpip.h.
314 */
315#else
316# include "addrinfo.h"
317#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000318
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000319#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000320#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000321int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000322const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000323#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000324#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000325
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000326#ifdef __APPLE__
327/* On OS X, getaddrinfo returns no error indication of lookup
328 failure, so we must use the emulation instead of the libinfo
329 implementation. Unfortunately, performing an autoconf test
330 for this bug would require DNS access for the machine performing
331 the configuration, which is not acceptable. Therefore, we
332 determine the bug just by checking for __APPLE__. If this bug
333 gets ever fixed, perhaps checking for sys/version.h would be
334 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000335#ifndef HAVE_GETNAMEINFO
336/* This bug seems to be fixed in Jaguar. Ths easiest way I could
337 Find to check for Jaguar is that it has getnameinfo(), which
338 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000341
342#ifdef HAVE_INET_ATON
343#define USE_INET_ATON_WEAKLINK
344#endif
345
Jack Jansen84262fb2002-07-02 14:40:42 +0000346#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000349#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000350/* avoid clashes with the C library definition of the symbol. */
351#define getaddrinfo fake_getaddrinfo
352#define gai_strerror fake_gai_strerror
353#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000354#include "getaddrinfo.c"
355#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000358#include "getnameinfo.c"
359#endif
360
Guido van Rossumbcc20741998-08-04 22:53:56 +0000361#if defined(MS_WINDOWS) || defined(__BEOS__)
362/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000363/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000364#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000365#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000366#endif
367
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000368#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000369#define EAFNOSUPPORT WSAEAFNOSUPPORT
370#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000371#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000372
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000373#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000374#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000375#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000376#endif
377
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000378#ifndef SOCKETCLOSE
379#define SOCKETCLOSE close
380#endif
381
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000382#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000383#define USE_BLUETOOTH 1
384#if defined(__FreeBSD__)
385#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
386#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000387#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000388#define SOL_HCI SOL_HCI_RAW
389#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#define sockaddr_l2 sockaddr_l2cap
391#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000392#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000393#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
394#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000395#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000396#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000397#define sockaddr_l2 sockaddr_bt
398#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000399#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000400#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000401#define SOL_HCI BTPROTO_HCI
402#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000403#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
404#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000405#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000406#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000407#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
409#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000410#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000411#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
412#endif
413#endif
414
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000415#ifdef __VMS
416/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
417#define SEGMENT_SIZE (32 * 1024 -1)
418#endif
419
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000420#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000421
Martin v. Löwise9416172003-05-03 10:12:45 +0000422/*
423 * Constants for getnameinfo()
424 */
425#if !defined(NI_MAXHOST)
426#define NI_MAXHOST 1025
427#endif
428#if !defined(NI_MAXSERV)
429#define NI_MAXSERV 32
430#endif
431
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000432/* XXX There's a problem here: *static* functions are not supposed to have
433 a Py prefix (or use CapitalizedWords). Later... */
434
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435/* Global variable holding the exception type for errors detected
436 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000437static PyObject *socket_error;
438static PyObject *socket_herror;
439static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000440static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441
Guido van Rossum48a680c2001-03-02 06:34:14 +0000442#ifdef RISCOS
443/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
444static int taskwindow;
445#endif
446
Tim Peters643a7fc2002-02-17 04:13:21 +0000447/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000448 The sock_type variable contains pointers to various functions,
449 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000450 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000451static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000452
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000453#if defined(HAVE_POLL_H)
454#include <poll.h>
455#elif defined(HAVE_SYS_POLL_H)
456#include <sys/poll.h>
457#endif
458
Charles-François Natalifda7b372011-08-28 16:22:33 +0200459#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000460/* Instead of select(), we'll use poll() since poll() works on any fd. */
461#define IS_SELECTABLE(s) 1
462/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000463#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200464/* If there's no timeout left, we don't have to call select, so it's a safe,
465 * little white lie. */
466#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000467#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000468
469static PyObject*
470select_error(void)
471{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000472 PyErr_SetString(socket_error, "unable to select on socket");
473 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000474}
475
Guido van Rossum30a685f1991-06-27 15:51:29 +0000476/* Convenience function to raise an error according to errno
477 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000478
Guido van Rossum73624e91994-10-10 17:59:00 +0000479static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000480set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000481{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000482#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000483 int err_no = WSAGetLastError();
484 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
485 recognizes the error codes used by both GetLastError() and
486 WSAGetLastError */
487 if (err_no)
488 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000489#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000490
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000491#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000492 if (sock_errno() != NO_ERROR) {
493 APIRET rc;
494 ULONG msglen;
495 char outbuf[100];
496 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000497
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000498 /* Retrieve socket-related error message from MPTN.MSG file */
499 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
500 myerrorcode - SOCBASEERR + 26,
501 "mptn.msg",
502 &msglen);
503 if (rc == NO_ERROR) {
504 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000505
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000506 /* OS/2 doesn't guarantee a terminator */
507 outbuf[msglen] = '\0';
508 if (strlen(outbuf) > 0) {
509 /* If non-empty msg, trim CRLF */
510 char *lastc = &outbuf[ strlen(outbuf)-1 ];
511 while (lastc > outbuf &&
512 isspace(Py_CHARMASK(*lastc))) {
513 /* Trim trailing whitespace (CRLF) */
514 *lastc-- = '\0';
515 }
516 }
517 v = Py_BuildValue("(is)", myerrorcode, outbuf);
518 if (v != NULL) {
519 PyErr_SetObject(socket_error, v);
520 Py_DECREF(v);
521 }
522 return NULL;
523 }
524 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000525#endif
526
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000527#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000528 if (_inet_error.errnum != NULL) {
529 PyObject *v;
530 v = Py_BuildValue("(is)", errno, _inet_err());
531 if (v != NULL) {
532 PyErr_SetObject(socket_error, v);
533 Py_DECREF(v);
534 }
535 return NULL;
536 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000537#endif
538
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000539 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540}
541
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000544set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000546 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
548#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000549 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 if (v != NULL) {
554 PyErr_SetObject(socket_herror, v);
555 Py_DECREF(v);
556 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000558 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559}
560
561
562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000563set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566
Martin v. Löwis272cb402002-03-01 08:31:07 +0000567#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 /* EAI_SYSTEM is not available on Windows XP. */
569 if (error == EAI_SYSTEM)
570 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000571#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000573#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000574 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000575#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000576 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000577#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000578 if (v != NULL) {
579 PyErr_SetObject(socket_gaierror, v);
580 Py_DECREF(v);
581 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000582
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584}
585
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000586#ifdef __VMS
587/* Function to send in segments */
588static int
589sendsegmented(int sock_fd, char *buf, int len, int flags)
590{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000591 int n = 0;
592 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000593
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000594 while (remaining > 0) {
595 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000596
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000597 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
598 n = send(sock_fd, buf, segment, flags);
599 if (n < 0) {
600 return n;
601 }
602 remaining -= segment;
603 buf += segment;
604 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000607}
608#endif
609
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000610/* Function to perform the setting of socket blocking mode
611 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612static int
613internal_setblocking(PySocketSockObject *s, int block)
614{
615#ifndef RISCOS
616#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000617 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618#endif
619#endif
620
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000621 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 block = !block;
624 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
625 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626#else
627#ifndef RISCOS
628#ifndef MS_WINDOWS
629#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000630 block = !block;
631 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000632#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 block = !block;
634 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000635#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000636 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
637 if (block)
638 delay_flag &= (~O_NONBLOCK);
639 else
640 delay_flag |= O_NONBLOCK;
641 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#endif /* !PYOS_OS2 */
643#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000644 block = !block;
645 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000647#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 block = !block;
649 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000651#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000652 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000654 /* Since these don't return anything */
655 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656}
657
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000658/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000659 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000660 This does not raise an exception; we'll let our caller do that
661 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000662 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000663static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000664internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000666 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000667
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 /* Nothing to do unless we're in timeout mode (not non-blocking) */
669 if (s->sock_timeout <= 0.0)
670 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000672 /* Guard against closed socket */
673 if (s->sock_fd < 0)
674 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000675
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000676 /* Prefer poll, if available, since you can poll() any fd
677 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000678#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000679 {
680 struct pollfd pollfd;
681 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000683 pollfd.fd = s->sock_fd;
684 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000685
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000686 /* s->sock_timeout is in seconds, timeout in ms */
687 timeout = (int)(s->sock_timeout * 1000 + 0.5);
688 n = poll(&pollfd, 1, timeout);
689 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000690#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000691 {
692 /* Construct the arguments to select */
693 fd_set fds;
694 struct timeval tv;
695 tv.tv_sec = (int)s->sock_timeout;
696 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
697 FD_ZERO(&fds);
698 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000699
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000700 /* See if the socket is ready */
701 if (writing)
702 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
703 else
704 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
705 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000706#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000707
708 if (n < 0)
709 return -1;
710 if (n == 0)
711 return 1;
712 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000713}
714
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000715/* Initialize a new socket object. */
716
Tim Petersa12b4cf2002-07-18 22:38:44 +0000717static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000718
Mark Hammond62b1ab12002-07-23 06:31:15 +0000719PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000720init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000721 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000722{
723#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000724 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000725#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000726 s->sock_fd = fd;
727 s->sock_family = family;
728 s->sock_type = type;
729 s->sock_proto = proto;
730 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000731
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000732 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000733
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000734 if (defaulttimeout >= 0.0)
735 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000736
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000737#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000738 if (taskwindow)
739 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000740#endif
741}
742
743
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744/* Create a new socket object.
745 This just creates the object and initializes it.
746 If the creation fails, return NULL and set an exception (implicit
747 in NEWOBJ()). */
748
Guido van Rossum73624e91994-10-10 17:59:00 +0000749static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000750new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000751{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000752 PySocketSockObject *s;
753 s = (PySocketSockObject *)
754 PyType_GenericNew(&sock_type, NULL, NULL);
755 if (s != NULL)
756 init_sockobject(s, fd, family, type, proto);
757 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758}
759
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760
Guido van Rossum48a680c2001-03-02 06:34:14 +0000761/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000762 thread to be in gethostbyname or getaddrinfo */
763#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
764PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000765#endif
766
767
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768/* Convert a string specifying a host name or one of a few symbolic
769 names to a numeric IP address. This usually calls gethostbyname()
770 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000771 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772 an error occurred; then an exception is raised. */
773
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000775setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000776{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000777 struct addrinfo hints, *res;
778 int error;
779 int d1, d2, d3, d4;
780 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000782 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
783 if (name[0] == '\0') {
784 int siz;
785 memset(&hints, 0, sizeof(hints));
786 hints.ai_family = af;
787 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
788 hints.ai_flags = AI_PASSIVE;
789 Py_BEGIN_ALLOW_THREADS
790 ACQUIRE_GETADDRINFO_LOCK
791 error = getaddrinfo(NULL, "0", &hints, &res);
792 Py_END_ALLOW_THREADS
793 /* We assume that those thread-unsafe getaddrinfo() versions
794 *are* safe regarding their return value, ie. that a
795 subsequent call to getaddrinfo() does not destroy the
796 outcome of the first call. */
797 RELEASE_GETADDRINFO_LOCK
798 if (error) {
799 set_gaierror(error);
800 return -1;
801 }
802 switch (res->ai_family) {
803 case AF_INET:
804 siz = 4;
805 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000806#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000807 case AF_INET6:
808 siz = 16;
809 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 default:
812 freeaddrinfo(res);
813 PyErr_SetString(socket_error,
814 "unsupported address family");
815 return -1;
816 }
817 if (res->ai_next) {
818 freeaddrinfo(res);
819 PyErr_SetString(socket_error,
820 "wildcard resolved to multiple address");
821 return -1;
822 }
823 if (res->ai_addrlen < addr_ret_size)
824 addr_ret_size = res->ai_addrlen;
825 memcpy(addr_ret, res->ai_addr, addr_ret_size);
826 freeaddrinfo(res);
827 return siz;
828 }
829 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
830 struct sockaddr_in *sin;
831 if (af != AF_INET && af != AF_UNSPEC) {
832 PyErr_SetString(socket_error,
833 "address family mismatched");
834 return -1;
835 }
836 sin = (struct sockaddr_in *)addr_ret;
837 memset((void *) sin, '\0', sizeof(*sin));
838 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000842 sin->sin_addr.s_addr = INADDR_BROADCAST;
843 return sizeof(sin->sin_addr);
844 }
845 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
846 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
847 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
848 struct sockaddr_in *sin;
849 sin = (struct sockaddr_in *)addr_ret;
850 sin->sin_addr.s_addr = htonl(
851 ((long) d1 << 24) | ((long) d2 << 16) |
852 ((long) d3 << 8) | ((long) d4 << 0));
853 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000854#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000855 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 return 4;
858 }
859 memset(&hints, 0, sizeof(hints));
860 hints.ai_family = af;
861 Py_BEGIN_ALLOW_THREADS
862 ACQUIRE_GETADDRINFO_LOCK
863 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000864#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000865 if (error == EAI_NONAME && af == AF_UNSPEC) {
866 /* On Tru64 V5.1, numeric-to-addr conversion fails
867 if no address family is given. Assume IPv4 for now.*/
868 hints.ai_family = AF_INET;
869 error = getaddrinfo(name, NULL, &hints, &res);
870 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000871#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000872 Py_END_ALLOW_THREADS
873 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
874 if (error) {
875 set_gaierror(error);
876 return -1;
877 }
878 if (res->ai_addrlen < addr_ret_size)
879 addr_ret_size = res->ai_addrlen;
880 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
881 freeaddrinfo(res);
882 switch (addr_ret->sa_family) {
883 case AF_INET:
884 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000885#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000886 case AF_INET6:
887 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000888#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000889 default:
890 PyErr_SetString(socket_error, "unknown address family");
891 return -1;
892 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893}
894
Guido van Rossum30a685f1991-06-27 15:51:29 +0000895
Guido van Rossum30a685f1991-06-27 15:51:29 +0000896/* Create a string object representing an IP address.
897 This is always a string of the form 'dd.dd.dd.dd' (with variable
898 size numbers). */
899
Guido van Rossum73624e91994-10-10 17:59:00 +0000900static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000903 char buf[NI_MAXHOST];
904 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000905
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000906 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
907 NI_NUMERICHOST);
908 if (error) {
909 set_gaierror(error);
910 return NULL;
911 }
912 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913}
914
915
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000916#ifdef USE_BLUETOOTH
917/* Convert a string representation of a Bluetooth address into a numeric
918 address. Returns the length (6), or raises an exception and returns -1 if
919 an error occurred. */
920
921static int
922setbdaddr(char *name, bdaddr_t *bdaddr)
923{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000924 unsigned int b0, b1, b2, b3, b4, b5;
925 char ch;
926 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000927
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
929 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
930 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
931 bdaddr->b[0] = b0;
932 bdaddr->b[1] = b1;
933 bdaddr->b[2] = b2;
934 bdaddr->b[3] = b3;
935 bdaddr->b[4] = b4;
936 bdaddr->b[5] = b5;
937 return 6;
938 } else {
939 PyErr_SetString(socket_error, "bad bluetooth address");
940 return -1;
941 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000942}
943
944/* Create a string representation of the Bluetooth address. This is always a
945 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
946 value (zero padded if necessary). */
947
948static PyObject *
949makebdaddr(bdaddr_t *bdaddr)
950{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000951 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000952
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000953 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
954 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
955 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
956 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000957}
958#endif
959
960
Guido van Rossum30a685f1991-06-27 15:51:29 +0000961/* Create an object representing the given socket address,
962 suitable for passing it back to bind(), connect() etc.
963 The family field of the sockaddr structure is inspected
964 to determine what kind of address it really is. */
965
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000967static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000968makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000970 if (addrlen == 0) {
971 /* No address -- may be recvfrom() from known socket */
972 Py_INCREF(Py_None);
973 return Py_None;
974 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000975
Guido van Rossumbcc20741998-08-04 22:53:56 +0000976#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000977 /* XXX: BeOS version of accept() doesn't set family correctly */
978 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000979#endif
980
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000981 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000983 case AF_INET:
984 {
985 struct sockaddr_in *a;
986 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
987 PyObject *ret = NULL;
988 if (addrobj) {
989 a = (struct sockaddr_in *)addr;
990 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
991 Py_DECREF(addrobj);
992 }
993 return ret;
994 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000995
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000996#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000997 case AF_UNIX:
998 {
999 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001000#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001001 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1002 addrlen -= offsetof(struct sockaddr_un, sun_path);
1003 return PyString_FromStringAndSize(a->sun_path,
1004 addrlen);
1005 }
1006 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001007#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001008 {
1009 /* regular NULL-terminated string */
1010 return PyString_FromString(a->sun_path);
1011 }
1012 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001013#endif /* AF_UNIX */
1014
Martin v. Löwis11017b12006-01-14 18:12:57 +00001015#if defined(AF_NETLINK)
1016 case AF_NETLINK:
1017 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001018 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1019 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001020 }
1021#endif /* AF_NETLINK */
1022
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001023#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001024 case AF_INET6:
1025 {
1026 struct sockaddr_in6 *a;
1027 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1028 PyObject *ret = NULL;
1029 if (addrobj) {
1030 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001031 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001032 addrobj,
1033 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001034 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001035 a->sin6_scope_id);
1036 Py_DECREF(addrobj);
1037 }
1038 return ret;
1039 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001040#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001041
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001042#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001043 case AF_BLUETOOTH:
1044 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001045
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001046 case BTPROTO_L2CAP:
1047 {
1048 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1049 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1050 PyObject *ret = NULL;
1051 if (addrobj) {
1052 ret = Py_BuildValue("Oi",
1053 addrobj,
1054 _BT_L2_MEMB(a, psm));
1055 Py_DECREF(addrobj);
1056 }
1057 return ret;
1058 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001059
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001060 case BTPROTO_RFCOMM:
1061 {
1062 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1063 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1064 PyObject *ret = NULL;
1065 if (addrobj) {
1066 ret = Py_BuildValue("Oi",
1067 addrobj,
1068 _BT_RC_MEMB(a, channel));
1069 Py_DECREF(addrobj);
1070 }
1071 return ret;
1072 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001074 case BTPROTO_HCI:
1075 {
1076 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001077#if defined(__NetBSD__) || defined(__DragonFly__)
1078 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1079#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001080 PyObject *ret = NULL;
1081 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1082 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001084 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001085
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001086#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001087 case BTPROTO_SCO:
1088 {
1089 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1090 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1091 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001092#endif
1093
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001094 default:
1095 PyErr_SetString(PyExc_ValueError,
1096 "Unknown Bluetooth protocol");
1097 return NULL;
1098 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001099#endif
1100
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001101#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001102 case AF_PACKET:
1103 {
1104 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1105 char *ifname = "";
1106 struct ifreq ifr;
1107 /* need to look up interface name give index */
1108 if (a->sll_ifindex) {
1109 ifr.ifr_ifindex = a->sll_ifindex;
1110 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1111 ifname = ifr.ifr_name;
1112 }
1113 return Py_BuildValue("shbhs#",
1114 ifname,
1115 ntohs(a->sll_protocol),
1116 a->sll_pkttype,
1117 a->sll_hatype,
1118 a->sll_addr,
1119 a->sll_halen);
1120 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001121#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001122
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001123#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 case AF_TIPC:
1125 {
1126 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1127 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1128 return Py_BuildValue("IIIII",
1129 a->addrtype,
1130 a->addr.nameseq.type,
1131 a->addr.nameseq.lower,
1132 a->addr.nameseq.upper,
1133 a->scope);
1134 } else if (a->addrtype == TIPC_ADDR_NAME) {
1135 return Py_BuildValue("IIIII",
1136 a->addrtype,
1137 a->addr.name.name.type,
1138 a->addr.name.name.instance,
1139 a->addr.name.name.instance,
1140 a->scope);
1141 } else if (a->addrtype == TIPC_ADDR_ID) {
1142 return Py_BuildValue("IIIII",
1143 a->addrtype,
1144 a->addr.id.node,
1145 a->addr.id.ref,
1146 0,
1147 a->scope);
1148 } else {
1149 PyErr_SetString(PyExc_ValueError,
1150 "Invalid address type");
1151 return NULL;
1152 }
1153 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001154#endif
1155
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001156 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001157
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001158 default:
1159 /* If we don't know the address family, don't raise an
1160 exception -- return it as a tuple. */
1161 return Py_BuildValue("is#",
1162 addr->sa_family,
1163 addr->sa_data,
1164 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001165
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001166 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167}
1168
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169
1170/* Parse a socket address argument according to the socket object's
1171 address family. Return 1 if the address was in the proper format,
1172 0 of not. The address is returned through addr_ret, its length
1173 through len_ret. */
1174
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001176getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001177 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001179 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001181#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001182 case AF_UNIX:
1183 {
1184 struct sockaddr_un* addr;
1185 char *path;
1186 int len;
1187 if (!PyArg_Parse(args, "t#", &path, &len))
1188 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001189
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001190 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001191#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001192 if (len > 0 && path[0] == 0) {
1193 /* Linux abstract namespace extension */
1194 if (len > sizeof addr->sun_path) {
1195 PyErr_SetString(socket_error,
1196 "AF_UNIX path too long");
1197 return 0;
1198 }
1199 }
1200 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001201#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001202 {
1203 /* regular NULL-terminated string */
1204 if (len >= sizeof addr->sun_path) {
1205 PyErr_SetString(socket_error,
1206 "AF_UNIX path too long");
1207 return 0;
1208 }
1209 addr->sun_path[len] = 0;
1210 }
1211 addr->sun_family = s->sock_family;
1212 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001213#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001214 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001215#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001218 return 1;
1219 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001220#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221
Martin v. Löwis11017b12006-01-14 18:12:57 +00001222#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001223 case AF_NETLINK:
1224 {
1225 struct sockaddr_nl* addr;
1226 int pid, groups;
1227 addr = (struct sockaddr_nl *)addr_ret;
1228 if (!PyTuple_Check(args)) {
1229 PyErr_Format(
1230 PyExc_TypeError,
1231 "getsockaddrarg: "
1232 "AF_NETLINK address must be tuple, not %.500s",
1233 Py_TYPE(args)->tp_name);
1234 return 0;
1235 }
1236 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1237 return 0;
1238 addr->nl_family = AF_NETLINK;
1239 addr->nl_pid = pid;
1240 addr->nl_groups = groups;
1241 *len_ret = sizeof(*addr);
1242 return 1;
1243 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001244#endif
1245
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001246 case AF_INET:
1247 {
1248 struct sockaddr_in* addr;
1249 char *host;
1250 int port, result;
1251 if (!PyTuple_Check(args)) {
1252 PyErr_Format(
1253 PyExc_TypeError,
1254 "getsockaddrarg: "
1255 "AF_INET address must be tuple, not %.500s",
1256 Py_TYPE(args)->tp_name);
1257 return 0;
1258 }
1259 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1260 "idna", &host, &port))
1261 return 0;
1262 addr=(struct sockaddr_in*)addr_ret;
1263 result = setipaddr(host, (struct sockaddr *)addr,
1264 sizeof(*addr), AF_INET);
1265 PyMem_Free(host);
1266 if (result < 0)
1267 return 0;
1268 if (port < 0 || port > 0xffff) {
1269 PyErr_SetString(
1270 PyExc_OverflowError,
1271 "getsockaddrarg: port must be 0-65535.");
1272 return 0;
1273 }
1274 addr->sin_family = AF_INET;
1275 addr->sin_port = htons((short)port);
1276 *len_ret = sizeof *addr;
1277 return 1;
1278 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001280#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001281 case AF_INET6:
1282 {
1283 struct sockaddr_in6* addr;
1284 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001285 int port, result;
1286 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001287 flowinfo = scope_id = 0;
1288 if (!PyTuple_Check(args)) {
1289 PyErr_Format(
1290 PyExc_TypeError,
1291 "getsockaddrarg: "
1292 "AF_INET6 address must be tuple, not %.500s",
1293 Py_TYPE(args)->tp_name);
1294 return 0;
1295 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001296 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001297 "idna", &host, &port, &flowinfo,
1298 &scope_id)) {
1299 return 0;
1300 }
1301 addr = (struct sockaddr_in6*)addr_ret;
1302 result = setipaddr(host, (struct sockaddr *)addr,
1303 sizeof(*addr), AF_INET6);
1304 PyMem_Free(host);
1305 if (result < 0)
1306 return 0;
1307 if (port < 0 || port > 0xffff) {
1308 PyErr_SetString(
1309 PyExc_OverflowError,
1310 "getsockaddrarg: port must be 0-65535.");
1311 return 0;
1312 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001313 if (flowinfo < 0 || flowinfo > 0xfffff) {
1314 PyErr_SetString(
1315 PyExc_OverflowError,
1316 "getsockaddrarg: flowinfo must be 0-1048575.");
1317 return 0;
1318 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001319 addr->sin6_family = s->sock_family;
1320 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001321 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001322 addr->sin6_scope_id = scope_id;
1323 *len_ret = sizeof *addr;
1324 return 1;
1325 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001326#endif
1327
Hye-Shik Chang81268602004-02-02 06:05:24 +00001328#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001329 case AF_BLUETOOTH:
1330 {
1331 switch (s->sock_proto) {
1332 case BTPROTO_L2CAP:
1333 {
1334 struct sockaddr_l2 *addr;
1335 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001336
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001337 addr = (struct sockaddr_l2 *)addr_ret;
1338 memset(addr, 0, sizeof(struct sockaddr_l2));
1339 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1340 if (!PyArg_ParseTuple(args, "si", &straddr,
1341 &_BT_L2_MEMB(addr, psm))) {
1342 PyErr_SetString(socket_error, "getsockaddrarg: "
1343 "wrong format");
1344 return 0;
1345 }
1346 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1347 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001348
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001349 *len_ret = sizeof *addr;
1350 return 1;
1351 }
1352 case BTPROTO_RFCOMM:
1353 {
1354 struct sockaddr_rc *addr;
1355 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001357 addr = (struct sockaddr_rc *)addr_ret;
1358 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1359 if (!PyArg_ParseTuple(args, "si", &straddr,
1360 &_BT_RC_MEMB(addr, channel))) {
1361 PyErr_SetString(socket_error, "getsockaddrarg: "
1362 "wrong format");
1363 return 0;
1364 }
1365 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1366 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001367
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001368 *len_ret = sizeof *addr;
1369 return 1;
1370 }
1371 case BTPROTO_HCI:
1372 {
1373 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001374#if defined(__NetBSD__) || defined(__DragonFly__)
1375 char *straddr = PyBytes_AS_STRING(args);
1376
1377 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1378 if (straddr == NULL) {
1379 PyErr_SetString(socket_error, "getsockaddrarg: "
1380 "wrong format");
1381 return 0;
1382 }
1383 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1384 return 0;
1385#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001386 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1387 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1388 PyErr_SetString(socket_error, "getsockaddrarg: "
1389 "wrong format");
1390 return 0;
1391 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001392#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001393 *len_ret = sizeof *addr;
1394 return 1;
1395 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001396#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001397 case BTPROTO_SCO:
1398 {
1399 struct sockaddr_sco *addr;
1400 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001402 addr = (struct sockaddr_sco *)addr_ret;
1403 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1404 straddr = PyString_AsString(args);
1405 if (straddr == NULL) {
1406 PyErr_SetString(socket_error, "getsockaddrarg: "
1407 "wrong format");
1408 return 0;
1409 }
1410 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1411 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001412
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001413 *len_ret = sizeof *addr;
1414 return 1;
1415 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001416#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001417 default:
1418 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1419 return 0;
1420 }
1421 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001422#endif
1423
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001424#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001425 case AF_PACKET:
1426 {
1427 struct sockaddr_ll* addr;
1428 struct ifreq ifr;
1429 char *interfaceName;
1430 int protoNumber;
1431 int hatype = 0;
1432 int pkttype = 0;
1433 char *haddr = NULL;
1434 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001435
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001436 if (!PyTuple_Check(args)) {
1437 PyErr_Format(
1438 PyExc_TypeError,
1439 "getsockaddrarg: "
1440 "AF_PACKET address must be tuple, not %.500s",
1441 Py_TYPE(args)->tp_name);
1442 return 0;
1443 }
1444 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1445 &protoNumber, &pkttype, &hatype,
1446 &haddr, &halen))
1447 return 0;
1448 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1449 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1450 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1451 s->errorhandler();
1452 return 0;
1453 }
1454 if (halen > 8) {
1455 PyErr_SetString(PyExc_ValueError,
1456 "Hardware address must be 8 bytes or less");
1457 return 0;
1458 }
1459 if (protoNumber < 0 || protoNumber > 0xffff) {
1460 PyErr_SetString(
1461 PyExc_OverflowError,
1462 "getsockaddrarg: protoNumber must be 0-65535.");
1463 return 0;
1464 }
1465 addr = (struct sockaddr_ll*)addr_ret;
1466 addr->sll_family = AF_PACKET;
1467 addr->sll_protocol = htons((short)protoNumber);
1468 addr->sll_ifindex = ifr.ifr_ifindex;
1469 addr->sll_pkttype = pkttype;
1470 addr->sll_hatype = hatype;
1471 if (halen != 0) {
1472 memcpy(&addr->sll_addr, haddr, halen);
1473 }
1474 addr->sll_halen = halen;
1475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001478#endif
1479
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001480#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001481 case AF_TIPC:
1482 {
1483 unsigned int atype, v1, v2, v3;
1484 unsigned int scope = TIPC_CLUSTER_SCOPE;
1485 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001486
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001487 if (!PyTuple_Check(args)) {
1488 PyErr_Format(
1489 PyExc_TypeError,
1490 "getsockaddrarg: "
1491 "AF_TIPC address must be tuple, not %.500s",
1492 Py_TYPE(args)->tp_name);
1493 return 0;
1494 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001495
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001496 if (!PyArg_ParseTuple(args,
1497 "IIII|I;Invalid TIPC address format",
1498 &atype, &v1, &v2, &v3, &scope))
1499 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001500
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001501 addr = (struct sockaddr_tipc *) addr_ret;
1502 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001504 addr->family = AF_TIPC;
1505 addr->scope = scope;
1506 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001507
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001508 if (atype == TIPC_ADDR_NAMESEQ) {
1509 addr->addr.nameseq.type = v1;
1510 addr->addr.nameseq.lower = v2;
1511 addr->addr.nameseq.upper = v3;
1512 } else if (atype == TIPC_ADDR_NAME) {
1513 addr->addr.name.name.type = v1;
1514 addr->addr.name.name.instance = v2;
1515 } else if (atype == TIPC_ADDR_ID) {
1516 addr->addr.id.node = v1;
1517 addr->addr.id.ref = v2;
1518 } else {
1519 /* Shouldn't happen */
1520 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1521 return 0;
1522 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001523
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001524 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001525
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001526 return 1;
1527 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001528#endif
1529
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001530 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001531
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001532 default:
1533 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1534 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001536 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001537}
1538
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539
Guido van Rossum48a680c2001-03-02 06:34:14 +00001540/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001541 Return 1 if the family is known, 0 otherwise. The length is returned
1542 through len_ret. */
1543
1544static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001545getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001546{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001547 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001548
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001549#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001550 case AF_UNIX:
1551 {
1552 *len_ret = sizeof (struct sockaddr_un);
1553 return 1;
1554 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001555#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001556#if defined(AF_NETLINK)
1557 case AF_NETLINK:
1558 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001559 *len_ret = sizeof (struct sockaddr_nl);
1560 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001561 }
1562#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001563
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001564 case AF_INET:
1565 {
1566 *len_ret = sizeof (struct sockaddr_in);
1567 return 1;
1568 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001569
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001570#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001571 case AF_INET6:
1572 {
1573 *len_ret = sizeof (struct sockaddr_in6);
1574 return 1;
1575 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001576#endif
1577
Hye-Shik Chang81268602004-02-02 06:05:24 +00001578#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001579 case AF_BLUETOOTH:
1580 {
1581 switch(s->sock_proto)
1582 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001584 case BTPROTO_L2CAP:
1585 *len_ret = sizeof (struct sockaddr_l2);
1586 return 1;
1587 case BTPROTO_RFCOMM:
1588 *len_ret = sizeof (struct sockaddr_rc);
1589 return 1;
1590 case BTPROTO_HCI:
1591 *len_ret = sizeof (struct sockaddr_hci);
1592 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001593#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 case BTPROTO_SCO:
1595 *len_ret = sizeof (struct sockaddr_sco);
1596 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001597#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001598 default:
1599 PyErr_SetString(socket_error, "getsockaddrlen: "
1600 "unknown BT protocol");
1601 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001602
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001603 }
1604 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001605#endif
1606
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001607#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001608 case AF_PACKET:
1609 {
1610 *len_ret = sizeof (struct sockaddr_ll);
1611 return 1;
1612 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001613#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001614
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001615#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001616 case AF_TIPC:
1617 {
1618 *len_ret = sizeof (struct sockaddr_tipc);
1619 return 1;
1620 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001621#endif
1622
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001623 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001624
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001625 default:
1626 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1627 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001628
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001629 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001630}
1631
1632
Guido van Rossum30a685f1991-06-27 15:51:29 +00001633/* s.accept() method */
1634
Guido van Rossum73624e91994-10-10 17:59:00 +00001635static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001636sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001637{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001638 sock_addr_t addrbuf;
1639 SOCKET_T newfd;
1640 socklen_t addrlen;
1641 PyObject *sock = NULL;
1642 PyObject *addr = NULL;
1643 PyObject *res = NULL;
1644 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001645
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 if (!getsockaddrlen(s, &addrlen))
1647 return NULL;
1648 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001649
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001650#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001651 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001652#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001653 newfd = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001654#endif
1655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 if (!IS_SELECTABLE(s))
1657 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001658
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001659 Py_BEGIN_ALLOW_THREADS
1660 timeout = internal_select(s, 0);
1661 if (!timeout)
1662 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1663 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001664
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001665 if (timeout == 1) {
1666 PyErr_SetString(socket_timeout, "timed out");
1667 return NULL;
1668 }
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001669
Fred Drakea04eaad2000-06-30 02:46:07 +00001670#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001671 if (newfd == INVALID_SOCKET)
Fred Drakea04eaad2000-06-30 02:46:07 +00001672#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001673 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001674#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001675 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001676
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001677 /* Create the new object with unspecified family,
1678 to avoid calls to bind() etc. on it. */
1679 sock = (PyObject *) new_sockobject(newfd,
1680 s->sock_family,
1681 s->sock_type,
1682 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001683
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001684 if (sock == NULL) {
1685 SOCKETCLOSE(newfd);
1686 goto finally;
1687 }
1688 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1689 addrlen, s->sock_proto);
1690 if (addr == NULL)
1691 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001692
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001693 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001694
Guido van Rossum67f7a382002-06-06 21:08:16 +00001695finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001696 Py_XDECREF(sock);
1697 Py_XDECREF(addr);
1698 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001699}
1700
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001701PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001702"accept() -> (socket object, address info)\n\
1703\n\
1704Wait for an incoming connection. Return a new socket representing the\n\
1705connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001706info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001707
Guido van Rossum11ba0942002-06-13 15:07:44 +00001708/* s.setblocking(flag) method. Argument:
1709 False -- non-blocking mode; same as settimeout(0)
1710 True -- blocking mode; same as settimeout(None)
1711*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001712
Guido van Rossum73624e91994-10-10 17:59:00 +00001713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001714sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001715{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001716 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001717
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001718 block = PyInt_AsLong(arg);
1719 if (block == -1 && PyErr_Occurred())
1720 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001721
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001722 s->sock_timeout = block ? -1.0 : 0.0;
1723 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001724
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001725 Py_INCREF(Py_None);
1726 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001727}
Guido van Rossume4485b01994-09-07 14:32:49 +00001728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001729PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001730"setblocking(flag)\n\
1731\n\
1732Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001733setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001734setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001735
Guido van Rossum11ba0942002-06-13 15:07:44 +00001736/* s.settimeout(timeout) method. Argument:
1737 None -- no timeout, blocking mode; same as setblocking(True)
1738 0.0 -- non-blocking mode; same as setblocking(False)
1739 > 0 -- timeout mode; operations time out after timeout seconds
1740 < 0 -- illegal; raises an exception
1741*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001742static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001743sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001744{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001745 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001747 if (arg == Py_None)
1748 timeout = -1.0;
1749 else {
1750 timeout = PyFloat_AsDouble(arg);
1751 if (timeout < 0.0) {
1752 if (!PyErr_Occurred())
1753 PyErr_SetString(PyExc_ValueError,
1754 "Timeout value out of range");
1755 return NULL;
1756 }
1757 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001759 s->sock_timeout = timeout;
1760 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001762 Py_INCREF(Py_None);
1763 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001764}
1765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001766PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001767"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001768\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001769Set a timeout on socket operations. 'timeout' can be a float,\n\
1770giving in seconds, or None. Setting a timeout of None disables\n\
1771the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001772Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001774/* s.gettimeout() method.
1775 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001776static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001777sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001778{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001779 if (s->sock_timeout < 0.0) {
1780 Py_INCREF(Py_None);
1781 return Py_None;
1782 }
1783 else
1784 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001785}
1786
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001787PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001788"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001789\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001790Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001791operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001792operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001793
Guido van Rossum48a680c2001-03-02 06:34:14 +00001794#ifdef RISCOS
1795/* s.sleeptaskw(1 | 0) method */
1796
1797static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001798sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001800 int block;
1801 block = PyInt_AsLong(arg);
1802 if (block == -1 && PyErr_Occurred())
1803 return NULL;
1804 Py_BEGIN_ALLOW_THREADS
1805 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1806 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001808 Py_INCREF(Py_None);
1809 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001810}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001811PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001812"sleeptaskw(flag)\n\
1813\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001814Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001815#endif
1816
1817
Guido van Rossumaee08791992-09-08 09:05:33 +00001818/* s.setsockopt() method.
1819 With an integer third argument, sets an integer option.
1820 With a string third argument, sets an option from a buffer;
1821 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001822
Guido van Rossum73624e91994-10-10 17:59:00 +00001823static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001824sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001825{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001826 int level;
1827 int optname;
1828 int res;
1829 char *buf;
1830 int buflen;
1831 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001832
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001833 if (PyArg_ParseTuple(args, "iii:setsockopt",
1834 &level, &optname, &flag)) {
1835 buf = (char *) &flag;
1836 buflen = sizeof flag;
1837 }
1838 else {
1839 PyErr_Clear();
1840 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1841 &level, &optname, &buf, &buflen))
1842 return NULL;
1843 }
1844 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1845 if (res < 0)
1846 return s->errorhandler();
1847 Py_INCREF(Py_None);
1848 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001849}
1850
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001851PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001852"setsockopt(level, option, value)\n\
1853\n\
1854Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001855The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001857
Guido van Rossumaee08791992-09-08 09:05:33 +00001858/* s.getsockopt() method.
1859 With two arguments, retrieves an integer option.
1860 With a third integer argument, retrieves a string buffer of that size;
1861 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001862
Guido van Rossum73624e91994-10-10 17:59:00 +00001863static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001864sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001865{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001866 int level;
1867 int optname;
1868 int res;
1869 PyObject *buf;
1870 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001871
Guido van Rossumbcc20741998-08-04 22:53:56 +00001872#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001873 /* We have incomplete socket support. */
1874 PyErr_SetString(socket_error, "getsockopt not supported");
1875 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001876#else
1877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001878 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1879 &level, &optname, &buflen))
1880 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001881
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001882 if (buflen == 0) {
1883 int flag = 0;
1884 socklen_t flagsize = sizeof flag;
1885 res = getsockopt(s->sock_fd, level, optname,
1886 (void *)&flag, &flagsize);
1887 if (res < 0)
1888 return s->errorhandler();
1889 return PyInt_FromLong(flag);
1890 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001891#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001892 /* socklen_t is unsigned so no negative test is needed,
1893 test buflen == 0 is previously done */
1894 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001895#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001896 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001897#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001898 PyErr_SetString(socket_error,
1899 "getsockopt buflen out of range");
1900 return NULL;
1901 }
1902 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1903 if (buf == NULL)
1904 return NULL;
1905 res = getsockopt(s->sock_fd, level, optname,
1906 (void *)PyString_AS_STRING(buf), &buflen);
1907 if (res < 0) {
1908 Py_DECREF(buf);
1909 return s->errorhandler();
1910 }
1911 _PyString_Resize(&buf, buflen);
1912 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001913#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001914}
1915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001916PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917"getsockopt(level, option[, buffersize]) -> value\n\
1918\n\
1919Get a socket option. See the Unix manual for level and option.\n\
1920If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001921string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001922
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001923
Fred Drake728819a2000-07-01 03:40:12 +00001924/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001925
Guido van Rossum73624e91994-10-10 17:59:00 +00001926static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001927sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001928{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001929 sock_addr_t addrbuf;
1930 int addrlen;
1931 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001932
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001933 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1934 return NULL;
1935 Py_BEGIN_ALLOW_THREADS
1936 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1937 Py_END_ALLOW_THREADS
1938 if (res < 0)
1939 return s->errorhandler();
1940 Py_INCREF(Py_None);
1941 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001942}
1943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001944PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001945"bind(address)\n\
1946\n\
1947Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001948pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001949sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001950
Guido van Rossum30a685f1991-06-27 15:51:29 +00001951
1952/* s.close() method.
1953 Set the file descriptor to -1 so operations tried subsequently
1954 will surely fail. */
1955
Guido van Rossum73624e91994-10-10 17:59:00 +00001956static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001957sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001958{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001959 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001960
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001961 if ((fd = s->sock_fd) != -1) {
1962 s->sock_fd = -1;
1963 Py_BEGIN_ALLOW_THREADS
1964 (void) SOCKETCLOSE(fd);
1965 Py_END_ALLOW_THREADS
1966 }
1967 Py_INCREF(Py_None);
1968 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001969}
1970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972"close()\n\
1973\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001974Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001975
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001976static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001977internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001978 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001979{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001980 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001981
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001982 timeout = 0;
1983 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001984
1985#ifdef MS_WINDOWS
1986
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001987 if (s->sock_timeout > 0.0) {
1988 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1989 IS_SELECTABLE(s)) {
1990 /* This is a mess. Best solution: trust select */
1991 fd_set fds;
1992 fd_set fds_exc;
1993 struct timeval tv;
1994 tv.tv_sec = (int)s->sock_timeout;
1995 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1996 FD_ZERO(&fds);
1997 FD_SET(s->sock_fd, &fds);
1998 FD_ZERO(&fds_exc);
1999 FD_SET(s->sock_fd, &fds_exc);
2000 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2001 if (res == 0) {
2002 res = WSAEWOULDBLOCK;
2003 timeout = 1;
2004 } else if (res > 0) {
2005 if (FD_ISSET(s->sock_fd, &fds))
2006 /* The socket is in the writeable set - this
2007 means connected */
2008 res = 0;
2009 else {
2010 /* As per MS docs, we need to call getsockopt()
2011 to get the underlying error */
2012 int res_size = sizeof res;
2013 /* It must be in the exception set */
2014 assert(FD_ISSET(s->sock_fd, &fds_exc));
2015 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2016 (char *)&res, &res_size))
2017 /* getsockopt also clears WSAGetLastError,
2018 so reset it back. */
2019 WSASetLastError(res);
2020 else
2021 res = WSAGetLastError();
2022 }
2023 }
2024 /* else if (res < 0) an error occurred */
2025 }
2026 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002027
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002028 if (res < 0)
2029 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002030
2031#else
2032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002033 if (s->sock_timeout > 0.0) {
2034 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2035 timeout = internal_select(s, 1);
2036 if (timeout == 0) {
2037 /* Bug #1019808: in case of an EINPROGRESS,
2038 use getsockopt(SO_ERROR) to get the real
2039 error. */
2040 socklen_t res_size = sizeof res;
2041 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2042 SO_ERROR, &res, &res_size);
2043 if (res == EISCONN)
2044 res = 0;
2045 errno = res;
2046 }
2047 else if (timeout == -1) {
2048 res = errno; /* had error */
2049 }
2050 else
2051 res = EWOULDBLOCK; /* timed out */
2052 }
2053 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002054
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002055 if (res < 0)
2056 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002057
2058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002059 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002060
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002061 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002062}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002063
Fred Drake728819a2000-07-01 03:40:12 +00002064/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065
Guido van Rossum73624e91994-10-10 17:59:00 +00002066static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002067sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002068{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002069 sock_addr_t addrbuf;
2070 int addrlen;
2071 int res;
2072 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002074 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2075 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002077 Py_BEGIN_ALLOW_THREADS
2078 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2079 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002080
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002081 if (timeout == 1) {
2082 PyErr_SetString(socket_timeout, "timed out");
2083 return NULL;
2084 }
2085 if (res != 0)
2086 return s->errorhandler();
2087 Py_INCREF(Py_None);
2088 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002089}
2090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002091PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002092"connect(address)\n\
2093\n\
2094Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002096
Guido van Rossum30a685f1991-06-27 15:51:29 +00002097
Fred Drake728819a2000-07-01 03:40:12 +00002098/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002099
2100static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002101sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002102{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002103 sock_addr_t addrbuf;
2104 int addrlen;
2105 int res;
2106 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002107
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002108 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2109 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002111 Py_BEGIN_ALLOW_THREADS
2112 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2113 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002114
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 /* Signals are not errors (though they may raise exceptions). Adapted
2116 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002117#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002118 if (res == EINTR && PyErr_CheckSignals())
2119 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002120#endif
2121
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002122 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002123}
2124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002125PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002126"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002127\n\
2128This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002129instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002130
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002131
Guido van Rossumed233a51992-06-23 09:07:03 +00002132/* s.fileno() method */
2133
Guido van Rossum73624e91994-10-10 17:59:00 +00002134static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002135sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002136{
Fred Drakea04eaad2000-06-30 02:46:07 +00002137#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002138 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002139#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002140 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002141#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002142}
2143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002144PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145"fileno() -> integer\n\
2146\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002147Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002148
Guido van Rossumed233a51992-06-23 09:07:03 +00002149
Guido van Rossumbe32c891996-06-20 16:25:29 +00002150#ifndef NO_DUP
2151/* s.dup() method */
2152
2153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002154sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002155{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002156 SOCKET_T newfd;
2157 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002158
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002159 newfd = dup(s->sock_fd);
2160 if (newfd < 0)
2161 return s->errorhandler();
2162 sock = (PyObject *) new_sockobject(newfd,
2163 s->sock_family,
2164 s->sock_type,
2165 s->sock_proto);
2166 if (sock == NULL)
2167 SOCKETCLOSE(newfd);
2168 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002169}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002171PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002172"dup() -> socket object\n\
2173\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002174Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002175
Guido van Rossumbe32c891996-06-20 16:25:29 +00002176#endif
2177
2178
Guido van Rossumc89705d1992-11-26 08:54:07 +00002179/* s.getsockname() method */
2180
Guido van Rossum73624e91994-10-10 17:59:00 +00002181static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002182sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002183{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002184 sock_addr_t addrbuf;
2185 int res;
2186 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002187
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002188 if (!getsockaddrlen(s, &addrlen))
2189 return NULL;
2190 memset(&addrbuf, 0, addrlen);
2191 Py_BEGIN_ALLOW_THREADS
2192 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2193 Py_END_ALLOW_THREADS
2194 if (res < 0)
2195 return s->errorhandler();
2196 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2197 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002198}
2199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002200PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002201"getsockname() -> address info\n\
2202\n\
2203Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002204info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002205
Guido van Rossumc89705d1992-11-26 08:54:07 +00002206
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002207#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002208/* s.getpeername() method */
2209
Guido van Rossum73624e91994-10-10 17:59:00 +00002210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002211sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002212{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002213 sock_addr_t addrbuf;
2214 int res;
2215 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002216
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002217 if (!getsockaddrlen(s, &addrlen))
2218 return NULL;
2219 memset(&addrbuf, 0, addrlen);
2220 Py_BEGIN_ALLOW_THREADS
2221 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2222 Py_END_ALLOW_THREADS
2223 if (res < 0)
2224 return s->errorhandler();
2225 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2226 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002227}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002229PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002230"getpeername() -> address info\n\
2231\n\
2232Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002233info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002234
Guido van Rossumb6775db1994-08-01 11:34:53 +00002235#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002236
2237
Guido van Rossum30a685f1991-06-27 15:51:29 +00002238/* s.listen(n) method */
2239
Guido van Rossum73624e91994-10-10 17:59:00 +00002240static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002241sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002242{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002243 int backlog;
2244 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002245
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002246 backlog = PyInt_AsLong(arg);
2247 if (backlog == -1 && PyErr_Occurred())
2248 return NULL;
2249 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002250 /* To avoid problems on systems that don't allow a negative backlog
2251 * (which doesn't make sense anyway) we force a minimum value of 0. */
2252 if (backlog < 0)
2253 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002254 res = listen(s->sock_fd, backlog);
2255 Py_END_ALLOW_THREADS
2256 if (res < 0)
2257 return s->errorhandler();
2258 Py_INCREF(Py_None);
2259 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002260}
2261
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002262PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002263"listen(backlog)\n\
2264\n\
2265Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002266least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2267unaccepted connections that the system will allow before refusing new\n\
2268connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002269
2270
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002271#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002272/* s.makefile(mode) method.
2273 Create a new open file object referring to a dupped version of
2274 the socket's file descriptor. (The dup() call is necessary so
2275 that the open file and socket objects may be closed independent
2276 of each other.)
2277 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2278
Guido van Rossum73624e91994-10-10 17:59:00 +00002279static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002280sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002281{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002282 extern int fclose(FILE *);
2283 char *mode = "r";
2284 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002285#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002286 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002287#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002288 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002289#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002290 FILE *fp;
2291 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002292#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002293 char *mode_r = "r";
2294 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002295#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002296
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002297 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2298 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002299#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002300 if (strcmp(mode,"rb") == 0) {
2301 mode = mode_r;
2302 }
2303 else {
2304 if (strcmp(mode,"wb") == 0) {
2305 mode = mode_w;
2306 }
2307 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002308#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002309#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002310 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2311 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002312#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002313 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002314#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002315 {
2316 if (fd >= 0)
2317 SOCKETCLOSE(fd);
2318 return s->errorhandler();
2319 }
2320 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2321 if (f != NULL)
2322 PyFile_SetBufSize(f, bufsize);
2323 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002324}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002326PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002327"makefile([mode[, buffersize]]) -> file object\n\
2328\n\
2329Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002330The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002331
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002332#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002333
Martin Blais2856e5f2006-05-26 12:03:27 +00002334/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002335 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002336 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002337 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002338 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002339 * also possible that we return a number of bytes smaller than the request
2340 * bytes.
2341 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002342static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002343sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2344{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002345 ssize_t outlen = -1;
2346 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002347#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002348 int remaining;
2349 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002350#endif
2351
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002352 if (!IS_SELECTABLE(s)) {
2353 select_error();
2354 return -1;
2355 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002356
2357#ifndef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002358 Py_BEGIN_ALLOW_THREADS
2359 timeout = internal_select(s, 0);
2360 if (!timeout)
2361 outlen = recv(s->sock_fd, cbuf, len, flags);
2362 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002364 if (timeout == 1) {
2365 PyErr_SetString(socket_timeout, "timed out");
2366 return -1;
2367 }
2368 if (outlen < 0) {
2369 /* Note: the call to errorhandler() ALWAYS indirectly returned
2370 NULL, so ignore its return value */
2371 s->errorhandler();
2372 return -1;
2373 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002374#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 read_buf = cbuf;
2376 remaining = len;
2377 while (remaining != 0) {
2378 unsigned int segment;
2379 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002380
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002381 segment = remaining /SEGMENT_SIZE;
2382 if (segment != 0) {
2383 segment = SEGMENT_SIZE;
2384 }
2385 else {
2386 segment = remaining;
2387 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002389 Py_BEGIN_ALLOW_THREADS
2390 timeout = internal_select(s, 0);
2391 if (!timeout)
2392 nread = recv(s->sock_fd, read_buf, segment, flags);
2393 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002395 if (timeout == 1) {
2396 PyErr_SetString(socket_timeout, "timed out");
2397 return -1;
2398 }
2399 if (nread < 0) {
2400 s->errorhandler();
2401 return -1;
2402 }
2403 if (nread != remaining) {
2404 read_buf += nread;
2405 break;
2406 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002408 remaining -= segment;
2409 read_buf += segment;
2410 }
2411 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002412#endif /* !__VMS */
2413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002414 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002415}
2416
Guido van Rossum48a680c2001-03-02 06:34:14 +00002417
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002418/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002419
Guido van Rossum73624e91994-10-10 17:59:00 +00002420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002422{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002423 int recvlen, flags = 0;
2424 ssize_t outlen;
2425 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002426
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002427 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2428 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 if (recvlen < 0) {
2431 PyErr_SetString(PyExc_ValueError,
2432 "negative buffersize in recv");
2433 return NULL;
2434 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002435
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002436 /* Allocate a new string. */
2437 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2438 if (buf == NULL)
2439 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002440
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002441 /* Call the guts */
2442 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2443 if (outlen < 0) {
2444 /* An error occurred, release the string and return an
2445 error. */
2446 Py_DECREF(buf);
2447 return NULL;
2448 }
2449 if (outlen != recvlen) {
2450 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002451 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002452 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002453 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002454 return NULL;
2455 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002456
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002457 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002458}
2459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461"recv(buffersize[, flags]) -> data\n\
2462\n\
2463Receive up to buffersize bytes from the socket. For the optional flags\n\
2464argument, see the Unix manual. When no data is available, block until\n\
2465at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002466the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002467
Guido van Rossum30a685f1991-06-27 15:51:29 +00002468
Martin Blaisaf2ae722006-06-04 13:49:49 +00002469/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002470
Martin Blais2856e5f2006-05-26 12:03:27 +00002471static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002472sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002473{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002474 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002475
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002476 int recvlen = 0, flags = 0;
2477 ssize_t readlen;
2478 Py_buffer buf;
2479 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002480
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002481 /* Get the buffer's memory */
2482 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2483 &buf, &recvlen, &flags))
2484 return NULL;
2485 buflen = buf.len;
2486 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002487
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002488 if (recvlen < 0) {
2489 PyErr_SetString(PyExc_ValueError,
2490 "negative buffersize in recv_into");
2491 goto error;
2492 }
2493 if (recvlen == 0) {
2494 /* If nbytes was not specified, use the buffer's length */
2495 recvlen = buflen;
2496 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002498 /* Check if the buffer is large enough */
2499 if (buflen < recvlen) {
2500 PyErr_SetString(PyExc_ValueError,
2501 "buffer too small for requested bytes");
2502 goto error;
2503 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002504
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002505 /* Call the guts */
2506 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2507 if (readlen < 0) {
2508 /* Return an error. */
2509 goto error;
2510 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002511
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002512 PyBuffer_Release(&buf);
2513 /* Return the number of bytes read. Note that we do not do anything
2514 special here in the case that readlen < recvlen. */
2515 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002516
2517error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002518 PyBuffer_Release(&buf);
2519 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002520}
2521
Martin Blaisaf2ae722006-06-04 13:49:49 +00002522PyDoc_STRVAR(recv_into_doc,
2523"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002524\n\
2525A version of recv() that stores its data into a buffer rather than creating \n\
2526a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2527is not specified (or 0), receive up to the size available in the given buffer.\n\
2528\n\
2529See recv() for documentation about the flags.");
2530
2531
2532/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002533 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2534 * into a char buffer. If you have any inc/def ref to do to the objects that
2535 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002536 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002537 * that it is also possible that we return a number of bytes smaller than the
2538 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002539 *
2540 * 'addr' is a return value for the address object. Note that you must decref
2541 * it yourself.
2542 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002543static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002544sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002545 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002546{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002547 sock_addr_t addrbuf;
2548 int timeout;
2549 ssize_t n = -1;
2550 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002551
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002552 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002553
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002554 if (!getsockaddrlen(s, &addrlen))
2555 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002556
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002557 if (!IS_SELECTABLE(s)) {
2558 select_error();
2559 return -1;
2560 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002561
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002562 Py_BEGIN_ALLOW_THREADS
2563 memset(&addrbuf, 0, addrlen);
2564 timeout = internal_select(s, 0);
2565 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002566#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002567#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002568 n = recvfrom(s->sock_fd, cbuf, len, flags,
2569 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002570#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002571 n = recvfrom(s->sock_fd, cbuf, len, flags,
2572 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002573#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002574#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002575 n = recvfrom(s->sock_fd, cbuf, len, flags,
2576 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002577#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002578 }
2579 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002580
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002581 if (timeout == 1) {
2582 PyErr_SetString(socket_timeout, "timed out");
2583 return -1;
2584 }
2585 if (n < 0) {
2586 s->errorhandler();
2587 return -1;
2588 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002589
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002590 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2591 addrlen, s->sock_proto)))
2592 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002594 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002595}
2596
2597/* s.recvfrom(nbytes [,flags]) method */
2598
2599static PyObject *
2600sock_recvfrom(PySocketSockObject *s, PyObject *args)
2601{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002602 PyObject *buf = NULL;
2603 PyObject *addr = NULL;
2604 PyObject *ret = NULL;
2605 int recvlen, flags = 0;
2606 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002607
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002608 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2609 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002610
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002611 if (recvlen < 0) {
2612 PyErr_SetString(PyExc_ValueError,
2613 "negative buffersize in recvfrom");
2614 return NULL;
2615 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002616
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002617 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2618 if (buf == NULL)
2619 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002620
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002621 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2622 recvlen, flags, &addr);
2623 if (outlen < 0) {
2624 goto finally;
2625 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002626
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002627 if (outlen != recvlen) {
2628 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002629 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002630 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002631 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002632 goto finally;
2633 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002634
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002635 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002636
2637finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002638 Py_XDECREF(buf);
2639 Py_XDECREF(addr);
2640 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002641}
2642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002643PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2645\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002646Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002647
Martin Blais2856e5f2006-05-26 12:03:27 +00002648
Martin Blaisaf2ae722006-06-04 13:49:49 +00002649/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002650
2651static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002652sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002653{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002654 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002656 int recvlen = 0, flags = 0;
2657 ssize_t readlen;
2658 Py_buffer buf;
2659 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002660
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002661 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002662
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002663 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2664 kwlist, &buf,
2665 &recvlen, &flags))
2666 return NULL;
2667 buflen = buf.len;
2668 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002669
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002670 if (recvlen < 0) {
2671 PyErr_SetString(PyExc_ValueError,
2672 "negative buffersize in recvfrom_into");
2673 goto error;
2674 }
2675 if (recvlen == 0) {
2676 /* If nbytes was not specified, use the buffer's length */
2677 recvlen = buflen;
2678 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002679
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002680 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2681 if (readlen < 0) {
2682 /* Return an error */
2683 goto error;
2684 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002685
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002686 PyBuffer_Release(&buf);
2687 /* Return the number of bytes read and the address. Note that we do
2688 not do anything special here in the case that readlen < recvlen. */
2689 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002690
2691error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002692 Py_XDECREF(addr);
2693 PyBuffer_Release(&buf);
2694 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002695}
2696
Martin Blaisaf2ae722006-06-04 13:49:49 +00002697PyDoc_STRVAR(recvfrom_into_doc,
2698"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002699\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002700Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002701
2702
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002703/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002704
Guido van Rossum73624e91994-10-10 17:59:00 +00002705static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002706sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002707{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002708 char *buf;
2709 int len, n = -1, flags = 0, timeout;
2710 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002712 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2713 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002715 if (!IS_SELECTABLE(s)) {
2716 PyBuffer_Release(&pbuf);
2717 return select_error();
2718 }
2719 buf = pbuf.buf;
2720 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002721
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002722 Py_BEGIN_ALLOW_THREADS
2723 timeout = internal_select(s, 1);
2724 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002725#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002726 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002727#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002728 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002729#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002730 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002731
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002732 PyBuffer_Release(&pbuf);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002733
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002734 if (timeout == 1) {
2735 PyErr_SetString(socket_timeout, "timed out");
2736 return NULL;
2737 }
2738 if (n < 0)
2739 return s->errorhandler();
2740 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002741}
2742
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002743PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002744"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002745\n\
2746Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002747argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002748sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002749
2750
2751/* s.sendall(data [,flags]) method */
2752
2753static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002754sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002755{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002756 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002757 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002758 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002759
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002760 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2761 return NULL;
2762 buf = pbuf.buf;
2763 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002764
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002765 if (!IS_SELECTABLE(s)) {
2766 PyBuffer_Release(&pbuf);
2767 return select_error();
2768 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002769
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002770 do {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002771 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002772 timeout = internal_select(s, 1);
2773 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002774 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002775#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002776 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002777#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002778 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002779#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002780 }
2781 Py_END_ALLOW_THREADS
2782 if (timeout == 1) {
2783 PyBuffer_Release(&pbuf);
2784 PyErr_SetString(socket_timeout, "timed out");
2785 return NULL;
2786 }
2787 /* PyErr_CheckSignals() might change errno */
2788 saved_errno = errno;
2789 /* We must run our signal handlers before looping again.
2790 send() can return a successful partial write when it is
2791 interrupted, so we can't restrict ourselves to EINTR. */
2792 if (PyErr_CheckSignals()) {
2793 PyBuffer_Release(&pbuf);
2794 return NULL;
2795 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002797 /* If interrupted, try again */
2798 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002800 else
2801 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 }
2803 buf += n;
2804 len -= n;
2805 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002806 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002808 if (n < 0)
2809 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002810
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002811 Py_INCREF(Py_None);
2812 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002813}
2814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002815PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002816"sendall(data[, flags])\n\
2817\n\
2818Send a data string to the socket. For the optional flags\n\
2819argument, see the Unix manual. This calls send() repeatedly\n\
2820until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002821to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002822
Guido van Rossum30a685f1991-06-27 15:51:29 +00002823
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002824/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002825
Guido van Rossum73624e91994-10-10 17:59:00 +00002826static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002827sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002828{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002829 Py_buffer pbuf;
2830 PyObject *addro;
2831 char *buf;
2832 Py_ssize_t len;
2833 sock_addr_t addrbuf;
2834 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002835 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002836
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002837 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002838 arglen = PyTuple_Size(args);
2839 switch(arglen) {
2840 case 2:
2841 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2842 break;
2843 case 3:
2844 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2845 break;
2846 default:
2847 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2848 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002849 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002850 if (PyErr_Occurred())
2851 return NULL;
2852
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002853 buf = pbuf.buf;
2854 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002855
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002856 if (!IS_SELECTABLE(s)) {
2857 PyBuffer_Release(&pbuf);
2858 return select_error();
2859 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002860
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002861 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2862 PyBuffer_Release(&pbuf);
2863 return NULL;
2864 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002866 Py_BEGIN_ALLOW_THREADS
2867 timeout = internal_select(s, 1);
2868 if (!timeout)
2869 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2870 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002871
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002872 PyBuffer_Release(&pbuf);
2873 if (timeout == 1) {
2874 PyErr_SetString(socket_timeout, "timed out");
2875 return NULL;
2876 }
2877 if (n < 0)
2878 return s->errorhandler();
2879 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002880}
2881
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002882PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002883"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002884\n\
2885Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002886For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002887
Guido van Rossum30a685f1991-06-27 15:51:29 +00002888
2889/* s.shutdown(how) method */
2890
Guido van Rossum73624e91994-10-10 17:59:00 +00002891static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002892sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002893{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 int how;
2895 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002896
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002897 how = PyInt_AsLong(arg);
2898 if (how == -1 && PyErr_Occurred())
2899 return NULL;
2900 Py_BEGIN_ALLOW_THREADS
2901 res = shutdown(s->sock_fd, how);
2902 Py_END_ALLOW_THREADS
2903 if (res < 0)
2904 return s->errorhandler();
2905 Py_INCREF(Py_None);
2906 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002907}
2908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002910"shutdown(flag)\n\
2911\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002912Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2913of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002914
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002915#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002916static PyObject*
2917sock_ioctl(PySocketSockObject *s, PyObject *arg)
2918{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002919 unsigned long cmd = SIO_RCVALL;
2920 PyObject *argO;
2921 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002922
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002923 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2924 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002925
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002926 switch (cmd) {
2927 case SIO_RCVALL: {
2928 unsigned int option = RCVALL_ON;
2929 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2930 return NULL;
2931 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2932 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2933 return set_error();
2934 }
2935 return PyLong_FromUnsignedLong(recv); }
2936 case SIO_KEEPALIVE_VALS: {
2937 struct tcp_keepalive ka;
2938 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2939 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2940 return NULL;
2941 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2942 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2943 return set_error();
2944 }
2945 return PyLong_FromUnsignedLong(recv); }
2946 default:
2947 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2948 return NULL;
2949 }
Christian Heimes04ae9162008-01-04 15:23:30 +00002950}
2951PyDoc_STRVAR(sock_ioctl_doc,
2952"ioctl(cmd, option) -> long\n\
2953\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00002954Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2955SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2956SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00002957
2958#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002959
2960/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002961
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002962static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002963 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2964 accept_doc},
2965 {"bind", (PyCFunction)sock_bind, METH_O,
2966 bind_doc},
2967 {"close", (PyCFunction)sock_close, METH_NOARGS,
2968 close_doc},
2969 {"connect", (PyCFunction)sock_connect, METH_O,
2970 connect_doc},
2971 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2972 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002973#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002974 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2975 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002976#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002977 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2978 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002979#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002980 {"getpeername", (PyCFunction)sock_getpeername,
2981 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002982#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002983 {"getsockname", (PyCFunction)sock_getsockname,
2984 METH_NOARGS, getsockname_doc},
2985 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2986 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002987#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002988 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2989 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00002990#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002991 {"listen", (PyCFunction)sock_listen, METH_O,
2992 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002993#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002994 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2995 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002996#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002997 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2998 recv_doc},
2999 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3000 recv_into_doc},
3001 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3002 recvfrom_doc},
3003 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3004 recvfrom_into_doc},
3005 {"send", (PyCFunction)sock_send, METH_VARARGS,
3006 send_doc},
3007 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3008 sendall_doc},
3009 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3010 sendto_doc},
3011 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3012 setblocking_doc},
3013 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3014 settimeout_doc},
3015 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3016 gettimeout_doc},
3017 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3018 setsockopt_doc},
3019 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3020 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003021#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003022 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3023 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003024#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003025 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003026};
3027
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003028/* SockObject members */
3029static PyMemberDef sock_memberlist[] = {
3030 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3031 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3032 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3033 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3034 {0},
3035};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003036
Guido van Rossum73624e91994-10-10 17:59:00 +00003037/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003038 First close the file description. */
3039
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003040static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003041sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003042{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003043 if (s->sock_fd != -1)
3044 (void) SOCKETCLOSE(s->sock_fd);
3045 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003046}
3047
Guido van Rossum30a685f1991-06-27 15:51:29 +00003048
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003049static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003050sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003051{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003052 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003053#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003054 if (s->sock_fd > LONG_MAX) {
3055 /* this can occur on Win64, and actually there is a special
3056 ugly printf formatter for decimal pointer length integer
3057 printing, only bother if necessary*/
3058 PyErr_SetString(PyExc_OverflowError,
3059 "no printf formatter to display "
3060 "the socket descriptor in decimal");
3061 return NULL;
3062 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003063#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003064 PyOS_snprintf(
3065 buf, sizeof(buf),
3066 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3067 (long)s->sock_fd, s->sock_family,
3068 s->sock_type,
3069 s->sock_proto);
3070 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003071}
3072
3073
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003074/* Create a new, uninitialized socket object. */
3075
3076static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003077sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003078{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003079 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003080
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003081 new = type->tp_alloc(type, 0);
3082 if (new != NULL) {
3083 ((PySocketSockObject *)new)->sock_fd = -1;
3084 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3085 ((PySocketSockObject *)new)->errorhandler = &set_error;
3086 }
3087 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003088}
3089
3090
3091/* Initialize a new socket object. */
3092
3093/*ARGSUSED*/
3094static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003095sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003096{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003097 PySocketSockObject *s = (PySocketSockObject *)self;
3098 SOCKET_T fd;
3099 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3100 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003101
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003102 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3103 "|iii:socket", keywords,
3104 &family, &type, &proto))
3105 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003106
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003107 Py_BEGIN_ALLOW_THREADS
3108 fd = socket(family, type, proto);
3109 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003110
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003111#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003112 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003113#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003114 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003115#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003116 {
3117 set_error();
3118 return -1;
3119 }
3120 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003121
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003122 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003123
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003124}
3125
3126
Guido van Rossumb6775db1994-08-01 11:34:53 +00003127/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003128
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003129static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003130 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3131 "_socket.socket", /* tp_name */
3132 sizeof(PySocketSockObject), /* tp_basicsize */
3133 0, /* tp_itemsize */
3134 (destructor)sock_dealloc, /* tp_dealloc */
3135 0, /* tp_print */
3136 0, /* tp_getattr */
3137 0, /* tp_setattr */
3138 0, /* tp_compare */
3139 (reprfunc)sock_repr, /* tp_repr */
3140 0, /* tp_as_number */
3141 0, /* tp_as_sequence */
3142 0, /* tp_as_mapping */
3143 0, /* tp_hash */
3144 0, /* tp_call */
3145 0, /* tp_str */
3146 PyObject_GenericGetAttr, /* tp_getattro */
3147 0, /* tp_setattro */
3148 0, /* tp_as_buffer */
3149 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3150 sock_doc, /* tp_doc */
3151 0, /* tp_traverse */
3152 0, /* tp_clear */
3153 0, /* tp_richcompare */
3154 0, /* tp_weaklistoffset */
3155 0, /* tp_iter */
3156 0, /* tp_iternext */
3157 sock_methods, /* tp_methods */
3158 sock_memberlist, /* tp_members */
3159 0, /* tp_getset */
3160 0, /* tp_base */
3161 0, /* tp_dict */
3162 0, /* tp_descr_get */
3163 0, /* tp_descr_set */
3164 0, /* tp_dictoffset */
3165 sock_initobj, /* tp_init */
3166 PyType_GenericAlloc, /* tp_alloc */
3167 sock_new, /* tp_new */
3168 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003169};
3170
Guido van Rossum30a685f1991-06-27 15:51:29 +00003171
Guido van Rossum81194471991-07-27 21:42:02 +00003172/* Python interface to gethostname(). */
3173
3174/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003175static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003176socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003177{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003178 char buf[1024];
3179 int res;
3180 Py_BEGIN_ALLOW_THREADS
3181 res = gethostname(buf, (int) sizeof buf - 1);
3182 Py_END_ALLOW_THREADS
3183 if (res < 0)
3184 return set_error();
3185 buf[sizeof buf - 1] = '\0';
3186 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003187}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003189PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003190"gethostname() -> string\n\
3191\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003192Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003193
Guido van Rossumff4949e1992-08-05 19:58:53 +00003194
Guido van Rossum30a685f1991-06-27 15:51:29 +00003195/* Python interface to gethostbyname(name). */
3196
3197/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003199socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003200{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003201 char *name;
3202 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003203
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003204 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3205 return NULL;
3206 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3207 return NULL;
3208 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003209}
3210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003211PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003212"gethostbyname(host) -> address\n\
3213\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003214Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003215
3216
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003217/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3218
3219static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003220gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003221{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003222 char **pch;
3223 PyObject *rtn_tuple = (PyObject *)NULL;
3224 PyObject *name_list = (PyObject *)NULL;
3225 PyObject *addr_list = (PyObject *)NULL;
3226 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003227
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003228 if (h == NULL) {
3229 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003230#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003231 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003232#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003233 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003234#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003235 return NULL;
3236 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003237
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003238 if (h->h_addrtype != af) {
3239 /* Let's get real error message to return */
3240 PyErr_SetString(socket_error,
3241 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003242
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003243 return NULL;
3244 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003245
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003246 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003247
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003248 case AF_INET:
3249 if (alen < sizeof(struct sockaddr_in))
3250 return NULL;
3251 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003252
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003253#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003254 case AF_INET6:
3255 if (alen < sizeof(struct sockaddr_in6))
3256 return NULL;
3257 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003258#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003259
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003260 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003261
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003262 if ((name_list = PyList_New(0)) == NULL)
3263 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003264
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003265 if ((addr_list = PyList_New(0)) == NULL)
3266 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003267
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003268 /* SF #1511317: h_aliases can be NULL */
3269 if (h->h_aliases) {
3270 for (pch = h->h_aliases; *pch != NULL; pch++) {
3271 int status;
3272 tmp = PyString_FromString(*pch);
3273 if (tmp == NULL)
3274 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003275
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003276 status = PyList_Append(name_list, tmp);
3277 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003278
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003279 if (status)
3280 goto err;
3281 }
3282 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003283
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003284 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3285 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003286
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003287 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003288
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003289 case AF_INET:
3290 {
3291 struct sockaddr_in sin;
3292 memset(&sin, 0, sizeof(sin));
3293 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003294#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003295 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003296#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003297 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3298 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003299
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003300 if (pch == h->h_addr_list && alen >= sizeof(sin))
3301 memcpy((char *) addr, &sin, sizeof(sin));
3302 break;
3303 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003304
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003305#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003306 case AF_INET6:
3307 {
3308 struct sockaddr_in6 sin6;
3309 memset(&sin6, 0, sizeof(sin6));
3310 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003311#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003312 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003313#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003314 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3315 tmp = makeipaddr((struct sockaddr *)&sin6,
3316 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003318 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3319 memcpy((char *) addr, &sin6, sizeof(sin6));
3320 break;
3321 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003322#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 default: /* can't happen */
3325 PyErr_SetString(socket_error,
3326 "unsupported address family");
3327 return NULL;
3328 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003329
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003330 if (tmp == NULL)
3331 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003333 status = PyList_Append(addr_list, tmp);
3334 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003335
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003336 if (status)
3337 goto err;
3338 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003339
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003341
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003342 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003343 Py_XDECREF(name_list);
3344 Py_XDECREF(addr_list);
3345 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003346}
3347
3348
3349/* Python interface to gethostbyname_ex(name). */
3350
3351/*ARGSUSED*/
3352static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003353socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003354{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003355 char *name;
3356 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003357#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003358 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003359#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003360 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003361#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 struct sockaddr *sa;
3363 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003364#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003365 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003366#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003367 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003368#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003369 char buf[16384];
3370 int buf_len = (sizeof buf) - 1;
3371 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003372#endif
3373#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003374 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003375#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003376#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003378 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3379 return NULL;
3380 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3381 return NULL;
3382 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003383#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003384#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003385 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3386 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003387#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003388 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003389#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003390 memset((void *) &data, '\0', sizeof(data));
3391 result = gethostbyname_r(name, &hp_allocated, &data);
3392 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003393#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003394#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003395#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003396 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003397#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003398 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003399#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003400 Py_END_ALLOW_THREADS
3401 /* Some C libraries would require addr.__ss_family instead of
3402 addr.ss_family.
3403 Therefore, we cast the sockaddr_storage into sockaddr to
3404 access sa_family. */
3405 sa = (struct sockaddr*)&addr;
3406 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3407 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003408#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003409 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003410#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003411 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003412}
3413
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003414PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003415"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3416\n\
3417Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003418for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003419
3420
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003421/* Python interface to gethostbyaddr(IP). */
3422
3423/*ARGSUSED*/
3424static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003425socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003426{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003427#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003428 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003429#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003430 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003431#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003432 struct sockaddr *sa = (struct sockaddr *)&addr;
3433 char *ip_num;
3434 struct hostent *h;
3435 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003436#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003437 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003438#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003439 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003440#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003441 /* glibcs up to 2.10 assume that the buf argument to
3442 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3443 does not ensure. The attribute below instructs the compiler
3444 to maintain this alignment. */
3445 char buf[16384] Py_ALIGNED(8);
3446 int buf_len = (sizeof buf) - 1;
3447 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003448#endif
3449#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003450 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003451#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003452#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003453 char *ap;
3454 int al;
3455 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003456
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003457 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3458 return NULL;
3459 af = AF_UNSPEC;
3460 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3461 return NULL;
3462 af = sa->sa_family;
3463 ap = NULL;
3464 switch (af) {
3465 case AF_INET:
3466 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3467 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3468 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003469#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003470 case AF_INET6:
3471 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3472 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3473 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003474#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003475 default:
3476 PyErr_SetString(socket_error, "unsupported address family");
3477 return NULL;
3478 }
3479 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003480#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003481#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003482 result = gethostbyaddr_r(ap, al, af,
3483 &hp_allocated, buf, buf_len,
3484 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003485#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003486 h = gethostbyaddr_r(ap, al, af,
3487 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003488#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003489 memset((void *) &data, '\0', sizeof(data));
3490 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3491 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003492#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003493#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003494#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003495 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003496#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003497 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003498#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003499 Py_END_ALLOW_THREADS
3500 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003501#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003502 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003503#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003504 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003505}
3506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003507PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003508"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3509\n\
3510Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003511for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003512
Guido van Rossum30a685f1991-06-27 15:51:29 +00003513
3514/* Python interface to getservbyname(name).
3515 This only returns the port number, since the other info is already
3516 known or not useful (like the list of aliases). */
3517
3518/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003520socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003521{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003522 char *name, *proto=NULL;
3523 struct servent *sp;
3524 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3525 return NULL;
3526 Py_BEGIN_ALLOW_THREADS
3527 sp = getservbyname(name, proto);
3528 Py_END_ALLOW_THREADS
3529 if (sp == NULL) {
3530 PyErr_SetString(socket_error, "service/proto not found");
3531 return NULL;
3532 }
3533 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003534}
3535
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003536PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003537"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003538\n\
3539Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003540The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3541otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003542
Guido van Rossum30a685f1991-06-27 15:51:29 +00003543
Barry Warsaw11b91a02004-06-28 00:50:43 +00003544/* Python interface to getservbyport(port).
3545 This only returns the service name, since the other info is already
3546 known or not useful (like the list of aliases). */
3547
3548/*ARGSUSED*/
3549static PyObject *
3550socket_getservbyport(PyObject *self, PyObject *args)
3551{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003552 int port;
3553 char *proto=NULL;
3554 struct servent *sp;
3555 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3556 return NULL;
3557 if (port < 0 || port > 0xffff) {
3558 PyErr_SetString(
3559 PyExc_OverflowError,
3560 "getservbyport: port must be 0-65535.");
3561 return NULL;
3562 }
3563 Py_BEGIN_ALLOW_THREADS
3564 sp = getservbyport(htons((short)port), proto);
3565 Py_END_ALLOW_THREADS
3566 if (sp == NULL) {
3567 PyErr_SetString(socket_error, "port/proto not found");
3568 return NULL;
3569 }
3570 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003571}
3572
3573PyDoc_STRVAR(getservbyport_doc,
3574"getservbyport(port[, protocolname]) -> string\n\
3575\n\
3576Return the service name from a port number and protocol name.\n\
3577The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3578otherwise any protocol will match.");
3579
Guido van Rossum3901d851996-12-19 16:35:04 +00003580/* Python interface to getprotobyname(name).
3581 This only returns the protocol number, since the other info is
3582 already known or not useful (like the list of aliases). */
3583
3584/*ARGSUSED*/
3585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003586socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003587{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003588 char *name;
3589 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003590#ifdef __BEOS__
3591/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003592 PyErr_SetString(socket_error, "getprotobyname not supported");
3593 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003594#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003595 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3596 return NULL;
3597 Py_BEGIN_ALLOW_THREADS
3598 sp = getprotobyname(name);
3599 Py_END_ALLOW_THREADS
3600 if (sp == NULL) {
3601 PyErr_SetString(socket_error, "protocol not found");
3602 return NULL;
3603 }
3604 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003605#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003606}
3607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003608PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003609"getprotobyname(name) -> integer\n\
3610\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003611Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003612
Guido van Rossum3901d851996-12-19 16:35:04 +00003613
Dave Cole331708b2004-08-09 04:51:41 +00003614#ifdef HAVE_SOCKETPAIR
3615/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003616 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003617 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003618
3619/*ARGSUSED*/
3620static PyObject *
3621socket_socketpair(PyObject *self, PyObject *args)
3622{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003623 PySocketSockObject *s0 = NULL, *s1 = NULL;
3624 SOCKET_T sv[2];
3625 int family, type = SOCK_STREAM, proto = 0;
3626 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003627
3628#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003629 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003630#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003631 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003632#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003633 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3634 &family, &type, &proto))
3635 return NULL;
3636 /* Create a pair of socket fds */
3637 if (socketpair(family, type, proto, sv) < 0)
3638 return set_error();
3639 s0 = new_sockobject(sv[0], family, type, proto);
3640 if (s0 == NULL)
3641 goto finally;
3642 s1 = new_sockobject(sv[1], family, type, proto);
3643 if (s1 == NULL)
3644 goto finally;
3645 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003646
3647finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003648 if (res == NULL) {
3649 if (s0 == NULL)
3650 SOCKETCLOSE(sv[0]);
3651 if (s1 == NULL)
3652 SOCKETCLOSE(sv[1]);
3653 }
3654 Py_XDECREF(s0);
3655 Py_XDECREF(s1);
3656 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003657}
3658
3659PyDoc_STRVAR(socketpair_doc,
3660"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3661\n\
3662Create a pair of socket objects from the sockets returned by the platform\n\
3663socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003664The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003665AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003666
3667#endif /* HAVE_SOCKETPAIR */
3668
3669
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003670#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003671/* Create a socket object from a numeric file description.
3672 Useful e.g. if stdin is a socket.
3673 Additional arguments as for socket(). */
3674
3675/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003677socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003678{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003679 PySocketSockObject *s;
3680 SOCKET_T fd;
3681 int family, type, proto = 0;
3682 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3683 &fd, &family, &type, &proto))
3684 return NULL;
3685 /* Dup the fd so it and the socket can be closed independently */
3686 fd = dup(fd);
3687 if (fd < 0)
3688 return set_error();
3689 s = new_sockobject(fd, family, type, proto);
3690 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003691}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003692
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003693PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003694"fromfd(fd, family, type[, proto]) -> socket object\n\
3695\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003696Create a socket object from a duplicate of the given\n\
3697file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003698The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003699
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003700#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003701
Guido van Rossum82a5c661998-07-07 20:45:43 +00003702
Guido van Rossum006bf911996-06-12 04:04:55 +00003703static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003704socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003705{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003706 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003707
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003708 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3709 return NULL;
3710 }
3711 if (x1 < 0) {
3712 PyErr_SetString(PyExc_OverflowError,
3713 "can't convert negative number to unsigned long");
3714 return NULL;
3715 }
3716 x2 = (unsigned int)ntohs((unsigned short)x1);
3717 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003718}
3719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003720PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003721"ntohs(integer) -> integer\n\
3722\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003723Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003724
3725
Guido van Rossum006bf911996-06-12 04:04:55 +00003726static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003727socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003728{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003729 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003731 if (PyInt_Check(arg)) {
3732 x = PyInt_AS_LONG(arg);
3733 if (x == (unsigned long) -1 && PyErr_Occurred())
3734 return NULL;
3735 if ((long)x < 0) {
3736 PyErr_SetString(PyExc_OverflowError,
3737 "can't convert negative number to unsigned long");
3738 return NULL;
3739 }
3740 }
3741 else if (PyLong_Check(arg)) {
3742 x = PyLong_AsUnsignedLong(arg);
3743 if (x == (unsigned long) -1 && PyErr_Occurred())
3744 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003745#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003746 {
3747 unsigned long y;
3748 /* only want the trailing 32 bits */
3749 y = x & 0xFFFFFFFFUL;
3750 if (y ^ x)
3751 return PyErr_Format(PyExc_OverflowError,
3752 "long int larger than 32 bits");
3753 x = y;
3754 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003755#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003756 }
3757 else
3758 return PyErr_Format(PyExc_TypeError,
3759 "expected int/long, %s found",
3760 Py_TYPE(arg)->tp_name);
3761 if (x == (unsigned long) -1 && PyErr_Occurred())
3762 return NULL;
3763 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003764}
3765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003766PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003767"ntohl(integer) -> integer\n\
3768\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003769Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003770
3771
Guido van Rossum006bf911996-06-12 04:04:55 +00003772static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003773socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003774{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003775 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003776
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003777 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3778 return NULL;
3779 }
3780 if (x1 < 0) {
3781 PyErr_SetString(PyExc_OverflowError,
3782 "can't convert negative number to unsigned long");
3783 return NULL;
3784 }
3785 x2 = (unsigned int)htons((unsigned short)x1);
3786 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003787}
3788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003789PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003790"htons(integer) -> integer\n\
3791\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003792Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003793
3794
Guido van Rossum006bf911996-06-12 04:04:55 +00003795static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003796socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003797{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003798 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003799
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003800 if (PyInt_Check(arg)) {
3801 x = PyInt_AS_LONG(arg);
3802 if (x == (unsigned long) -1 && PyErr_Occurred())
3803 return NULL;
3804 if ((long)x < 0) {
3805 PyErr_SetString(PyExc_OverflowError,
3806 "can't convert negative number to unsigned long");
3807 return NULL;
3808 }
3809 }
3810 else if (PyLong_Check(arg)) {
3811 x = PyLong_AsUnsignedLong(arg);
3812 if (x == (unsigned long) -1 && PyErr_Occurred())
3813 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003814#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003815 {
3816 unsigned long y;
3817 /* only want the trailing 32 bits */
3818 y = x & 0xFFFFFFFFUL;
3819 if (y ^ x)
3820 return PyErr_Format(PyExc_OverflowError,
3821 "long int larger than 32 bits");
3822 x = y;
3823 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003824#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003825 }
3826 else
3827 return PyErr_Format(PyExc_TypeError,
3828 "expected int/long, %s found",
3829 Py_TYPE(arg)->tp_name);
3830 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003831}
3832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003833PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003834"htonl(integer) -> integer\n\
3835\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003836Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003837
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003838/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003840PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003841"inet_aton(string) -> packed 32-bit IP representation\n\
3842\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003843Convert 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 +00003844binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003845
3846static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003847socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003848{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003849#ifndef INADDR_NONE
3850#define INADDR_NONE (-1)
3851#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003852#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003853 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003854#endif
3855
3856#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003857#if (SIZEOF_INT != 4)
3858#error "Not sure if in_addr_t exists and int is not 32-bits."
3859#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003860 /* Have to use inet_addr() instead */
3861 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003862#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003863 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003864
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003865 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3866 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003867
Tim Peters1df9fdd2003-02-13 03:13:40 +00003868
3869#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003870
3871#ifdef USE_INET_ATON_WEAKLINK
3872 if (inet_aton != NULL) {
3873#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003874 if (inet_aton(ip_addr, &buf))
3875 return PyString_FromStringAndSize((char *)(&buf),
3876 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003878 PyErr_SetString(socket_error,
3879 "illegal IP address string passed to inet_aton");
3880 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003881
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003882#ifdef USE_INET_ATON_WEAKLINK
3883 } else {
3884#endif
3885
3886#endif
3887
3888#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003890 /* special-case this address as inet_addr might return INADDR_NONE
3891 * for this */
3892 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3893 packed_addr = 0xFFFFFFFF;
3894 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003895
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003896 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003897
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003898 if (packed_addr == INADDR_NONE) { /* invalid address */
3899 PyErr_SetString(socket_error,
3900 "illegal IP address string passed to inet_aton");
3901 return NULL;
3902 }
3903 }
3904 return PyString_FromStringAndSize((char *) &packed_addr,
3905 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003906
3907#ifdef USE_INET_ATON_WEAKLINK
3908 }
3909#endif
3910
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003911#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003912}
3913
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003914PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003915"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003916\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003917Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003918
3919static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003920socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003921{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003922 char *packed_str;
3923 int addr_len;
3924 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003925
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003926 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
3927 return NULL;
3928 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003929
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003930 if (addr_len != sizeof(packed_addr)) {
3931 PyErr_SetString(socket_error,
3932 "packed IP wrong length for inet_ntoa");
3933 return NULL;
3934 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003935
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003936 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003937
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003938 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003939}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003940
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003941#ifdef HAVE_INET_PTON
3942
3943PyDoc_STRVAR(inet_pton_doc,
3944"inet_pton(af, ip) -> packed IP address string\n\
3945\n\
3946Convert an IP address from string format to a packed string suitable\n\
3947for use with low-level network functions.");
3948
3949static PyObject *
3950socket_inet_pton(PyObject *self, PyObject *args)
3951{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 int af;
3953 char* ip;
3954 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003955#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003956 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003957#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003958 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003959#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003960 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3961 return NULL;
3962 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003963
Martin v. Löwis04697e82004-06-02 12:35:29 +00003964#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003965 if(af == AF_INET6) {
3966 PyErr_SetString(socket_error,
3967 "can't use AF_INET6, IPv6 is disabled");
3968 return NULL;
3969 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003970#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003971
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003972 retval = inet_pton(af, ip, packed);
3973 if (retval < 0) {
3974 PyErr_SetFromErrno(socket_error);
3975 return NULL;
3976 } else if (retval == 0) {
3977 PyErr_SetString(socket_error,
3978 "illegal IP address string passed to inet_pton");
3979 return NULL;
3980 } else if (af == AF_INET) {
3981 return PyString_FromStringAndSize(packed,
3982 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003983#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003984 } else if (af == AF_INET6) {
3985 return PyString_FromStringAndSize(packed,
3986 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003987#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003988 } else {
3989 PyErr_SetString(socket_error, "unknown address family");
3990 return NULL;
3991 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003992}
Martin Blais2856e5f2006-05-26 12:03:27 +00003993
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003994PyDoc_STRVAR(inet_ntop_doc,
3995"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3996\n\
3997Convert a packed IP address of the given family to string format.");
3998
3999static PyObject *
4000socket_inet_ntop(PyObject *self, PyObject *args)
4001{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004002 int af;
4003 char* packed;
4004 int len;
4005 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004006#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004007 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004008#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004009 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004010#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004012 /* Guarantee NUL-termination for PyString_FromString() below */
4013 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004014
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004015 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4016 return NULL;
4017 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004018
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004019 if (af == AF_INET) {
4020 if (len != sizeof(struct in_addr)) {
4021 PyErr_SetString(PyExc_ValueError,
4022 "invalid length of packed IP address string");
4023 return NULL;
4024 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004025#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004026 } else if (af == AF_INET6) {
4027 if (len != sizeof(struct in6_addr)) {
4028 PyErr_SetString(PyExc_ValueError,
4029 "invalid length of packed IP address string");
4030 return NULL;
4031 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004032#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004033 } else {
4034 PyErr_Format(PyExc_ValueError,
4035 "unknown address family %d", af);
4036 return NULL;
4037 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004039 retval = inet_ntop(af, packed, ip, sizeof(ip));
4040 if (!retval) {
4041 PyErr_SetFromErrno(socket_error);
4042 return NULL;
4043 } else {
4044 return PyString_FromString(retval);
4045 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004046
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004047 /* NOTREACHED */
4048 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4049 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004050}
4051
4052#endif /* HAVE_INET_PTON */
4053
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004054/* Python interface to getaddrinfo(host, port). */
4055
4056/*ARGSUSED*/
4057static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004058socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004059{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004060 struct addrinfo hints, *res;
4061 struct addrinfo *res0 = NULL;
4062 PyObject *hobj = NULL;
4063 PyObject *pobj = (PyObject *)NULL;
4064 char pbuf[30];
4065 char *hptr, *pptr;
4066 int family, socktype, protocol, flags;
4067 int error;
4068 PyObject *all = (PyObject *)NULL;
4069 PyObject *single = (PyObject *)NULL;
4070 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004071
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004072 family = socktype = protocol = flags = 0;
4073 family = AF_UNSPEC;
4074 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4075 &hobj, &pobj, &family, &socktype,
4076 &protocol, &flags)) {
4077 return NULL;
4078 }
4079 if (hobj == Py_None) {
4080 hptr = NULL;
4081 } else if (PyUnicode_Check(hobj)) {
4082 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4083 if (!idna)
4084 return NULL;
4085 hptr = PyString_AsString(idna);
4086 } else if (PyString_Check(hobj)) {
4087 hptr = PyString_AsString(hobj);
4088 } else {
4089 PyErr_SetString(PyExc_TypeError,
4090 "getaddrinfo() argument 1 must be string or None");
4091 return NULL;
4092 }
4093 if (PyInt_Check(pobj)) {
4094 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
4095 pptr = pbuf;
4096 } else if (PyString_Check(pobj)) {
4097 pptr = PyString_AsString(pobj);
4098 } else if (pobj == Py_None) {
4099 pptr = (char *)NULL;
4100 } else {
4101 PyErr_SetString(socket_error, "Int or String expected");
4102 goto err;
4103 }
4104 memset(&hints, 0, sizeof(hints));
4105 hints.ai_family = family;
4106 hints.ai_socktype = socktype;
4107 hints.ai_protocol = protocol;
4108 hints.ai_flags = flags;
4109 Py_BEGIN_ALLOW_THREADS
4110 ACQUIRE_GETADDRINFO_LOCK
4111 error = getaddrinfo(hptr, pptr, &hints, &res0);
4112 Py_END_ALLOW_THREADS
4113 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4114 if (error) {
4115 set_gaierror(error);
4116 goto err;
4117 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004119 if ((all = PyList_New(0)) == NULL)
4120 goto err;
4121 for (res = res0; res; res = res->ai_next) {
4122 PyObject *addr =
4123 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4124 if (addr == NULL)
4125 goto err;
4126 single = Py_BuildValue("iiisO", res->ai_family,
4127 res->ai_socktype, res->ai_protocol,
4128 res->ai_canonname ? res->ai_canonname : "",
4129 addr);
4130 Py_DECREF(addr);
4131 if (single == NULL)
4132 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004134 if (PyList_Append(all, single))
4135 goto err;
4136 Py_XDECREF(single);
4137 }
4138 Py_XDECREF(idna);
4139 if (res0)
4140 freeaddrinfo(res0);
4141 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004142 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004143 Py_XDECREF(single);
4144 Py_XDECREF(all);
4145 Py_XDECREF(idna);
4146 if (res0)
4147 freeaddrinfo(res0);
4148 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004149}
4150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004151PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004152"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4153 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004154\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004155Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004156
4157/* Python interface to getnameinfo(sa, flags). */
4158
4159/*ARGSUSED*/
4160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004161socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004162{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004163 PyObject *sa = (PyObject *)NULL;
4164 int flags;
4165 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004166 int port;
4167 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004168 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4169 struct addrinfo hints, *res = NULL;
4170 int error;
4171 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004172
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004173 flags = flowinfo = scope_id = 0;
4174 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4175 return NULL;
4176 if (!PyTuple_Check(sa)) {
4177 PyErr_SetString(PyExc_TypeError,
4178 "getnameinfo() argument 1 must be a tuple");
4179 return NULL;
4180 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004181 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004182 &hostp, &port, &flowinfo, &scope_id))
4183 return NULL;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004184 if (flowinfo < 0 || flowinfo > 0xfffff) {
4185 PyErr_SetString(PyExc_OverflowError,
4186 "getsockaddrarg: flowinfo must be 0-1048575.");
4187 return NULL;
4188 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004189 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4190 memset(&hints, 0, sizeof(hints));
4191 hints.ai_family = AF_UNSPEC;
4192 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4193 Py_BEGIN_ALLOW_THREADS
4194 ACQUIRE_GETADDRINFO_LOCK
4195 error = getaddrinfo(hostp, pbuf, &hints, &res);
4196 Py_END_ALLOW_THREADS
4197 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4198 if (error) {
4199 set_gaierror(error);
4200 goto fail;
4201 }
4202 if (res->ai_next) {
4203 PyErr_SetString(socket_error,
4204 "sockaddr resolved to multiple addresses");
4205 goto fail;
4206 }
4207 switch (res->ai_family) {
4208 case AF_INET:
4209 {
4210 if (PyTuple_GET_SIZE(sa) != 2) {
4211 PyErr_SetString(socket_error,
4212 "IPv4 sockaddr must be 2 tuple");
4213 goto fail;
4214 }
4215 break;
4216 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004217#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004218 case AF_INET6:
4219 {
4220 struct sockaddr_in6 *sin6;
4221 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004222 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004223 sin6->sin6_scope_id = scope_id;
4224 break;
4225 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004227 }
4228 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4229 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4230 if (error) {
4231 set_gaierror(error);
4232 goto fail;
4233 }
4234 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004235
4236fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004237 if (res)
4238 freeaddrinfo(res);
4239 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004240}
4241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004242PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004243"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004244\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004245Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004246
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004247
4248/* Python API to getting and setting the default timeout value. */
4249
4250static PyObject *
4251socket_getdefaulttimeout(PyObject *self)
4252{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004253 if (defaulttimeout < 0.0) {
4254 Py_INCREF(Py_None);
4255 return Py_None;
4256 }
4257 else
4258 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004259}
4260
4261PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004262"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004263\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004264Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004265A value of None indicates that new socket objects have no timeout.\n\
4266When the socket module is first imported, the default is None.");
4267
4268static PyObject *
4269socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4270{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004271 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004272
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004273 if (arg == Py_None)
4274 timeout = -1.0;
4275 else {
4276 timeout = PyFloat_AsDouble(arg);
4277 if (timeout < 0.0) {
4278 if (!PyErr_Occurred())
4279 PyErr_SetString(PyExc_ValueError,
4280 "Timeout value out of range");
4281 return NULL;
4282 }
4283 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004284
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004285 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004286
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004287 Py_INCREF(Py_None);
4288 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004289}
4290
4291PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004292"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004293\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004294Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004295A value of None indicates that new socket objects have no timeout.\n\
4296When the socket module is first imported, the default is None.");
4297
4298
Guido van Rossum30a685f1991-06-27 15:51:29 +00004299/* List of functions exported by this module. */
4300
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004301static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004302 {"gethostbyname", socket_gethostbyname,
4303 METH_VARARGS, gethostbyname_doc},
4304 {"gethostbyname_ex", socket_gethostbyname_ex,
4305 METH_VARARGS, ghbn_ex_doc},
4306 {"gethostbyaddr", socket_gethostbyaddr,
4307 METH_VARARGS, gethostbyaddr_doc},
4308 {"gethostname", socket_gethostname,
4309 METH_NOARGS, gethostname_doc},
4310 {"getservbyname", socket_getservbyname,
4311 METH_VARARGS, getservbyname_doc},
4312 {"getservbyport", socket_getservbyport,
4313 METH_VARARGS, getservbyport_doc},
4314 {"getprotobyname", socket_getprotobyname,
4315 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004316#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004317 {"fromfd", socket_fromfd,
4318 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004319#endif
Dave Cole331708b2004-08-09 04:51:41 +00004320#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004321 {"socketpair", socket_socketpair,
4322 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004323#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004324 {"ntohs", socket_ntohs,
4325 METH_VARARGS, ntohs_doc},
4326 {"ntohl", socket_ntohl,
4327 METH_O, ntohl_doc},
4328 {"htons", socket_htons,
4329 METH_VARARGS, htons_doc},
4330 {"htonl", socket_htonl,
4331 METH_O, htonl_doc},
4332 {"inet_aton", socket_inet_aton,
4333 METH_VARARGS, inet_aton_doc},
4334 {"inet_ntoa", socket_inet_ntoa,
4335 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004336#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004337 {"inet_pton", socket_inet_pton,
4338 METH_VARARGS, inet_pton_doc},
4339 {"inet_ntop", socket_inet_ntop,
4340 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004341#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004342 {"getaddrinfo", socket_getaddrinfo,
4343 METH_VARARGS, getaddrinfo_doc},
4344 {"getnameinfo", socket_getnameinfo,
4345 METH_VARARGS, getnameinfo_doc},
4346 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4347 METH_NOARGS, getdefaulttimeout_doc},
4348 {"setdefaulttimeout", socket_setdefaulttimeout,
4349 METH_O, setdefaulttimeout_doc},
4350 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004351};
4352
Guido van Rossum30a685f1991-06-27 15:51:29 +00004353
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004354#ifdef RISCOS
4355#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004356
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004357static int
4358os_init(void)
4359{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004360 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004362 r.r[0] = 0;
4363 _kernel_swi(0x43380, &r, &r);
4364 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004365
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004366 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004367}
4368
4369#endif /* RISCOS */
4370
4371
4372#ifdef MS_WINDOWS
4373#define OS_INIT_DEFINED
4374
4375/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004376
4377static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004378os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004379{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004380 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004381}
4382
4383static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004384os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004385{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004386 WSADATA WSAData;
4387 int ret;
4388 char buf[100];
4389 ret = WSAStartup(0x0101, &WSAData);
4390 switch (ret) {
4391 case 0: /* No error */
4392 Py_AtExit(os_cleanup);
4393 return 1; /* Success */
4394 case WSASYSNOTREADY:
4395 PyErr_SetString(PyExc_ImportError,
4396 "WSAStartup failed: network not ready");
4397 break;
4398 case WSAVERNOTSUPPORTED:
4399 case WSAEINVAL:
4400 PyErr_SetString(
4401 PyExc_ImportError,
4402 "WSAStartup failed: requested version not supported");
4403 break;
4404 default:
4405 PyOS_snprintf(buf, sizeof(buf),
4406 "WSAStartup failed: error code %d", ret);
4407 PyErr_SetString(PyExc_ImportError, buf);
4408 break;
4409 }
4410 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004411}
4412
Guido van Rossum8d665e61996-06-26 18:22:49 +00004413#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004414
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004415
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004416#ifdef PYOS_OS2
4417#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004418
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004419/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004420
4421static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004422os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004423{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004424#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004425 char reason[64];
4426 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004427
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004428 if (rc == 0) {
4429 return 1; /* Success */
4430 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004431
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004432 PyOS_snprintf(reason, sizeof(reason),
4433 "OS/2 TCP/IP Error# %d", sock_errno());
4434 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004435
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004436 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004437#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004438 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004439 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004440#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004441}
4442
4443#endif /* PYOS_OS2 */
4444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004445
4446#ifndef OS_INIT_DEFINED
4447static int
4448os_init(void)
4449{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004450 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004451}
4452#endif
4453
4454
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004455/* C API table - always add new things to the end for binary
4456 compatibility. */
4457static
4458PySocketModule_APIObject PySocketModuleAPI =
4459{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004460 &sock_type,
4461 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004462};
4463
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004464
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004465/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004466
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004467 This module is actually called "_socket", and there's a wrapper
4468 "socket.py" which implements some additional functionality. On some
4469 platforms (e.g. Windows and OS/2), socket.py also implements a
4470 wrapper for the socket type that provides missing functionality such
4471 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4472 with an ImportError exception if os-specific initialization fails.
4473 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004474 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004475 made at exit time.
4476*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004478PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004479"Implementation module for socket operations.\n\
4480\n\
4481See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004482
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004483PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004484init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004485{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004486 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004487
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004488 if (!os_init())
4489 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004491 Py_TYPE(&sock_type) = &PyType_Type;
4492 m = Py_InitModule3(PySocket_MODULE_NAME,
4493 socket_methods,
4494 socket_doc);
4495 if (m == NULL)
4496 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004498 socket_error = PyErr_NewException("socket.error",
4499 PyExc_IOError, NULL);
4500 if (socket_error == NULL)
4501 return;
4502 PySocketModuleAPI.error = socket_error;
4503 Py_INCREF(socket_error);
4504 PyModule_AddObject(m, "error", socket_error);
4505 socket_herror = PyErr_NewException("socket.herror",
4506 socket_error, NULL);
4507 if (socket_herror == NULL)
4508 return;
4509 Py_INCREF(socket_herror);
4510 PyModule_AddObject(m, "herror", socket_herror);
4511 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4512 NULL);
4513 if (socket_gaierror == NULL)
4514 return;
4515 Py_INCREF(socket_gaierror);
4516 PyModule_AddObject(m, "gaierror", socket_gaierror);
4517 socket_timeout = PyErr_NewException("socket.timeout",
4518 socket_error, NULL);
4519 if (socket_timeout == NULL)
4520 return;
4521 Py_INCREF(socket_timeout);
4522 PyModule_AddObject(m, "timeout", socket_timeout);
4523 Py_INCREF((PyObject *)&sock_type);
4524 if (PyModule_AddObject(m, "SocketType",
4525 (PyObject *)&sock_type) != 0)
4526 return;
4527 Py_INCREF((PyObject *)&sock_type);
4528 if (PyModule_AddObject(m, "socket",
4529 (PyObject *)&sock_type) != 0)
4530 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004531
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004532#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004533 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004534#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004535 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004536#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004537 Py_INCREF(has_ipv6);
4538 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004539
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004540 /* Export C API */
4541 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4542 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4543 ) != 0)
4544 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004545
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004546 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004547#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004548 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004549#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004550 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004551#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004552 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004553#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004554#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004555 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004556#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004557#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004558 /* Amateur Radio AX.25 */
4559 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004560#endif
4561#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004562 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004563#endif
4564#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004565 /* Appletalk DDP */
4566 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004567#endif
4568#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004569 /* Amateur radio NetROM */
4570 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004571#endif
4572#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004573 /* Multiprotocol bridge */
4574 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004575#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004576#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004577 /* ATM PVCs */
4578 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004579#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004580#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004581 /* Reserved for Werner's ATM */
4582 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004583#endif
4584#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004585 /* Reserved for X.25 project */
4586 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004587#endif
4588#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004589 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004590#endif
4591#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004592 /* Amateur Radio X.25 PLP */
4593 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004594#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004595#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004596 /* Reserved for DECnet project */
4597 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004598#endif
4599#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004600 /* Reserved for 802.2LLC project */
4601 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004602#endif
4603#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004604 /* Security callback pseudo AF */
4605 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004606#endif
4607#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004608 /* PF_KEY key management API */
4609 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004610#endif
4611#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004612 /* */
4613 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4614 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004615#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004616 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004617#endif
4618#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004619 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004620#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004621 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4622 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004623#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004624 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004625#endif
4626#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004627 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004628#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004629#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004630 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004631#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004632#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004633 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004634#endif
4635#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004636 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004637#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004638 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004639#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004640 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4641#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004642#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004643 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004644#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004645#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004646#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004647 /* Alias to emulate 4.4BSD */
4648 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004649#endif
4650#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004651 /* Ash */
4652 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004653#endif
4654#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 /* Acorn Econet */
4656 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004657#endif
4658#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004659 /* ATM SVCs */
4660 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004661#endif
4662#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004663 /* Linux SNA Project (nutters!) */
4664 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004665#endif
4666#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 /* IRDA sockets */
4668 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004669#endif
4670#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004671 /* PPPoX sockets */
4672 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004673#endif
4674#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004675 /* Wanpipe API Sockets */
4676 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004677#endif
4678#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004679 /* Linux LLC */
4680 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004681#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004682
Hye-Shik Chang81268602004-02-02 06:05:24 +00004683#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004684 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4685 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4686 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4687 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004688#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004689 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004690#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004691#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004692#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004693 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004694#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004695 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4696 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004697#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004698 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4699 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4700 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004701#endif
4702
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004703#ifdef AF_PACKET
4704 PyModule_AddIntMacro(m, AF_PACKET);
4705#endif
4706#ifdef PF_PACKET
4707 PyModule_AddIntMacro(m, PF_PACKET);
4708#endif
4709#ifdef PACKET_HOST
4710 PyModule_AddIntMacro(m, PACKET_HOST);
4711#endif
4712#ifdef PACKET_BROADCAST
4713 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4714#endif
4715#ifdef PACKET_MULTICAST
4716 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4717#endif
4718#ifdef PACKET_OTHERHOST
4719 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4720#endif
4721#ifdef PACKET_OUTGOING
4722 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4723#endif
4724#ifdef PACKET_LOOPBACK
4725 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4726#endif
4727#ifdef PACKET_FASTROUTE
4728 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004729#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004730
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004731#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004732 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004733
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004734 /* for addresses */
4735 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4736 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4737 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004738
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004739 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4740 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4741 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004742
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004743 /* for setsockopt() */
4744 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4745 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4746 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4747 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4748 TIPC_DEST_DROPPABLE);
4749 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004750
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004751 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4752 TIPC_LOW_IMPORTANCE);
4753 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4754 TIPC_MEDIUM_IMPORTANCE);
4755 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4756 TIPC_HIGH_IMPORTANCE);
4757 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4758 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004759
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004760 /* for subscriptions */
4761 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4762 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004763#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004764 /* doesn't seem to be available everywhere */
4765 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004766#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004767 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4768 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4769 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4770 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4771 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4772 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004773#endif
4774
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004775 /* Socket types */
4776 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4777 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004778#ifndef __BEOS__
4779/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004780 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4781 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004782#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004783 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004784#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004785#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004786
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004787#ifdef SO_DEBUG
4788 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004789#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004790#ifdef SO_ACCEPTCONN
4791 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004792#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004793#ifdef SO_REUSEADDR
4794 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004795#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004796#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004797 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004798#endif
4799
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004800#ifdef SO_KEEPALIVE
4801 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004802#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004803#ifdef SO_DONTROUTE
4804 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004805#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004806#ifdef SO_BROADCAST
4807 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004808#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004809#ifdef SO_USELOOPBACK
4810 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004811#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004812#ifdef SO_LINGER
4813 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004814#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004815#ifdef SO_OOBINLINE
4816 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004817#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004818#ifdef SO_REUSEPORT
4819 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004820#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004821#ifdef SO_SNDBUF
4822 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004823#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004824#ifdef SO_RCVBUF
4825 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004826#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004827#ifdef SO_SNDLOWAT
4828 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004829#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004830#ifdef SO_RCVLOWAT
4831 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004832#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004833#ifdef SO_SNDTIMEO
4834 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004835#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004836#ifdef SO_RCVTIMEO
4837 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004838#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004839#ifdef SO_ERROR
4840 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004841#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004842#ifdef SO_TYPE
4843 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004844#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004845#ifdef SO_SETFIB
4846 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4847#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004849 /* Maximum number of connections for "listen" */
4850#ifdef SOMAXCONN
4851 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004852#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004853 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004854#endif
4855
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004856 /* Flags for send, recv */
4857#ifdef MSG_OOB
4858 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004859#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004860#ifdef MSG_PEEK
4861 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004862#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004863#ifdef MSG_DONTROUTE
4864 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004865#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866#ifdef MSG_DONTWAIT
4867 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004868#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004869#ifdef MSG_EOR
4870 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004871#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004872#ifdef MSG_TRUNC
4873 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004874#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004875#ifdef MSG_CTRUNC
4876 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004877#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004878#ifdef MSG_WAITALL
4879 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004880#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004881#ifdef MSG_BTAG
4882 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004883#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884#ifdef MSG_ETAG
4885 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004886#endif
4887
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004888 /* Protocol level and numbers, usable for [gs]etsockopt */
4889#ifdef SOL_SOCKET
4890 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004891#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004892#ifdef SOL_IP
4893 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004894#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004895 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004897#ifdef SOL_IPX
4898 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004900#ifdef SOL_AX25
4901 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004902#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903#ifdef SOL_ATALK
4904 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004905#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004906#ifdef SOL_NETROM
4907 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004908#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004909#ifdef SOL_ROSE
4910 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004911#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912#ifdef SOL_TCP
4913 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004914#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004916#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004917#ifdef SOL_UDP
4918 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004919#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004920 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004921#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004922#ifdef IPPROTO_IP
4923 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004924#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004925 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927#ifdef IPPROTO_HOPOPTS
4928 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004930#ifdef IPPROTO_ICMP
4931 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004932#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004934#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004935#ifdef IPPROTO_IGMP
4936 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004937#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004938#ifdef IPPROTO_GGP
4939 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004940#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004941#ifdef IPPROTO_IPV4
4942 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004943#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004944#ifdef IPPROTO_IPV6
4945 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004946#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004947#ifdef IPPROTO_IPIP
4948 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004949#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004950#ifdef IPPROTO_TCP
4951 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004952#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004953 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004954#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004955#ifdef IPPROTO_EGP
4956 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004957#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004958#ifdef IPPROTO_PUP
4959 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004960#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004961#ifdef IPPROTO_UDP
4962 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004963#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004964 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004965#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966#ifdef IPPROTO_IDP
4967 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969#ifdef IPPROTO_HELLO
4970 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972#ifdef IPPROTO_ND
4973 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef IPPROTO_TP
4976 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef IPPROTO_IPV6
4979 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef IPPROTO_ROUTING
4982 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef IPPROTO_FRAGMENT
4985 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef IPPROTO_RSVP
4988 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef IPPROTO_GRE
4991 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef IPPROTO_ESP
4994 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004996#ifdef IPPROTO_AH
4997 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004998#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004999#ifdef IPPROTO_MOBILE
5000 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005001#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005002#ifdef IPPROTO_ICMPV6
5003 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005004#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005005#ifdef IPPROTO_NONE
5006 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef IPPROTO_DSTOPTS
5009 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005010#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011#ifdef IPPROTO_XTP
5012 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005013#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005014#ifdef IPPROTO_EON
5015 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005016#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005017#ifdef IPPROTO_PIM
5018 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005019#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005020#ifdef IPPROTO_IPCOMP
5021 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005022#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005023#ifdef IPPROTO_VRRP
5024 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005025#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026#ifdef IPPROTO_BIP
5027 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005028#endif
5029/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005030#ifdef IPPROTO_RAW
5031 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005032#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005034#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035#ifdef IPPROTO_MAX
5036 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005037#endif
5038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005039 /* Some port configuration */
5040#ifdef IPPORT_RESERVED
5041 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005042#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005043 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005044#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005045#ifdef IPPORT_USERRESERVED
5046 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005047#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005049#endif
5050
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005051 /* Some reserved IP v.4 addresses */
5052#ifdef INADDR_ANY
5053 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005054#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005055 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005056#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005057#ifdef INADDR_BROADCAST
5058 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005059#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005060 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062#ifdef INADDR_LOOPBACK
5063 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005064#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005066#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005067#ifdef INADDR_UNSPEC_GROUP
5068 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005069#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005070 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005071#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005072#ifdef INADDR_ALLHOSTS_GROUP
5073 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5074 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005075#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005076 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005077#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078#ifdef INADDR_MAX_LOCAL_GROUP
5079 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5080 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005081#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005082 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef INADDR_NONE
5085 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005086#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005088#endif
5089
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090 /* IPv4 [gs]etsockopt options */
5091#ifdef IP_OPTIONS
5092 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005093#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005094#ifdef IP_HDRINCL
5095 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005096#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005097#ifdef IP_TOS
5098 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005099#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005100#ifdef IP_TTL
5101 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005102#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005103#ifdef IP_RECVOPTS
5104 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005105#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005106#ifdef IP_RECVRETOPTS
5107 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005108#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005109#ifdef IP_RECVDSTADDR
5110 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005111#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005112#ifdef IP_RETOPTS
5113 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005114#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005115#ifdef IP_MULTICAST_IF
5116 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005117#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005118#ifdef IP_MULTICAST_TTL
5119 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005120#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121#ifdef IP_MULTICAST_LOOP
5122 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005123#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005124#ifdef IP_ADD_MEMBERSHIP
5125 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005126#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005127#ifdef IP_DROP_MEMBERSHIP
5128 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005129#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130#ifdef IP_DEFAULT_MULTICAST_TTL
5131 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5132 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005133#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005134#ifdef IP_DEFAULT_MULTICAST_LOOP
5135 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5136 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005137#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005138#ifdef IP_MAX_MEMBERSHIPS
5139 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005140#endif
5141
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005142 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5143#ifdef IPV6_JOIN_GROUP
5144 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005145#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005146#ifdef IPV6_LEAVE_GROUP
5147 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005148#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005149#ifdef IPV6_MULTICAST_HOPS
5150 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005151#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005152#ifdef IPV6_MULTICAST_IF
5153 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005154#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005155#ifdef IPV6_MULTICAST_LOOP
5156 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005157#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005158#ifdef IPV6_UNICAST_HOPS
5159 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005160#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005162#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005164#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005165 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005166#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005167 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005168#endif
5169#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005170 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005171#endif
5172#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005174#endif
5175#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005176 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005177#endif
5178#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005179 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005180#endif
5181#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005182 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005183#endif
5184#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005186#endif
5187#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005189#endif
5190#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005192#endif
5193#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005195#endif
5196#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005197 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005198#endif
5199#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005201#endif
5202#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005204#endif
5205#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005207#endif
5208#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005210#endif
5211#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005213#endif
5214#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005216#endif
5217#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005219#endif
5220#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005222#endif
5223#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005225#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005226
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227 /* TCP options */
5228#ifdef TCP_NODELAY
5229 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005230#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005231#ifdef TCP_MAXSEG
5232 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005233#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005234#ifdef TCP_CORK
5235 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005236#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005237#ifdef TCP_KEEPIDLE
5238 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005239#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005240#ifdef TCP_KEEPINTVL
5241 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef TCP_KEEPCNT
5244 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005245#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005246#ifdef TCP_SYNCNT
5247 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005248#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249#ifdef TCP_LINGER2
5250 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005251#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005252#ifdef TCP_DEFER_ACCEPT
5253 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005254#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005255#ifdef TCP_WINDOW_CLAMP
5256 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005257#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005258#ifdef TCP_INFO
5259 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005260#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005261#ifdef TCP_QUICKACK
5262 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005263#endif
5264
Guido van Rossum09be4091999-08-09 14:40:40 +00005265
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005266 /* IPX options */
5267#ifdef IPX_TYPE
5268 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005269#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005270
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005271 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005272#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005274#endif
5275#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005277#endif
5278#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005280#endif
5281#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005283#endif
5284#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005286#endif
5287#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005289#endif
5290#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005292#endif
5293#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005295#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005296#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005299#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005301#endif
5302#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005304#endif
5305#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005307#endif
5308#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005310#endif
5311#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005313#endif
5314#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005316#endif
5317#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005319#endif
5320#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005322#endif
5323#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005325#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005326#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005328#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005329#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005331#endif
5332#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005334#endif
5335#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005337#endif
5338#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005340#endif
5341#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005342 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005343#endif
5344#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005345 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005346#endif
5347#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005348 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349#endif
5350#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005351 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352#endif
5353#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005354 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005355#endif
5356#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005357 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358#endif
5359#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005360 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005361#endif
5362#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005363 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005364#endif
5365#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005366 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005367#endif
5368
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005369 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005370#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005371 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005372#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005374#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005375 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005376#endif
5377#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005378 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005379#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005380 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005381#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005382 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005383#endif
5384#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005385 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005386#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005387 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005388#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005389 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005390#endif
5391
Christian Heimes04ae9162008-01-04 15:23:30 +00005392#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005393 {
5394 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5395 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5396 int i;
5397 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5398 PyObject *tmp;
5399 tmp = PyLong_FromUnsignedLong(codes[i]);
5400 if (tmp == NULL)
5401 return;
5402 PyModule_AddObject(m, names[i], tmp);
5403 }
5404 }
5405 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5406 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5407 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005408#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005410#endif
5411#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005412 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005413#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005414#endif /* _MSTCPIP_ */
5415
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005416 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005417#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005418 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005419#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005420}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005421
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005422
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005423#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005424#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005425
5426/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005427/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005428
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005429int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005430inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005431{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005432 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005433#if (SIZEOF_INT != 4)
5434#error "Not sure if in_addr_t exists and int is not 32-bits."
5435#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005436 unsigned int packed_addr;
5437 packed_addr = inet_addr(src);
5438 if (packed_addr == INADDR_NONE)
5439 return 0;
5440 memcpy(dst, &packed_addr, 4);
5441 return 1;
5442 }
5443 /* Should set errno to EAFNOSUPPORT */
5444 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005445}
5446
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005447const char *
5448inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005449{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005450 if (af == AF_INET) {
5451 struct in_addr packed_addr;
5452 if (size < 16)
5453 /* Should set errno to ENOSPC. */
5454 return NULL;
5455 memcpy(&packed_addr, src, sizeof(packed_addr));
5456 return strncpy(dst, inet_ntoa(packed_addr), size);
5457 }
5458 /* Should set errno to EAFNOSUPPORT */
5459 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005460}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005461
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005462#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005463#endif