blob: 279a09079a89198e81568620fa3e2c71f0bd814c [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;
1031 ret = Py_BuildValue("Oiii",
1032 addrobj,
1033 ntohs(a->sin6_port),
1034 a->sin6_flowinfo,
1035 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;
1285 int port, flowinfo, scope_id, result;
1286 flowinfo = scope_id = 0;
1287 if (!PyTuple_Check(args)) {
1288 PyErr_Format(
1289 PyExc_TypeError,
1290 "getsockaddrarg: "
1291 "AF_INET6 address must be tuple, not %.500s",
1292 Py_TYPE(args)->tp_name);
1293 return 0;
1294 }
1295 if (!PyArg_ParseTuple(args, "eti|ii",
1296 "idna", &host, &port, &flowinfo,
1297 &scope_id)) {
1298 return 0;
1299 }
1300 addr = (struct sockaddr_in6*)addr_ret;
1301 result = setipaddr(host, (struct sockaddr *)addr,
1302 sizeof(*addr), AF_INET6);
1303 PyMem_Free(host);
1304 if (result < 0)
1305 return 0;
1306 if (port < 0 || port > 0xffff) {
1307 PyErr_SetString(
1308 PyExc_OverflowError,
1309 "getsockaddrarg: port must be 0-65535.");
1310 return 0;
1311 }
1312 addr->sin6_family = s->sock_family;
1313 addr->sin6_port = htons((short)port);
1314 addr->sin6_flowinfo = flowinfo;
1315 addr->sin6_scope_id = scope_id;
1316 *len_ret = sizeof *addr;
1317 return 1;
1318 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001319#endif
1320
Hye-Shik Chang81268602004-02-02 06:05:24 +00001321#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001322 case AF_BLUETOOTH:
1323 {
1324 switch (s->sock_proto) {
1325 case BTPROTO_L2CAP:
1326 {
1327 struct sockaddr_l2 *addr;
1328 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001329
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001330 addr = (struct sockaddr_l2 *)addr_ret;
1331 memset(addr, 0, sizeof(struct sockaddr_l2));
1332 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1333 if (!PyArg_ParseTuple(args, "si", &straddr,
1334 &_BT_L2_MEMB(addr, psm))) {
1335 PyErr_SetString(socket_error, "getsockaddrarg: "
1336 "wrong format");
1337 return 0;
1338 }
1339 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1340 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001341
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001342 *len_ret = sizeof *addr;
1343 return 1;
1344 }
1345 case BTPROTO_RFCOMM:
1346 {
1347 struct sockaddr_rc *addr;
1348 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001349
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001350 addr = (struct sockaddr_rc *)addr_ret;
1351 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1352 if (!PyArg_ParseTuple(args, "si", &straddr,
1353 &_BT_RC_MEMB(addr, channel))) {
1354 PyErr_SetString(socket_error, "getsockaddrarg: "
1355 "wrong format");
1356 return 0;
1357 }
1358 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1359 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001361 *len_ret = sizeof *addr;
1362 return 1;
1363 }
1364 case BTPROTO_HCI:
1365 {
1366 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001367#if defined(__NetBSD__) || defined(__DragonFly__)
1368 char *straddr = PyBytes_AS_STRING(args);
1369
1370 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1371 if (straddr == NULL) {
1372 PyErr_SetString(socket_error, "getsockaddrarg: "
1373 "wrong format");
1374 return 0;
1375 }
1376 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1377 return 0;
1378#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001379 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1380 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1381 PyErr_SetString(socket_error, "getsockaddrarg: "
1382 "wrong format");
1383 return 0;
1384 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001385#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001386 *len_ret = sizeof *addr;
1387 return 1;
1388 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001389#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001390 case BTPROTO_SCO:
1391 {
1392 struct sockaddr_sco *addr;
1393 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001395 addr = (struct sockaddr_sco *)addr_ret;
1396 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1397 straddr = PyString_AsString(args);
1398 if (straddr == NULL) {
1399 PyErr_SetString(socket_error, "getsockaddrarg: "
1400 "wrong format");
1401 return 0;
1402 }
1403 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1404 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001405
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001406 *len_ret = sizeof *addr;
1407 return 1;
1408 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001409#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001410 default:
1411 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1412 return 0;
1413 }
1414 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001415#endif
1416
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001417#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001418 case AF_PACKET:
1419 {
1420 struct sockaddr_ll* addr;
1421 struct ifreq ifr;
1422 char *interfaceName;
1423 int protoNumber;
1424 int hatype = 0;
1425 int pkttype = 0;
1426 char *haddr = NULL;
1427 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001428
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001429 if (!PyTuple_Check(args)) {
1430 PyErr_Format(
1431 PyExc_TypeError,
1432 "getsockaddrarg: "
1433 "AF_PACKET address must be tuple, not %.500s",
1434 Py_TYPE(args)->tp_name);
1435 return 0;
1436 }
1437 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1438 &protoNumber, &pkttype, &hatype,
1439 &haddr, &halen))
1440 return 0;
1441 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1442 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1443 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1444 s->errorhandler();
1445 return 0;
1446 }
1447 if (halen > 8) {
1448 PyErr_SetString(PyExc_ValueError,
1449 "Hardware address must be 8 bytes or less");
1450 return 0;
1451 }
1452 if (protoNumber < 0 || protoNumber > 0xffff) {
1453 PyErr_SetString(
1454 PyExc_OverflowError,
1455 "getsockaddrarg: protoNumber must be 0-65535.");
1456 return 0;
1457 }
1458 addr = (struct sockaddr_ll*)addr_ret;
1459 addr->sll_family = AF_PACKET;
1460 addr->sll_protocol = htons((short)protoNumber);
1461 addr->sll_ifindex = ifr.ifr_ifindex;
1462 addr->sll_pkttype = pkttype;
1463 addr->sll_hatype = hatype;
1464 if (halen != 0) {
1465 memcpy(&addr->sll_addr, haddr, halen);
1466 }
1467 addr->sll_halen = halen;
1468 *len_ret = sizeof *addr;
1469 return 1;
1470 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001471#endif
1472
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001473#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001474 case AF_TIPC:
1475 {
1476 unsigned int atype, v1, v2, v3;
1477 unsigned int scope = TIPC_CLUSTER_SCOPE;
1478 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001479
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001480 if (!PyTuple_Check(args)) {
1481 PyErr_Format(
1482 PyExc_TypeError,
1483 "getsockaddrarg: "
1484 "AF_TIPC address must be tuple, not %.500s",
1485 Py_TYPE(args)->tp_name);
1486 return 0;
1487 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001488
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001489 if (!PyArg_ParseTuple(args,
1490 "IIII|I;Invalid TIPC address format",
1491 &atype, &v1, &v2, &v3, &scope))
1492 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001493
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001494 addr = (struct sockaddr_tipc *) addr_ret;
1495 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001496
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001497 addr->family = AF_TIPC;
1498 addr->scope = scope;
1499 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001500
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001501 if (atype == TIPC_ADDR_NAMESEQ) {
1502 addr->addr.nameseq.type = v1;
1503 addr->addr.nameseq.lower = v2;
1504 addr->addr.nameseq.upper = v3;
1505 } else if (atype == TIPC_ADDR_NAME) {
1506 addr->addr.name.name.type = v1;
1507 addr->addr.name.name.instance = v2;
1508 } else if (atype == TIPC_ADDR_ID) {
1509 addr->addr.id.node = v1;
1510 addr->addr.id.ref = v2;
1511 } else {
1512 /* Shouldn't happen */
1513 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1514 return 0;
1515 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001516
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001517 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001519 return 1;
1520 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001521#endif
1522
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001523 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001524
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001525 default:
1526 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1527 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001528
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001529 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001530}
1531
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532
Guido van Rossum48a680c2001-03-02 06:34:14 +00001533/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001534 Return 1 if the family is known, 0 otherwise. The length is returned
1535 through len_ret. */
1536
1537static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001538getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001540 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001541
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001542#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001543 case AF_UNIX:
1544 {
1545 *len_ret = sizeof (struct sockaddr_un);
1546 return 1;
1547 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001548#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001549#if defined(AF_NETLINK)
1550 case AF_NETLINK:
1551 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001552 *len_ret = sizeof (struct sockaddr_nl);
1553 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001554 }
1555#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001556
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001557 case AF_INET:
1558 {
1559 *len_ret = sizeof (struct sockaddr_in);
1560 return 1;
1561 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001562
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001563#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001564 case AF_INET6:
1565 {
1566 *len_ret = sizeof (struct sockaddr_in6);
1567 return 1;
1568 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001569#endif
1570
Hye-Shik Chang81268602004-02-02 06:05:24 +00001571#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001572 case AF_BLUETOOTH:
1573 {
1574 switch(s->sock_proto)
1575 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001576
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001577 case BTPROTO_L2CAP:
1578 *len_ret = sizeof (struct sockaddr_l2);
1579 return 1;
1580 case BTPROTO_RFCOMM:
1581 *len_ret = sizeof (struct sockaddr_rc);
1582 return 1;
1583 case BTPROTO_HCI:
1584 *len_ret = sizeof (struct sockaddr_hci);
1585 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001586#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001587 case BTPROTO_SCO:
1588 *len_ret = sizeof (struct sockaddr_sco);
1589 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001590#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001591 default:
1592 PyErr_SetString(socket_error, "getsockaddrlen: "
1593 "unknown BT protocol");
1594 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001595
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001596 }
1597 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001598#endif
1599
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001600#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001601 case AF_PACKET:
1602 {
1603 *len_ret = sizeof (struct sockaddr_ll);
1604 return 1;
1605 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001606#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001607
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001608#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001609 case AF_TIPC:
1610 {
1611 *len_ret = sizeof (struct sockaddr_tipc);
1612 return 1;
1613 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001614#endif
1615
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001616 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001617
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001618 default:
1619 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1620 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001622 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001623}
1624
1625
Guido van Rossum30a685f1991-06-27 15:51:29 +00001626/* s.accept() method */
1627
Guido van Rossum73624e91994-10-10 17:59:00 +00001628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001629sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001630{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001631 sock_addr_t addrbuf;
1632 SOCKET_T newfd;
1633 socklen_t addrlen;
1634 PyObject *sock = NULL;
1635 PyObject *addr = NULL;
1636 PyObject *res = NULL;
1637 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001638
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001639 if (!getsockaddrlen(s, &addrlen))
1640 return NULL;
1641 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001642
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001643#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001644 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001645#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 newfd = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001647#endif
1648
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001649 if (!IS_SELECTABLE(s))
1650 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001651
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001652 Py_BEGIN_ALLOW_THREADS
1653 timeout = internal_select(s, 0);
1654 if (!timeout)
1655 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1656 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001657
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001658 if (timeout == 1) {
1659 PyErr_SetString(socket_timeout, "timed out");
1660 return NULL;
1661 }
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001662
Fred Drakea04eaad2000-06-30 02:46:07 +00001663#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001664 if (newfd == INVALID_SOCKET)
Fred Drakea04eaad2000-06-30 02:46:07 +00001665#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001666 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001667#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001668 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001669
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 /* Create the new object with unspecified family,
1671 to avoid calls to bind() etc. on it. */
1672 sock = (PyObject *) new_sockobject(newfd,
1673 s->sock_family,
1674 s->sock_type,
1675 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001676
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001677 if (sock == NULL) {
1678 SOCKETCLOSE(newfd);
1679 goto finally;
1680 }
1681 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1682 addrlen, s->sock_proto);
1683 if (addr == NULL)
1684 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001685
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001686 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001687
Guido van Rossum67f7a382002-06-06 21:08:16 +00001688finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001689 Py_XDECREF(sock);
1690 Py_XDECREF(addr);
1691 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001692}
1693
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001694PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001695"accept() -> (socket object, address info)\n\
1696\n\
1697Wait for an incoming connection. Return a new socket representing the\n\
1698connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001699info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001700
Guido van Rossum11ba0942002-06-13 15:07:44 +00001701/* s.setblocking(flag) method. Argument:
1702 False -- non-blocking mode; same as settimeout(0)
1703 True -- blocking mode; same as settimeout(None)
1704*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001705
Guido van Rossum73624e91994-10-10 17:59:00 +00001706static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001707sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001708{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001709 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001710
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001711 block = PyInt_AsLong(arg);
1712 if (block == -1 && PyErr_Occurred())
1713 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001715 s->sock_timeout = block ? -1.0 : 0.0;
1716 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001717
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001718 Py_INCREF(Py_None);
1719 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001720}
Guido van Rossume4485b01994-09-07 14:32:49 +00001721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001722PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001723"setblocking(flag)\n\
1724\n\
1725Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001726setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001727setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001728
Guido van Rossum11ba0942002-06-13 15:07:44 +00001729/* s.settimeout(timeout) method. Argument:
1730 None -- no timeout, blocking mode; same as setblocking(True)
1731 0.0 -- non-blocking mode; same as setblocking(False)
1732 > 0 -- timeout mode; operations time out after timeout seconds
1733 < 0 -- illegal; raises an exception
1734*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001735static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001736sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001737{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001738 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001739
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 if (arg == Py_None)
1741 timeout = -1.0;
1742 else {
1743 timeout = PyFloat_AsDouble(arg);
1744 if (timeout < 0.0) {
1745 if (!PyErr_Occurred())
1746 PyErr_SetString(PyExc_ValueError,
1747 "Timeout value out of range");
1748 return NULL;
1749 }
1750 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001751
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001752 s->sock_timeout = timeout;
1753 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001755 Py_INCREF(Py_None);
1756 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001757}
1758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001759PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001760"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001762Set a timeout on socket operations. 'timeout' can be a float,\n\
1763giving in seconds, or None. Setting a timeout of None disables\n\
1764the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001765Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001766
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001767/* s.gettimeout() method.
1768 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001770sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001771{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001772 if (s->sock_timeout < 0.0) {
1773 Py_INCREF(Py_None);
1774 return Py_None;
1775 }
1776 else
1777 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001778}
1779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001780PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001781"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001782\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001783Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001784operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001785operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001786
Guido van Rossum48a680c2001-03-02 06:34:14 +00001787#ifdef RISCOS
1788/* s.sleeptaskw(1 | 0) method */
1789
1790static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001791sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001792{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001793 int block;
1794 block = PyInt_AsLong(arg);
1795 if (block == -1 && PyErr_Occurred())
1796 return NULL;
1797 Py_BEGIN_ALLOW_THREADS
1798 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1799 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001800
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001801 Py_INCREF(Py_None);
1802 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001803}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001804PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001805"sleeptaskw(flag)\n\
1806\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001807Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001808#endif
1809
1810
Guido van Rossumaee08791992-09-08 09:05:33 +00001811/* s.setsockopt() method.
1812 With an integer third argument, sets an integer option.
1813 With a string third argument, sets an option from a buffer;
1814 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001815
Guido van Rossum73624e91994-10-10 17:59:00 +00001816static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001817sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001818{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001819 int level;
1820 int optname;
1821 int res;
1822 char *buf;
1823 int buflen;
1824 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001825
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001826 if (PyArg_ParseTuple(args, "iii:setsockopt",
1827 &level, &optname, &flag)) {
1828 buf = (char *) &flag;
1829 buflen = sizeof flag;
1830 }
1831 else {
1832 PyErr_Clear();
1833 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1834 &level, &optname, &buf, &buflen))
1835 return NULL;
1836 }
1837 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1838 if (res < 0)
1839 return s->errorhandler();
1840 Py_INCREF(Py_None);
1841 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001842}
1843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001844PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001845"setsockopt(level, option, value)\n\
1846\n\
1847Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001848The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001849
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001850
Guido van Rossumaee08791992-09-08 09:05:33 +00001851/* s.getsockopt() method.
1852 With two arguments, retrieves an integer option.
1853 With a third integer argument, retrieves a string buffer of that size;
1854 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001855
Guido van Rossum73624e91994-10-10 17:59:00 +00001856static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001857sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001858{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001859 int level;
1860 int optname;
1861 int res;
1862 PyObject *buf;
1863 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001864
Guido van Rossumbcc20741998-08-04 22:53:56 +00001865#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001866 /* We have incomplete socket support. */
1867 PyErr_SetString(socket_error, "getsockopt not supported");
1868 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001869#else
1870
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001871 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1872 &level, &optname, &buflen))
1873 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001874
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001875 if (buflen == 0) {
1876 int flag = 0;
1877 socklen_t flagsize = sizeof flag;
1878 res = getsockopt(s->sock_fd, level, optname,
1879 (void *)&flag, &flagsize);
1880 if (res < 0)
1881 return s->errorhandler();
1882 return PyInt_FromLong(flag);
1883 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001884#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001885 /* socklen_t is unsigned so no negative test is needed,
1886 test buflen == 0 is previously done */
1887 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001888#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001889 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001890#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001891 PyErr_SetString(socket_error,
1892 "getsockopt buflen out of range");
1893 return NULL;
1894 }
1895 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1896 if (buf == NULL)
1897 return NULL;
1898 res = getsockopt(s->sock_fd, level, optname,
1899 (void *)PyString_AS_STRING(buf), &buflen);
1900 if (res < 0) {
1901 Py_DECREF(buf);
1902 return s->errorhandler();
1903 }
1904 _PyString_Resize(&buf, buflen);
1905 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001906#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001907}
1908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001909PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001910"getsockopt(level, option[, buffersize]) -> value\n\
1911\n\
1912Get a socket option. See the Unix manual for level and option.\n\
1913If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001914string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001915
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001916
Fred Drake728819a2000-07-01 03:40:12 +00001917/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001918
Guido van Rossum73624e91994-10-10 17:59:00 +00001919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001920sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001921{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001922 sock_addr_t addrbuf;
1923 int addrlen;
1924 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001925
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001926 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1927 return NULL;
1928 Py_BEGIN_ALLOW_THREADS
1929 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1930 Py_END_ALLOW_THREADS
1931 if (res < 0)
1932 return s->errorhandler();
1933 Py_INCREF(Py_None);
1934 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001935}
1936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001937PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001938"bind(address)\n\
1939\n\
1940Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001941pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001942sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001943
Guido van Rossum30a685f1991-06-27 15:51:29 +00001944
1945/* s.close() method.
1946 Set the file descriptor to -1 so operations tried subsequently
1947 will surely fail. */
1948
Guido van Rossum73624e91994-10-10 17:59:00 +00001949static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001950sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001951{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001952 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001953
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001954 if ((fd = s->sock_fd) != -1) {
1955 s->sock_fd = -1;
1956 Py_BEGIN_ALLOW_THREADS
1957 (void) SOCKETCLOSE(fd);
1958 Py_END_ALLOW_THREADS
1959 }
1960 Py_INCREF(Py_None);
1961 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001962}
1963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001965"close()\n\
1966\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001967Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001968
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001969static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001970internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001971 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001972{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001974
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001975 timeout = 0;
1976 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001977
1978#ifdef MS_WINDOWS
1979
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001980 if (s->sock_timeout > 0.0) {
1981 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1982 IS_SELECTABLE(s)) {
1983 /* This is a mess. Best solution: trust select */
1984 fd_set fds;
1985 fd_set fds_exc;
1986 struct timeval tv;
1987 tv.tv_sec = (int)s->sock_timeout;
1988 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1989 FD_ZERO(&fds);
1990 FD_SET(s->sock_fd, &fds);
1991 FD_ZERO(&fds_exc);
1992 FD_SET(s->sock_fd, &fds_exc);
1993 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
1994 if (res == 0) {
1995 res = WSAEWOULDBLOCK;
1996 timeout = 1;
1997 } else if (res > 0) {
1998 if (FD_ISSET(s->sock_fd, &fds))
1999 /* The socket is in the writeable set - this
2000 means connected */
2001 res = 0;
2002 else {
2003 /* As per MS docs, we need to call getsockopt()
2004 to get the underlying error */
2005 int res_size = sizeof res;
2006 /* It must be in the exception set */
2007 assert(FD_ISSET(s->sock_fd, &fds_exc));
2008 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2009 (char *)&res, &res_size))
2010 /* getsockopt also clears WSAGetLastError,
2011 so reset it back. */
2012 WSASetLastError(res);
2013 else
2014 res = WSAGetLastError();
2015 }
2016 }
2017 /* else if (res < 0) an error occurred */
2018 }
2019 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002020
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002021 if (res < 0)
2022 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002023
2024#else
2025
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002026 if (s->sock_timeout > 0.0) {
2027 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2028 timeout = internal_select(s, 1);
2029 if (timeout == 0) {
2030 /* Bug #1019808: in case of an EINPROGRESS,
2031 use getsockopt(SO_ERROR) to get the real
2032 error. */
2033 socklen_t res_size = sizeof res;
2034 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2035 SO_ERROR, &res, &res_size);
2036 if (res == EISCONN)
2037 res = 0;
2038 errno = res;
2039 }
2040 else if (timeout == -1) {
2041 res = errno; /* had error */
2042 }
2043 else
2044 res = EWOULDBLOCK; /* timed out */
2045 }
2046 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002047
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002048 if (res < 0)
2049 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002050
2051#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002052 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002053
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002054 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002055}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056
Fred Drake728819a2000-07-01 03:40:12 +00002057/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058
Guido van Rossum73624e91994-10-10 17:59:00 +00002059static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002060sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002061{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002062 sock_addr_t addrbuf;
2063 int addrlen;
2064 int res;
2065 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002066
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002067 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2068 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002069
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002070 Py_BEGIN_ALLOW_THREADS
2071 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2072 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002074 if (timeout == 1) {
2075 PyErr_SetString(socket_timeout, "timed out");
2076 return NULL;
2077 }
2078 if (res != 0)
2079 return s->errorhandler();
2080 Py_INCREF(Py_None);
2081 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002082}
2083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002084PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002085"connect(address)\n\
2086\n\
2087Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002088is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002089
Guido van Rossum30a685f1991-06-27 15:51:29 +00002090
Fred Drake728819a2000-07-01 03:40:12 +00002091/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002092
2093static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002094sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002095{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002096 sock_addr_t addrbuf;
2097 int addrlen;
2098 int res;
2099 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002100
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002101 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2102 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002104 Py_BEGIN_ALLOW_THREADS
2105 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2106 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002108 /* Signals are not errors (though they may raise exceptions). Adapted
2109 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002110#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002111 if (res == EINTR && PyErr_CheckSignals())
2112 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002113#endif
2114
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002116}
2117
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002118PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002119"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002120\n\
2121This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002123
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002124
Guido van Rossumed233a51992-06-23 09:07:03 +00002125/* s.fileno() method */
2126
Guido van Rossum73624e91994-10-10 17:59:00 +00002127static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002128sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002129{
Fred Drakea04eaad2000-06-30 02:46:07 +00002130#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002131 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002132#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002133 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002134#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002135}
2136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002137PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002138"fileno() -> integer\n\
2139\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002140Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002141
Guido van Rossumed233a51992-06-23 09:07:03 +00002142
Guido van Rossumbe32c891996-06-20 16:25:29 +00002143#ifndef NO_DUP
2144/* s.dup() method */
2145
2146static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002147sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002148{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002149 SOCKET_T newfd;
2150 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002152 newfd = dup(s->sock_fd);
2153 if (newfd < 0)
2154 return s->errorhandler();
2155 sock = (PyObject *) new_sockobject(newfd,
2156 s->sock_family,
2157 s->sock_type,
2158 s->sock_proto);
2159 if (sock == NULL)
2160 SOCKETCLOSE(newfd);
2161 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002162}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002164PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002165"dup() -> socket object\n\
2166\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002167Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002168
Guido van Rossumbe32c891996-06-20 16:25:29 +00002169#endif
2170
2171
Guido van Rossumc89705d1992-11-26 08:54:07 +00002172/* s.getsockname() method */
2173
Guido van Rossum73624e91994-10-10 17:59:00 +00002174static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002175sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002176{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002177 sock_addr_t addrbuf;
2178 int res;
2179 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002180
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002181 if (!getsockaddrlen(s, &addrlen))
2182 return NULL;
2183 memset(&addrbuf, 0, addrlen);
2184 Py_BEGIN_ALLOW_THREADS
2185 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2186 Py_END_ALLOW_THREADS
2187 if (res < 0)
2188 return s->errorhandler();
2189 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2190 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002191}
2192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002193PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002194"getsockname() -> address info\n\
2195\n\
2196Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002197info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002198
Guido van Rossumc89705d1992-11-26 08:54:07 +00002199
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002200#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002201/* s.getpeername() method */
2202
Guido van Rossum73624e91994-10-10 17:59:00 +00002203static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002204sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002205{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002206 sock_addr_t addrbuf;
2207 int res;
2208 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002209
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002210 if (!getsockaddrlen(s, &addrlen))
2211 return NULL;
2212 memset(&addrbuf, 0, addrlen);
2213 Py_BEGIN_ALLOW_THREADS
2214 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2215 Py_END_ALLOW_THREADS
2216 if (res < 0)
2217 return s->errorhandler();
2218 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2219 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002220}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002222PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002223"getpeername() -> address info\n\
2224\n\
2225Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002226info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227
Guido van Rossumb6775db1994-08-01 11:34:53 +00002228#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002229
2230
Guido van Rossum30a685f1991-06-27 15:51:29 +00002231/* s.listen(n) method */
2232
Guido van Rossum73624e91994-10-10 17:59:00 +00002233static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002234sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002235{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002236 int backlog;
2237 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002238
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002239 backlog = PyInt_AsLong(arg);
2240 if (backlog == -1 && PyErr_Occurred())
2241 return NULL;
2242 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002243 /* To avoid problems on systems that don't allow a negative backlog
2244 * (which doesn't make sense anyway) we force a minimum value of 0. */
2245 if (backlog < 0)
2246 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002247 res = listen(s->sock_fd, backlog);
2248 Py_END_ALLOW_THREADS
2249 if (res < 0)
2250 return s->errorhandler();
2251 Py_INCREF(Py_None);
2252 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002253}
2254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002255PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002256"listen(backlog)\n\
2257\n\
2258Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002259least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2260unaccepted connections that the system will allow before refusing new\n\
2261connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002262
2263
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002264#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002265/* s.makefile(mode) method.
2266 Create a new open file object referring to a dupped version of
2267 the socket's file descriptor. (The dup() call is necessary so
2268 that the open file and socket objects may be closed independent
2269 of each other.)
2270 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2271
Guido van Rossum73624e91994-10-10 17:59:00 +00002272static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002273sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002274{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002275 extern int fclose(FILE *);
2276 char *mode = "r";
2277 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002278#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002279 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002280#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002281 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002282#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002283 FILE *fp;
2284 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002285#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002286 char *mode_r = "r";
2287 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002288#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002289
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002290 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2291 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002292#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002293 if (strcmp(mode,"rb") == 0) {
2294 mode = mode_r;
2295 }
2296 else {
2297 if (strcmp(mode,"wb") == 0) {
2298 mode = mode_w;
2299 }
2300 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002301#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002302#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002303 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2304 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002305#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002306 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002307#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002308 {
2309 if (fd >= 0)
2310 SOCKETCLOSE(fd);
2311 return s->errorhandler();
2312 }
2313 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2314 if (f != NULL)
2315 PyFile_SetBufSize(f, bufsize);
2316 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002317}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002319PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002320"makefile([mode[, buffersize]]) -> file object\n\
2321\n\
2322Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002323The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002324
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002325#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002326
Martin Blais2856e5f2006-05-26 12:03:27 +00002327/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002328 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002329 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002330 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002331 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002332 * also possible that we return a number of bytes smaller than the request
2333 * bytes.
2334 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002335static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002336sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2337{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002338 ssize_t outlen = -1;
2339 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002340#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002341 int remaining;
2342 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002343#endif
2344
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002345 if (!IS_SELECTABLE(s)) {
2346 select_error();
2347 return -1;
2348 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002349
2350#ifndef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002351 Py_BEGIN_ALLOW_THREADS
2352 timeout = internal_select(s, 0);
2353 if (!timeout)
2354 outlen = recv(s->sock_fd, cbuf, len, flags);
2355 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002357 if (timeout == 1) {
2358 PyErr_SetString(socket_timeout, "timed out");
2359 return -1;
2360 }
2361 if (outlen < 0) {
2362 /* Note: the call to errorhandler() ALWAYS indirectly returned
2363 NULL, so ignore its return value */
2364 s->errorhandler();
2365 return -1;
2366 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002367#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002368 read_buf = cbuf;
2369 remaining = len;
2370 while (remaining != 0) {
2371 unsigned int segment;
2372 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002373
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002374 segment = remaining /SEGMENT_SIZE;
2375 if (segment != 0) {
2376 segment = SEGMENT_SIZE;
2377 }
2378 else {
2379 segment = remaining;
2380 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002381
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002382 Py_BEGIN_ALLOW_THREADS
2383 timeout = internal_select(s, 0);
2384 if (!timeout)
2385 nread = recv(s->sock_fd, read_buf, segment, flags);
2386 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002387
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002388 if (timeout == 1) {
2389 PyErr_SetString(socket_timeout, "timed out");
2390 return -1;
2391 }
2392 if (nread < 0) {
2393 s->errorhandler();
2394 return -1;
2395 }
2396 if (nread != remaining) {
2397 read_buf += nread;
2398 break;
2399 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002400
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002401 remaining -= segment;
2402 read_buf += segment;
2403 }
2404 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002405#endif /* !__VMS */
2406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002407 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002408}
2409
Guido van Rossum48a680c2001-03-02 06:34:14 +00002410
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002411/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002412
Guido van Rossum73624e91994-10-10 17:59:00 +00002413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002415{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002416 int recvlen, flags = 0;
2417 ssize_t outlen;
2418 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002419
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002420 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2421 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002422
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002423 if (recvlen < 0) {
2424 PyErr_SetString(PyExc_ValueError,
2425 "negative buffersize in recv");
2426 return NULL;
2427 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002428
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002429 /* Allocate a new string. */
2430 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2431 if (buf == NULL)
2432 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002433
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002434 /* Call the guts */
2435 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2436 if (outlen < 0) {
2437 /* An error occurred, release the string and return an
2438 error. */
2439 Py_DECREF(buf);
2440 return NULL;
2441 }
2442 if (outlen != recvlen) {
2443 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002444 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002445 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002446 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002447 return NULL;
2448 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002449
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002450 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002451}
2452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002453PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002454"recv(buffersize[, flags]) -> data\n\
2455\n\
2456Receive up to buffersize bytes from the socket. For the optional flags\n\
2457argument, see the Unix manual. When no data is available, block until\n\
2458at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002459the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002460
Guido van Rossum30a685f1991-06-27 15:51:29 +00002461
Martin Blaisaf2ae722006-06-04 13:49:49 +00002462/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002463
Martin Blais2856e5f2006-05-26 12:03:27 +00002464static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002465sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002466{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002467 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002469 int recvlen = 0, flags = 0;
2470 ssize_t readlen;
2471 Py_buffer buf;
2472 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002473
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002474 /* Get the buffer's memory */
2475 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2476 &buf, &recvlen, &flags))
2477 return NULL;
2478 buflen = buf.len;
2479 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002480
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002481 if (recvlen < 0) {
2482 PyErr_SetString(PyExc_ValueError,
2483 "negative buffersize in recv_into");
2484 goto error;
2485 }
2486 if (recvlen == 0) {
2487 /* If nbytes was not specified, use the buffer's length */
2488 recvlen = buflen;
2489 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002491 /* Check if the buffer is large enough */
2492 if (buflen < recvlen) {
2493 PyErr_SetString(PyExc_ValueError,
2494 "buffer too small for requested bytes");
2495 goto error;
2496 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002498 /* Call the guts */
2499 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2500 if (readlen < 0) {
2501 /* Return an error. */
2502 goto error;
2503 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002504
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002505 PyBuffer_Release(&buf);
2506 /* Return the number of bytes read. Note that we do not do anything
2507 special here in the case that readlen < recvlen. */
2508 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002509
2510error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002511 PyBuffer_Release(&buf);
2512 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002513}
2514
Martin Blaisaf2ae722006-06-04 13:49:49 +00002515PyDoc_STRVAR(recv_into_doc,
2516"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002517\n\
2518A version of recv() that stores its data into a buffer rather than creating \n\
2519a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2520is not specified (or 0), receive up to the size available in the given buffer.\n\
2521\n\
2522See recv() for documentation about the flags.");
2523
2524
2525/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002526 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2527 * into a char buffer. If you have any inc/def ref to do to the objects that
2528 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002529 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002530 * that it is also possible that we return a number of bytes smaller than the
2531 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002532 *
2533 * 'addr' is a return value for the address object. Note that you must decref
2534 * it yourself.
2535 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002536static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002537sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002538 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002540 sock_addr_t addrbuf;
2541 int timeout;
2542 ssize_t n = -1;
2543 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002544
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002545 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002546
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002547 if (!getsockaddrlen(s, &addrlen))
2548 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002549
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002550 if (!IS_SELECTABLE(s)) {
2551 select_error();
2552 return -1;
2553 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002554
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002555 Py_BEGIN_ALLOW_THREADS
2556 memset(&addrbuf, 0, addrlen);
2557 timeout = internal_select(s, 0);
2558 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002559#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002560#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002561 n = recvfrom(s->sock_fd, cbuf, len, flags,
2562 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002563#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002564 n = recvfrom(s->sock_fd, cbuf, len, flags,
2565 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002566#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002567#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002568 n = recvfrom(s->sock_fd, cbuf, len, flags,
2569 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002570#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002571 }
2572 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002574 if (timeout == 1) {
2575 PyErr_SetString(socket_timeout, "timed out");
2576 return -1;
2577 }
2578 if (n < 0) {
2579 s->errorhandler();
2580 return -1;
2581 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002582
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002583 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2584 addrlen, s->sock_proto)))
2585 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002586
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002587 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002588}
2589
2590/* s.recvfrom(nbytes [,flags]) method */
2591
2592static PyObject *
2593sock_recvfrom(PySocketSockObject *s, PyObject *args)
2594{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002595 PyObject *buf = NULL;
2596 PyObject *addr = NULL;
2597 PyObject *ret = NULL;
2598 int recvlen, flags = 0;
2599 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002600
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002601 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2602 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002603
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002604 if (recvlen < 0) {
2605 PyErr_SetString(PyExc_ValueError,
2606 "negative buffersize in recvfrom");
2607 return NULL;
2608 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002609
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002610 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2611 if (buf == NULL)
2612 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002614 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2615 recvlen, flags, &addr);
2616 if (outlen < 0) {
2617 goto finally;
2618 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002619
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002620 if (outlen != recvlen) {
2621 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002622 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002623 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002624 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002625 goto finally;
2626 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002627
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002628 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002629
2630finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002631 Py_XDECREF(buf);
2632 Py_XDECREF(addr);
2633 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002634}
2635
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002636PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002637"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2638\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002639Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002640
Martin Blais2856e5f2006-05-26 12:03:27 +00002641
Martin Blaisaf2ae722006-06-04 13:49:49 +00002642/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002643
2644static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002645sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002646{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002647 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002648
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002649 int recvlen = 0, flags = 0;
2650 ssize_t readlen;
2651 Py_buffer buf;
2652 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002653
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002654 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002656 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2657 kwlist, &buf,
2658 &recvlen, &flags))
2659 return NULL;
2660 buflen = buf.len;
2661 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002662
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002663 if (recvlen < 0) {
2664 PyErr_SetString(PyExc_ValueError,
2665 "negative buffersize in recvfrom_into");
2666 goto error;
2667 }
2668 if (recvlen == 0) {
2669 /* If nbytes was not specified, use the buffer's length */
2670 recvlen = buflen;
2671 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002672
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002673 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2674 if (readlen < 0) {
2675 /* Return an error */
2676 goto error;
2677 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002678
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002679 PyBuffer_Release(&buf);
2680 /* Return the number of bytes read and the address. Note that we do
2681 not do anything special here in the case that readlen < recvlen. */
2682 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002683
2684error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002685 Py_XDECREF(addr);
2686 PyBuffer_Release(&buf);
2687 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002688}
2689
Martin Blaisaf2ae722006-06-04 13:49:49 +00002690PyDoc_STRVAR(recvfrom_into_doc,
2691"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002692\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002693Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002694
2695
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002696/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002697
Guido van Rossum73624e91994-10-10 17:59:00 +00002698static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002699sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002700{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002701 char *buf;
2702 int len, n = -1, flags = 0, timeout;
2703 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002704
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002705 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2706 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002707
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002708 if (!IS_SELECTABLE(s)) {
2709 PyBuffer_Release(&pbuf);
2710 return select_error();
2711 }
2712 buf = pbuf.buf;
2713 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002715 Py_BEGIN_ALLOW_THREADS
2716 timeout = internal_select(s, 1);
2717 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002718#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002719 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002720#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002721 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002722#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002723 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002724
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002725 PyBuffer_Release(&pbuf);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002726
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002727 if (timeout == 1) {
2728 PyErr_SetString(socket_timeout, "timed out");
2729 return NULL;
2730 }
2731 if (n < 0)
2732 return s->errorhandler();
2733 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002734}
2735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002736PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002737"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002738\n\
2739Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002740argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002742
2743
2744/* s.sendall(data [,flags]) method */
2745
2746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002747sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002748{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002749 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002750 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002751 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002753 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2754 return NULL;
2755 buf = pbuf.buf;
2756 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002757
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002758 if (!IS_SELECTABLE(s)) {
2759 PyBuffer_Release(&pbuf);
2760 return select_error();
2761 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002762
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002763 do {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002764 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002765 timeout = internal_select(s, 1);
2766 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002767 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002768#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002769 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002770#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002771 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002772#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002773 }
2774 Py_END_ALLOW_THREADS
2775 if (timeout == 1) {
2776 PyBuffer_Release(&pbuf);
2777 PyErr_SetString(socket_timeout, "timed out");
2778 return NULL;
2779 }
2780 /* PyErr_CheckSignals() might change errno */
2781 saved_errno = errno;
2782 /* We must run our signal handlers before looping again.
2783 send() can return a successful partial write when it is
2784 interrupted, so we can't restrict ourselves to EINTR. */
2785 if (PyErr_CheckSignals()) {
2786 PyBuffer_Release(&pbuf);
2787 return NULL;
2788 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002789 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002790 /* If interrupted, try again */
2791 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002792 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002793 else
2794 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002795 }
2796 buf += n;
2797 len -= n;
2798 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002800
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002801 if (n < 0)
2802 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002803
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002804 Py_INCREF(Py_None);
2805 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002806}
2807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002808PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002809"sendall(data[, flags])\n\
2810\n\
2811Send a data string to the socket. For the optional flags\n\
2812argument, see the Unix manual. This calls send() repeatedly\n\
2813until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002814to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002815
Guido van Rossum30a685f1991-06-27 15:51:29 +00002816
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002817/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002818
Guido van Rossum73624e91994-10-10 17:59:00 +00002819static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002820sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002821{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002822 Py_buffer pbuf;
2823 PyObject *addro;
2824 char *buf;
2825 Py_ssize_t len;
2826 sock_addr_t addrbuf;
2827 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002828 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002830 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002831 arglen = PyTuple_Size(args);
2832 switch(arglen) {
2833 case 2:
2834 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2835 break;
2836 case 3:
2837 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2838 break;
2839 default:
2840 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2841 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002842 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002843 if (PyErr_Occurred())
2844 return NULL;
2845
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002846 buf = pbuf.buf;
2847 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002849 if (!IS_SELECTABLE(s)) {
2850 PyBuffer_Release(&pbuf);
2851 return select_error();
2852 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002854 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2855 PyBuffer_Release(&pbuf);
2856 return NULL;
2857 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002858
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002859 Py_BEGIN_ALLOW_THREADS
2860 timeout = internal_select(s, 1);
2861 if (!timeout)
2862 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2863 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002864
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002865 PyBuffer_Release(&pbuf);
2866 if (timeout == 1) {
2867 PyErr_SetString(socket_timeout, "timed out");
2868 return NULL;
2869 }
2870 if (n < 0)
2871 return s->errorhandler();
2872 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002873}
2874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002875PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002876"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002877\n\
2878Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002879For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002880
Guido van Rossum30a685f1991-06-27 15:51:29 +00002881
2882/* s.shutdown(how) method */
2883
Guido van Rossum73624e91994-10-10 17:59:00 +00002884static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002885sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002886{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002887 int how;
2888 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002890 how = PyInt_AsLong(arg);
2891 if (how == -1 && PyErr_Occurred())
2892 return NULL;
2893 Py_BEGIN_ALLOW_THREADS
2894 res = shutdown(s->sock_fd, how);
2895 Py_END_ALLOW_THREADS
2896 if (res < 0)
2897 return s->errorhandler();
2898 Py_INCREF(Py_None);
2899 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002900}
2901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002902PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002903"shutdown(flag)\n\
2904\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002905Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2906of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002907
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002908#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002909static PyObject*
2910sock_ioctl(PySocketSockObject *s, PyObject *arg)
2911{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002912 unsigned long cmd = SIO_RCVALL;
2913 PyObject *argO;
2914 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002915
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002916 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2917 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002918
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002919 switch (cmd) {
2920 case SIO_RCVALL: {
2921 unsigned int option = RCVALL_ON;
2922 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2923 return NULL;
2924 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2925 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2926 return set_error();
2927 }
2928 return PyLong_FromUnsignedLong(recv); }
2929 case SIO_KEEPALIVE_VALS: {
2930 struct tcp_keepalive ka;
2931 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2932 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2933 return NULL;
2934 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2935 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2936 return set_error();
2937 }
2938 return PyLong_FromUnsignedLong(recv); }
2939 default:
2940 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2941 return NULL;
2942 }
Christian Heimes04ae9162008-01-04 15:23:30 +00002943}
2944PyDoc_STRVAR(sock_ioctl_doc,
2945"ioctl(cmd, option) -> long\n\
2946\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00002947Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2948SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2949SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00002950
2951#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002952
2953/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002954
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002955static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002956 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2957 accept_doc},
2958 {"bind", (PyCFunction)sock_bind, METH_O,
2959 bind_doc},
2960 {"close", (PyCFunction)sock_close, METH_NOARGS,
2961 close_doc},
2962 {"connect", (PyCFunction)sock_connect, METH_O,
2963 connect_doc},
2964 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2965 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002966#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002967 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2968 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002969#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002970 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2971 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002972#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002973 {"getpeername", (PyCFunction)sock_getpeername,
2974 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002975#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002976 {"getsockname", (PyCFunction)sock_getsockname,
2977 METH_NOARGS, getsockname_doc},
2978 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2979 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002980#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002981 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2982 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00002983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002984 {"listen", (PyCFunction)sock_listen, METH_O,
2985 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002986#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002987 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2988 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002990 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2991 recv_doc},
2992 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2993 recv_into_doc},
2994 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2995 recvfrom_doc},
2996 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2997 recvfrom_into_doc},
2998 {"send", (PyCFunction)sock_send, METH_VARARGS,
2999 send_doc},
3000 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3001 sendall_doc},
3002 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3003 sendto_doc},
3004 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3005 setblocking_doc},
3006 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3007 settimeout_doc},
3008 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3009 gettimeout_doc},
3010 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3011 setsockopt_doc},
3012 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3013 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003014#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003015 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3016 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003017#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003018 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003019};
3020
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003021/* SockObject members */
3022static PyMemberDef sock_memberlist[] = {
3023 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3024 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3025 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3026 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3027 {0},
3028};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003029
Guido van Rossum73624e91994-10-10 17:59:00 +00003030/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003031 First close the file description. */
3032
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003033static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003034sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003035{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003036 if (s->sock_fd != -1)
3037 (void) SOCKETCLOSE(s->sock_fd);
3038 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003039}
3040
Guido van Rossum30a685f1991-06-27 15:51:29 +00003041
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003042static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003043sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003044{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003045 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003046#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003047 if (s->sock_fd > LONG_MAX) {
3048 /* this can occur on Win64, and actually there is a special
3049 ugly printf formatter for decimal pointer length integer
3050 printing, only bother if necessary*/
3051 PyErr_SetString(PyExc_OverflowError,
3052 "no printf formatter to display "
3053 "the socket descriptor in decimal");
3054 return NULL;
3055 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003056#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003057 PyOS_snprintf(
3058 buf, sizeof(buf),
3059 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3060 (long)s->sock_fd, s->sock_family,
3061 s->sock_type,
3062 s->sock_proto);
3063 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003064}
3065
3066
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003067/* Create a new, uninitialized socket object. */
3068
3069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003070sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003071{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003072 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003074 new = type->tp_alloc(type, 0);
3075 if (new != NULL) {
3076 ((PySocketSockObject *)new)->sock_fd = -1;
3077 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3078 ((PySocketSockObject *)new)->errorhandler = &set_error;
3079 }
3080 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003081}
3082
3083
3084/* Initialize a new socket object. */
3085
3086/*ARGSUSED*/
3087static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003088sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003089{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003090 PySocketSockObject *s = (PySocketSockObject *)self;
3091 SOCKET_T fd;
3092 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3093 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003094
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003095 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3096 "|iii:socket", keywords,
3097 &family, &type, &proto))
3098 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003099
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003100 Py_BEGIN_ALLOW_THREADS
3101 fd = socket(family, type, proto);
3102 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003103
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003104#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003105 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003106#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003107 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003108#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003109 {
3110 set_error();
3111 return -1;
3112 }
3113 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003114
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003115 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003116
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003117}
3118
3119
Guido van Rossumb6775db1994-08-01 11:34:53 +00003120/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003121
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003122static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003123 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3124 "_socket.socket", /* tp_name */
3125 sizeof(PySocketSockObject), /* tp_basicsize */
3126 0, /* tp_itemsize */
3127 (destructor)sock_dealloc, /* tp_dealloc */
3128 0, /* tp_print */
3129 0, /* tp_getattr */
3130 0, /* tp_setattr */
3131 0, /* tp_compare */
3132 (reprfunc)sock_repr, /* tp_repr */
3133 0, /* tp_as_number */
3134 0, /* tp_as_sequence */
3135 0, /* tp_as_mapping */
3136 0, /* tp_hash */
3137 0, /* tp_call */
3138 0, /* tp_str */
3139 PyObject_GenericGetAttr, /* tp_getattro */
3140 0, /* tp_setattro */
3141 0, /* tp_as_buffer */
3142 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3143 sock_doc, /* tp_doc */
3144 0, /* tp_traverse */
3145 0, /* tp_clear */
3146 0, /* tp_richcompare */
3147 0, /* tp_weaklistoffset */
3148 0, /* tp_iter */
3149 0, /* tp_iternext */
3150 sock_methods, /* tp_methods */
3151 sock_memberlist, /* tp_members */
3152 0, /* tp_getset */
3153 0, /* tp_base */
3154 0, /* tp_dict */
3155 0, /* tp_descr_get */
3156 0, /* tp_descr_set */
3157 0, /* tp_dictoffset */
3158 sock_initobj, /* tp_init */
3159 PyType_GenericAlloc, /* tp_alloc */
3160 sock_new, /* tp_new */
3161 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003162};
3163
Guido van Rossum30a685f1991-06-27 15:51:29 +00003164
Guido van Rossum81194471991-07-27 21:42:02 +00003165/* Python interface to gethostname(). */
3166
3167/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003168static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003169socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003170{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003171 char buf[1024];
3172 int res;
3173 Py_BEGIN_ALLOW_THREADS
3174 res = gethostname(buf, (int) sizeof buf - 1);
3175 Py_END_ALLOW_THREADS
3176 if (res < 0)
3177 return set_error();
3178 buf[sizeof buf - 1] = '\0';
3179 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003180}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003182PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003183"gethostname() -> string\n\
3184\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003185Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003186
Guido van Rossumff4949e1992-08-05 19:58:53 +00003187
Guido van Rossum30a685f1991-06-27 15:51:29 +00003188/* Python interface to gethostbyname(name). */
3189
3190/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003191static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003192socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003193{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003194 char *name;
3195 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003196
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003197 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3198 return NULL;
3199 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3200 return NULL;
3201 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003202}
3203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003204PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003205"gethostbyname(host) -> address\n\
3206\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003207Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003208
3209
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003210/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3211
3212static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003213gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003214{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003215 char **pch;
3216 PyObject *rtn_tuple = (PyObject *)NULL;
3217 PyObject *name_list = (PyObject *)NULL;
3218 PyObject *addr_list = (PyObject *)NULL;
3219 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003220
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003221 if (h == NULL) {
3222 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003223#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003224 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003225#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003226 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003227#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003228 return NULL;
3229 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003230
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003231 if (h->h_addrtype != af) {
3232 /* Let's get real error message to return */
3233 PyErr_SetString(socket_error,
3234 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003235
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003236 return NULL;
3237 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003238
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003239 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003240
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003241 case AF_INET:
3242 if (alen < sizeof(struct sockaddr_in))
3243 return NULL;
3244 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003245
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003246#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003247 case AF_INET6:
3248 if (alen < sizeof(struct sockaddr_in6))
3249 return NULL;
3250 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003251#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003252
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003253 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003254
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003255 if ((name_list = PyList_New(0)) == NULL)
3256 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003257
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003258 if ((addr_list = PyList_New(0)) == NULL)
3259 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003260
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003261 /* SF #1511317: h_aliases can be NULL */
3262 if (h->h_aliases) {
3263 for (pch = h->h_aliases; *pch != NULL; pch++) {
3264 int status;
3265 tmp = PyString_FromString(*pch);
3266 if (tmp == NULL)
3267 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003268
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003269 status = PyList_Append(name_list, tmp);
3270 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003271
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003272 if (status)
3273 goto err;
3274 }
3275 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003276
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003277 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3278 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003279
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003280 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003281
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003282 case AF_INET:
3283 {
3284 struct sockaddr_in sin;
3285 memset(&sin, 0, sizeof(sin));
3286 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003287#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003288 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003289#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003290 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3291 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003292
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003293 if (pch == h->h_addr_list && alen >= sizeof(sin))
3294 memcpy((char *) addr, &sin, sizeof(sin));
3295 break;
3296 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003297
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003298#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003299 case AF_INET6:
3300 {
3301 struct sockaddr_in6 sin6;
3302 memset(&sin6, 0, sizeof(sin6));
3303 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003304#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003305 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003306#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003307 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3308 tmp = makeipaddr((struct sockaddr *)&sin6,
3309 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003310
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003311 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3312 memcpy((char *) addr, &sin6, sizeof(sin6));
3313 break;
3314 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003315#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003316
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003317 default: /* can't happen */
3318 PyErr_SetString(socket_error,
3319 "unsupported address family");
3320 return NULL;
3321 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003322
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003323 if (tmp == NULL)
3324 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003325
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003326 status = PyList_Append(addr_list, tmp);
3327 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003328
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003329 if (status)
3330 goto err;
3331 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003333 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003334
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003335 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003336 Py_XDECREF(name_list);
3337 Py_XDECREF(addr_list);
3338 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003339}
3340
3341
3342/* Python interface to gethostbyname_ex(name). */
3343
3344/*ARGSUSED*/
3345static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003346socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003347{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003348 char *name;
3349 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003350#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003351 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003352#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003353 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003354#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003355 struct sockaddr *sa;
3356 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003357#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003358 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003359#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003360 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003361#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 char buf[16384];
3363 int buf_len = (sizeof buf) - 1;
3364 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003365#endif
3366#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003367 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003368#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003369#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003370
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003371 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3372 return NULL;
3373 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3374 return NULL;
3375 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003376#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003377#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003378 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3379 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003380#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003381 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003382#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003383 memset((void *) &data, '\0', sizeof(data));
3384 result = gethostbyname_r(name, &hp_allocated, &data);
3385 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003386#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003387#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003388#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003389 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003390#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003391 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003392#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003393 Py_END_ALLOW_THREADS
3394 /* Some C libraries would require addr.__ss_family instead of
3395 addr.ss_family.
3396 Therefore, we cast the sockaddr_storage into sockaddr to
3397 access sa_family. */
3398 sa = (struct sockaddr*)&addr;
3399 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3400 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003401#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003402 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003403#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003404 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003405}
3406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003407PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003408"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3409\n\
3410Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003411for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003412
3413
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003414/* Python interface to gethostbyaddr(IP). */
3415
3416/*ARGSUSED*/
3417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003418socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003419{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003420#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003421 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003422#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003423 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003424#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003425 struct sockaddr *sa = (struct sockaddr *)&addr;
3426 char *ip_num;
3427 struct hostent *h;
3428 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003429#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003430 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003431#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003432 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003433#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003434 /* glibcs up to 2.10 assume that the buf argument to
3435 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3436 does not ensure. The attribute below instructs the compiler
3437 to maintain this alignment. */
3438 char buf[16384] Py_ALIGNED(8);
3439 int buf_len = (sizeof buf) - 1;
3440 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003441#endif
3442#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003443 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003444#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003445#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003446 char *ap;
3447 int al;
3448 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003449
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003450 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3451 return NULL;
3452 af = AF_UNSPEC;
3453 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3454 return NULL;
3455 af = sa->sa_family;
3456 ap = NULL;
3457 switch (af) {
3458 case AF_INET:
3459 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3460 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3461 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003462#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003463 case AF_INET6:
3464 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3465 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3466 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003467#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003468 default:
3469 PyErr_SetString(socket_error, "unsupported address family");
3470 return NULL;
3471 }
3472 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003473#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003474#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003475 result = gethostbyaddr_r(ap, al, af,
3476 &hp_allocated, buf, buf_len,
3477 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003478#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003479 h = gethostbyaddr_r(ap, al, af,
3480 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003481#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003482 memset((void *) &data, '\0', sizeof(data));
3483 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3484 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003485#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003486#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003487#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003488 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003489#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003490 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003491#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003492 Py_END_ALLOW_THREADS
3493 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003494#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003495 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003496#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003497 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003498}
3499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003500PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003501"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3502\n\
3503Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003504for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003505
Guido van Rossum30a685f1991-06-27 15:51:29 +00003506
3507/* Python interface to getservbyname(name).
3508 This only returns the port number, since the other info is already
3509 known or not useful (like the list of aliases). */
3510
3511/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003512static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003513socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003514{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003515 char *name, *proto=NULL;
3516 struct servent *sp;
3517 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3518 return NULL;
3519 Py_BEGIN_ALLOW_THREADS
3520 sp = getservbyname(name, proto);
3521 Py_END_ALLOW_THREADS
3522 if (sp == NULL) {
3523 PyErr_SetString(socket_error, "service/proto not found");
3524 return NULL;
3525 }
3526 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003527}
3528
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003529PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003530"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003531\n\
3532Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003533The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3534otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003535
Guido van Rossum30a685f1991-06-27 15:51:29 +00003536
Barry Warsaw11b91a02004-06-28 00:50:43 +00003537/* Python interface to getservbyport(port).
3538 This only returns the service name, since the other info is already
3539 known or not useful (like the list of aliases). */
3540
3541/*ARGSUSED*/
3542static PyObject *
3543socket_getservbyport(PyObject *self, PyObject *args)
3544{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003545 int port;
3546 char *proto=NULL;
3547 struct servent *sp;
3548 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3549 return NULL;
3550 if (port < 0 || port > 0xffff) {
3551 PyErr_SetString(
3552 PyExc_OverflowError,
3553 "getservbyport: port must be 0-65535.");
3554 return NULL;
3555 }
3556 Py_BEGIN_ALLOW_THREADS
3557 sp = getservbyport(htons((short)port), proto);
3558 Py_END_ALLOW_THREADS
3559 if (sp == NULL) {
3560 PyErr_SetString(socket_error, "port/proto not found");
3561 return NULL;
3562 }
3563 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003564}
3565
3566PyDoc_STRVAR(getservbyport_doc,
3567"getservbyport(port[, protocolname]) -> string\n\
3568\n\
3569Return the service name from a port number and protocol name.\n\
3570The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3571otherwise any protocol will match.");
3572
Guido van Rossum3901d851996-12-19 16:35:04 +00003573/* Python interface to getprotobyname(name).
3574 This only returns the protocol number, since the other info is
3575 already known or not useful (like the list of aliases). */
3576
3577/*ARGSUSED*/
3578static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003579socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003580{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003581 char *name;
3582 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003583#ifdef __BEOS__
3584/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003585 PyErr_SetString(socket_error, "getprotobyname not supported");
3586 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003587#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003588 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3589 return NULL;
3590 Py_BEGIN_ALLOW_THREADS
3591 sp = getprotobyname(name);
3592 Py_END_ALLOW_THREADS
3593 if (sp == NULL) {
3594 PyErr_SetString(socket_error, "protocol not found");
3595 return NULL;
3596 }
3597 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003598#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003599}
3600
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003601PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003602"getprotobyname(name) -> integer\n\
3603\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003604Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003605
Guido van Rossum3901d851996-12-19 16:35:04 +00003606
Dave Cole331708b2004-08-09 04:51:41 +00003607#ifdef HAVE_SOCKETPAIR
3608/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003609 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003610 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003611
3612/*ARGSUSED*/
3613static PyObject *
3614socket_socketpair(PyObject *self, PyObject *args)
3615{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003616 PySocketSockObject *s0 = NULL, *s1 = NULL;
3617 SOCKET_T sv[2];
3618 int family, type = SOCK_STREAM, proto = 0;
3619 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003620
3621#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003622 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003623#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003624 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003625#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003626 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3627 &family, &type, &proto))
3628 return NULL;
3629 /* Create a pair of socket fds */
3630 if (socketpair(family, type, proto, sv) < 0)
3631 return set_error();
3632 s0 = new_sockobject(sv[0], family, type, proto);
3633 if (s0 == NULL)
3634 goto finally;
3635 s1 = new_sockobject(sv[1], family, type, proto);
3636 if (s1 == NULL)
3637 goto finally;
3638 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003639
3640finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003641 if (res == NULL) {
3642 if (s0 == NULL)
3643 SOCKETCLOSE(sv[0]);
3644 if (s1 == NULL)
3645 SOCKETCLOSE(sv[1]);
3646 }
3647 Py_XDECREF(s0);
3648 Py_XDECREF(s1);
3649 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003650}
3651
3652PyDoc_STRVAR(socketpair_doc,
3653"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3654\n\
3655Create a pair of socket objects from the sockets returned by the platform\n\
3656socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003657The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003658AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003659
3660#endif /* HAVE_SOCKETPAIR */
3661
3662
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003663#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003664/* Create a socket object from a numeric file description.
3665 Useful e.g. if stdin is a socket.
3666 Additional arguments as for socket(). */
3667
3668/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003670socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003671{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003672 PySocketSockObject *s;
3673 SOCKET_T fd;
3674 int family, type, proto = 0;
3675 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3676 &fd, &family, &type, &proto))
3677 return NULL;
3678 /* Dup the fd so it and the socket can be closed independently */
3679 fd = dup(fd);
3680 if (fd < 0)
3681 return set_error();
3682 s = new_sockobject(fd, family, type, proto);
3683 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003684}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003686PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003687"fromfd(fd, family, type[, proto]) -> socket object\n\
3688\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003689Create a socket object from a duplicate of the given\n\
3690file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003691The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003692
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003693#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003694
Guido van Rossum82a5c661998-07-07 20:45:43 +00003695
Guido van Rossum006bf911996-06-12 04:04:55 +00003696static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003697socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003698{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003699 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003700
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003701 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3702 return NULL;
3703 }
3704 if (x1 < 0) {
3705 PyErr_SetString(PyExc_OverflowError,
3706 "can't convert negative number to unsigned long");
3707 return NULL;
3708 }
3709 x2 = (unsigned int)ntohs((unsigned short)x1);
3710 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003711}
3712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003713PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003714"ntohs(integer) -> integer\n\
3715\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003716Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003717
3718
Guido van Rossum006bf911996-06-12 04:04:55 +00003719static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003720socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003721{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003722 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003723
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003724 if (PyInt_Check(arg)) {
3725 x = PyInt_AS_LONG(arg);
3726 if (x == (unsigned long) -1 && PyErr_Occurred())
3727 return NULL;
3728 if ((long)x < 0) {
3729 PyErr_SetString(PyExc_OverflowError,
3730 "can't convert negative number to unsigned long");
3731 return NULL;
3732 }
3733 }
3734 else if (PyLong_Check(arg)) {
3735 x = PyLong_AsUnsignedLong(arg);
3736 if (x == (unsigned long) -1 && PyErr_Occurred())
3737 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003738#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003739 {
3740 unsigned long y;
3741 /* only want the trailing 32 bits */
3742 y = x & 0xFFFFFFFFUL;
3743 if (y ^ x)
3744 return PyErr_Format(PyExc_OverflowError,
3745 "long int larger than 32 bits");
3746 x = y;
3747 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003748#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003749 }
3750 else
3751 return PyErr_Format(PyExc_TypeError,
3752 "expected int/long, %s found",
3753 Py_TYPE(arg)->tp_name);
3754 if (x == (unsigned long) -1 && PyErr_Occurred())
3755 return NULL;
3756 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003757}
3758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003759PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003760"ntohl(integer) -> integer\n\
3761\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003762Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003763
3764
Guido van Rossum006bf911996-06-12 04:04:55 +00003765static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003766socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003767{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003768 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003769
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003770 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3771 return NULL;
3772 }
3773 if (x1 < 0) {
3774 PyErr_SetString(PyExc_OverflowError,
3775 "can't convert negative number to unsigned long");
3776 return NULL;
3777 }
3778 x2 = (unsigned int)htons((unsigned short)x1);
3779 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003780}
3781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003782PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003783"htons(integer) -> integer\n\
3784\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003785Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003786
3787
Guido van Rossum006bf911996-06-12 04:04:55 +00003788static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003789socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003790{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003791 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003792
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003793 if (PyInt_Check(arg)) {
3794 x = PyInt_AS_LONG(arg);
3795 if (x == (unsigned long) -1 && PyErr_Occurred())
3796 return NULL;
3797 if ((long)x < 0) {
3798 PyErr_SetString(PyExc_OverflowError,
3799 "can't convert negative number to unsigned long");
3800 return NULL;
3801 }
3802 }
3803 else if (PyLong_Check(arg)) {
3804 x = PyLong_AsUnsignedLong(arg);
3805 if (x == (unsigned long) -1 && PyErr_Occurred())
3806 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003807#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003808 {
3809 unsigned long y;
3810 /* only want the trailing 32 bits */
3811 y = x & 0xFFFFFFFFUL;
3812 if (y ^ x)
3813 return PyErr_Format(PyExc_OverflowError,
3814 "long int larger than 32 bits");
3815 x = y;
3816 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003817#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003818 }
3819 else
3820 return PyErr_Format(PyExc_TypeError,
3821 "expected int/long, %s found",
3822 Py_TYPE(arg)->tp_name);
3823 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003824}
3825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003826PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003827"htonl(integer) -> integer\n\
3828\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003829Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003830
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003831/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003833PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003834"inet_aton(string) -> packed 32-bit IP representation\n\
3835\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003836Convert 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 +00003837binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003838
3839static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003840socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003841{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003842#ifndef INADDR_NONE
3843#define INADDR_NONE (-1)
3844#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003845#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003846 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003847#endif
3848
3849#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003850#if (SIZEOF_INT != 4)
3851#error "Not sure if in_addr_t exists and int is not 32-bits."
3852#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003853 /* Have to use inet_addr() instead */
3854 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003855#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003856 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003857
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003858 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3859 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003860
Tim Peters1df9fdd2003-02-13 03:13:40 +00003861
3862#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003863
3864#ifdef USE_INET_ATON_WEAKLINK
3865 if (inet_aton != NULL) {
3866#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003867 if (inet_aton(ip_addr, &buf))
3868 return PyString_FromStringAndSize((char *)(&buf),
3869 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003870
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003871 PyErr_SetString(socket_error,
3872 "illegal IP address string passed to inet_aton");
3873 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003874
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003875#ifdef USE_INET_ATON_WEAKLINK
3876 } else {
3877#endif
3878
3879#endif
3880
3881#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3882
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003883 /* special-case this address as inet_addr might return INADDR_NONE
3884 * for this */
3885 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3886 packed_addr = 0xFFFFFFFF;
3887 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003888
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003889 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003891 if (packed_addr == INADDR_NONE) { /* invalid address */
3892 PyErr_SetString(socket_error,
3893 "illegal IP address string passed to inet_aton");
3894 return NULL;
3895 }
3896 }
3897 return PyString_FromStringAndSize((char *) &packed_addr,
3898 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003899
3900#ifdef USE_INET_ATON_WEAKLINK
3901 }
3902#endif
3903
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003904#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003905}
3906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003907PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003908"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003909\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003910Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003911
3912static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003913socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003914{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003915 char *packed_str;
3916 int addr_len;
3917 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003918
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003919 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
3920 return NULL;
3921 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003922
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003923 if (addr_len != sizeof(packed_addr)) {
3924 PyErr_SetString(socket_error,
3925 "packed IP wrong length for inet_ntoa");
3926 return NULL;
3927 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003928
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003929 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003931 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003932}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003933
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003934#ifdef HAVE_INET_PTON
3935
3936PyDoc_STRVAR(inet_pton_doc,
3937"inet_pton(af, ip) -> packed IP address string\n\
3938\n\
3939Convert an IP address from string format to a packed string suitable\n\
3940for use with low-level network functions.");
3941
3942static PyObject *
3943socket_inet_pton(PyObject *self, PyObject *args)
3944{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003945 int af;
3946 char* ip;
3947 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003948#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003949 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003950#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003951 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003952#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003953 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3954 return NULL;
3955 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003956
Martin v. Löwis04697e82004-06-02 12:35:29 +00003957#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003958 if(af == AF_INET6) {
3959 PyErr_SetString(socket_error,
3960 "can't use AF_INET6, IPv6 is disabled");
3961 return NULL;
3962 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003963#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003964
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003965 retval = inet_pton(af, ip, packed);
3966 if (retval < 0) {
3967 PyErr_SetFromErrno(socket_error);
3968 return NULL;
3969 } else if (retval == 0) {
3970 PyErr_SetString(socket_error,
3971 "illegal IP address string passed to inet_pton");
3972 return NULL;
3973 } else if (af == AF_INET) {
3974 return PyString_FromStringAndSize(packed,
3975 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003976#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003977 } else if (af == AF_INET6) {
3978 return PyString_FromStringAndSize(packed,
3979 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003981 } else {
3982 PyErr_SetString(socket_error, "unknown address family");
3983 return NULL;
3984 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003985}
Martin Blais2856e5f2006-05-26 12:03:27 +00003986
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003987PyDoc_STRVAR(inet_ntop_doc,
3988"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3989\n\
3990Convert a packed IP address of the given family to string format.");
3991
3992static PyObject *
3993socket_inet_ntop(PyObject *self, PyObject *args)
3994{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003995 int af;
3996 char* packed;
3997 int len;
3998 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003999#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004000 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004001#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004002 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004003#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004004
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004005 /* Guarantee NUL-termination for PyString_FromString() below */
4006 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004008 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4009 return NULL;
4010 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004012 if (af == AF_INET) {
4013 if (len != sizeof(struct in_addr)) {
4014 PyErr_SetString(PyExc_ValueError,
4015 "invalid length of packed IP address string");
4016 return NULL;
4017 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004018#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004019 } else if (af == AF_INET6) {
4020 if (len != sizeof(struct in6_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#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004026 } else {
4027 PyErr_Format(PyExc_ValueError,
4028 "unknown address family %d", af);
4029 return NULL;
4030 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004031
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004032 retval = inet_ntop(af, packed, ip, sizeof(ip));
4033 if (!retval) {
4034 PyErr_SetFromErrno(socket_error);
4035 return NULL;
4036 } else {
4037 return PyString_FromString(retval);
4038 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004039
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004040 /* NOTREACHED */
4041 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4042 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004043}
4044
4045#endif /* HAVE_INET_PTON */
4046
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004047/* Python interface to getaddrinfo(host, port). */
4048
4049/*ARGSUSED*/
4050static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004051socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004052{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004053 struct addrinfo hints, *res;
4054 struct addrinfo *res0 = NULL;
4055 PyObject *hobj = NULL;
4056 PyObject *pobj = (PyObject *)NULL;
4057 char pbuf[30];
4058 char *hptr, *pptr;
4059 int family, socktype, protocol, flags;
4060 int error;
4061 PyObject *all = (PyObject *)NULL;
4062 PyObject *single = (PyObject *)NULL;
4063 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004064
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004065 family = socktype = protocol = flags = 0;
4066 family = AF_UNSPEC;
4067 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4068 &hobj, &pobj, &family, &socktype,
4069 &protocol, &flags)) {
4070 return NULL;
4071 }
4072 if (hobj == Py_None) {
4073 hptr = NULL;
4074 } else if (PyUnicode_Check(hobj)) {
4075 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4076 if (!idna)
4077 return NULL;
4078 hptr = PyString_AsString(idna);
4079 } else if (PyString_Check(hobj)) {
4080 hptr = PyString_AsString(hobj);
4081 } else {
4082 PyErr_SetString(PyExc_TypeError,
4083 "getaddrinfo() argument 1 must be string or None");
4084 return NULL;
4085 }
4086 if (PyInt_Check(pobj)) {
4087 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
4088 pptr = pbuf;
4089 } else if (PyString_Check(pobj)) {
4090 pptr = PyString_AsString(pobj);
4091 } else if (pobj == Py_None) {
4092 pptr = (char *)NULL;
4093 } else {
4094 PyErr_SetString(socket_error, "Int or String expected");
4095 goto err;
4096 }
4097 memset(&hints, 0, sizeof(hints));
4098 hints.ai_family = family;
4099 hints.ai_socktype = socktype;
4100 hints.ai_protocol = protocol;
4101 hints.ai_flags = flags;
4102 Py_BEGIN_ALLOW_THREADS
4103 ACQUIRE_GETADDRINFO_LOCK
4104 error = getaddrinfo(hptr, pptr, &hints, &res0);
4105 Py_END_ALLOW_THREADS
4106 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4107 if (error) {
4108 set_gaierror(error);
4109 goto err;
4110 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004111
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004112 if ((all = PyList_New(0)) == NULL)
4113 goto err;
4114 for (res = res0; res; res = res->ai_next) {
4115 PyObject *addr =
4116 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4117 if (addr == NULL)
4118 goto err;
4119 single = Py_BuildValue("iiisO", res->ai_family,
4120 res->ai_socktype, res->ai_protocol,
4121 res->ai_canonname ? res->ai_canonname : "",
4122 addr);
4123 Py_DECREF(addr);
4124 if (single == NULL)
4125 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004126
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004127 if (PyList_Append(all, single))
4128 goto err;
4129 Py_XDECREF(single);
4130 }
4131 Py_XDECREF(idna);
4132 if (res0)
4133 freeaddrinfo(res0);
4134 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004135 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004136 Py_XDECREF(single);
4137 Py_XDECREF(all);
4138 Py_XDECREF(idna);
4139 if (res0)
4140 freeaddrinfo(res0);
4141 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004142}
4143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004144PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004145"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4146 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004147\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004148Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004149
4150/* Python interface to getnameinfo(sa, flags). */
4151
4152/*ARGSUSED*/
4153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004154socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004155{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004156 PyObject *sa = (PyObject *)NULL;
4157 int flags;
4158 char *hostp;
4159 int port, flowinfo, scope_id;
4160 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4161 struct addrinfo hints, *res = NULL;
4162 int error;
4163 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004164
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004165 flags = flowinfo = scope_id = 0;
4166 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4167 return NULL;
4168 if (!PyTuple_Check(sa)) {
4169 PyErr_SetString(PyExc_TypeError,
4170 "getnameinfo() argument 1 must be a tuple");
4171 return NULL;
4172 }
4173 if (!PyArg_ParseTuple(sa, "si|ii",
4174 &hostp, &port, &flowinfo, &scope_id))
4175 return NULL;
4176 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4177 memset(&hints, 0, sizeof(hints));
4178 hints.ai_family = AF_UNSPEC;
4179 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4180 Py_BEGIN_ALLOW_THREADS
4181 ACQUIRE_GETADDRINFO_LOCK
4182 error = getaddrinfo(hostp, pbuf, &hints, &res);
4183 Py_END_ALLOW_THREADS
4184 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4185 if (error) {
4186 set_gaierror(error);
4187 goto fail;
4188 }
4189 if (res->ai_next) {
4190 PyErr_SetString(socket_error,
4191 "sockaddr resolved to multiple addresses");
4192 goto fail;
4193 }
4194 switch (res->ai_family) {
4195 case AF_INET:
4196 {
4197 if (PyTuple_GET_SIZE(sa) != 2) {
4198 PyErr_SetString(socket_error,
4199 "IPv4 sockaddr must be 2 tuple");
4200 goto fail;
4201 }
4202 break;
4203 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004204#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004205 case AF_INET6:
4206 {
4207 struct sockaddr_in6 *sin6;
4208 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4209 sin6->sin6_flowinfo = flowinfo;
4210 sin6->sin6_scope_id = scope_id;
4211 break;
4212 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004213#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004214 }
4215 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4216 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4217 if (error) {
4218 set_gaierror(error);
4219 goto fail;
4220 }
4221 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004222
4223fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004224 if (res)
4225 freeaddrinfo(res);
4226 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004227}
4228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004229PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004230"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004231\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004232Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004233
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004234
4235/* Python API to getting and setting the default timeout value. */
4236
4237static PyObject *
4238socket_getdefaulttimeout(PyObject *self)
4239{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004240 if (defaulttimeout < 0.0) {
4241 Py_INCREF(Py_None);
4242 return Py_None;
4243 }
4244 else
4245 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004246}
4247
4248PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004249"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004250\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004251Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004252A value of None indicates that new socket objects have no timeout.\n\
4253When the socket module is first imported, the default is None.");
4254
4255static PyObject *
4256socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4257{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004258 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004259
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004260 if (arg == Py_None)
4261 timeout = -1.0;
4262 else {
4263 timeout = PyFloat_AsDouble(arg);
4264 if (timeout < 0.0) {
4265 if (!PyErr_Occurred())
4266 PyErr_SetString(PyExc_ValueError,
4267 "Timeout value out of range");
4268 return NULL;
4269 }
4270 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004271
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004272 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004273
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004274 Py_INCREF(Py_None);
4275 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004276}
4277
4278PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004279"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004280\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004281Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004282A value of None indicates that new socket objects have no timeout.\n\
4283When the socket module is first imported, the default is None.");
4284
4285
Guido van Rossum30a685f1991-06-27 15:51:29 +00004286/* List of functions exported by this module. */
4287
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004288static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004289 {"gethostbyname", socket_gethostbyname,
4290 METH_VARARGS, gethostbyname_doc},
4291 {"gethostbyname_ex", socket_gethostbyname_ex,
4292 METH_VARARGS, ghbn_ex_doc},
4293 {"gethostbyaddr", socket_gethostbyaddr,
4294 METH_VARARGS, gethostbyaddr_doc},
4295 {"gethostname", socket_gethostname,
4296 METH_NOARGS, gethostname_doc},
4297 {"getservbyname", socket_getservbyname,
4298 METH_VARARGS, getservbyname_doc},
4299 {"getservbyport", socket_getservbyport,
4300 METH_VARARGS, getservbyport_doc},
4301 {"getprotobyname", socket_getprotobyname,
4302 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004303#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004304 {"fromfd", socket_fromfd,
4305 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004306#endif
Dave Cole331708b2004-08-09 04:51:41 +00004307#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004308 {"socketpair", socket_socketpair,
4309 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004310#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004311 {"ntohs", socket_ntohs,
4312 METH_VARARGS, ntohs_doc},
4313 {"ntohl", socket_ntohl,
4314 METH_O, ntohl_doc},
4315 {"htons", socket_htons,
4316 METH_VARARGS, htons_doc},
4317 {"htonl", socket_htonl,
4318 METH_O, htonl_doc},
4319 {"inet_aton", socket_inet_aton,
4320 METH_VARARGS, inet_aton_doc},
4321 {"inet_ntoa", socket_inet_ntoa,
4322 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004323#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004324 {"inet_pton", socket_inet_pton,
4325 METH_VARARGS, inet_pton_doc},
4326 {"inet_ntop", socket_inet_ntop,
4327 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004328#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004329 {"getaddrinfo", socket_getaddrinfo,
4330 METH_VARARGS, getaddrinfo_doc},
4331 {"getnameinfo", socket_getnameinfo,
4332 METH_VARARGS, getnameinfo_doc},
4333 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4334 METH_NOARGS, getdefaulttimeout_doc},
4335 {"setdefaulttimeout", socket_setdefaulttimeout,
4336 METH_O, setdefaulttimeout_doc},
4337 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004338};
4339
Guido van Rossum30a685f1991-06-27 15:51:29 +00004340
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004341#ifdef RISCOS
4342#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004343
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004344static int
4345os_init(void)
4346{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004347 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004348
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004349 r.r[0] = 0;
4350 _kernel_swi(0x43380, &r, &r);
4351 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004352
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004353 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004354}
4355
4356#endif /* RISCOS */
4357
4358
4359#ifdef MS_WINDOWS
4360#define OS_INIT_DEFINED
4361
4362/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004363
4364static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004365os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004366{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004367 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004368}
4369
4370static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004371os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004372{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004373 WSADATA WSAData;
4374 int ret;
4375 char buf[100];
4376 ret = WSAStartup(0x0101, &WSAData);
4377 switch (ret) {
4378 case 0: /* No error */
4379 Py_AtExit(os_cleanup);
4380 return 1; /* Success */
4381 case WSASYSNOTREADY:
4382 PyErr_SetString(PyExc_ImportError,
4383 "WSAStartup failed: network not ready");
4384 break;
4385 case WSAVERNOTSUPPORTED:
4386 case WSAEINVAL:
4387 PyErr_SetString(
4388 PyExc_ImportError,
4389 "WSAStartup failed: requested version not supported");
4390 break;
4391 default:
4392 PyOS_snprintf(buf, sizeof(buf),
4393 "WSAStartup failed: error code %d", ret);
4394 PyErr_SetString(PyExc_ImportError, buf);
4395 break;
4396 }
4397 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004398}
4399
Guido van Rossum8d665e61996-06-26 18:22:49 +00004400#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004401
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004402
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004403#ifdef PYOS_OS2
4404#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004405
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004406/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004407
4408static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004409os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004410{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004411#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004412 char reason[64];
4413 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004415 if (rc == 0) {
4416 return 1; /* Success */
4417 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004418
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004419 PyOS_snprintf(reason, sizeof(reason),
4420 "OS/2 TCP/IP Error# %d", sock_errno());
4421 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004422
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004423 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004424#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004425 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004426 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004427#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004428}
4429
4430#endif /* PYOS_OS2 */
4431
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004432
4433#ifndef OS_INIT_DEFINED
4434static int
4435os_init(void)
4436{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004437 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004438}
4439#endif
4440
4441
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004442/* C API table - always add new things to the end for binary
4443 compatibility. */
4444static
4445PySocketModule_APIObject PySocketModuleAPI =
4446{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004447 &sock_type,
4448 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004449};
4450
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004451
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004452/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004453
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004454 This module is actually called "_socket", and there's a wrapper
4455 "socket.py" which implements some additional functionality. On some
4456 platforms (e.g. Windows and OS/2), socket.py also implements a
4457 wrapper for the socket type that provides missing functionality such
4458 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4459 with an ImportError exception if os-specific initialization fails.
4460 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004461 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004462 made at exit time.
4463*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004465PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004466"Implementation module for socket operations.\n\
4467\n\
4468See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004469
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004470PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004471init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004472{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004473 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004475 if (!os_init())
4476 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004477
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004478 Py_TYPE(&sock_type) = &PyType_Type;
4479 m = Py_InitModule3(PySocket_MODULE_NAME,
4480 socket_methods,
4481 socket_doc);
4482 if (m == NULL)
4483 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004485 socket_error = PyErr_NewException("socket.error",
4486 PyExc_IOError, NULL);
4487 if (socket_error == NULL)
4488 return;
4489 PySocketModuleAPI.error = socket_error;
4490 Py_INCREF(socket_error);
4491 PyModule_AddObject(m, "error", socket_error);
4492 socket_herror = PyErr_NewException("socket.herror",
4493 socket_error, NULL);
4494 if (socket_herror == NULL)
4495 return;
4496 Py_INCREF(socket_herror);
4497 PyModule_AddObject(m, "herror", socket_herror);
4498 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4499 NULL);
4500 if (socket_gaierror == NULL)
4501 return;
4502 Py_INCREF(socket_gaierror);
4503 PyModule_AddObject(m, "gaierror", socket_gaierror);
4504 socket_timeout = PyErr_NewException("socket.timeout",
4505 socket_error, NULL);
4506 if (socket_timeout == NULL)
4507 return;
4508 Py_INCREF(socket_timeout);
4509 PyModule_AddObject(m, "timeout", socket_timeout);
4510 Py_INCREF((PyObject *)&sock_type);
4511 if (PyModule_AddObject(m, "SocketType",
4512 (PyObject *)&sock_type) != 0)
4513 return;
4514 Py_INCREF((PyObject *)&sock_type);
4515 if (PyModule_AddObject(m, "socket",
4516 (PyObject *)&sock_type) != 0)
4517 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004518
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004519#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004520 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004521#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004522 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004523#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004524 Py_INCREF(has_ipv6);
4525 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004527 /* Export C API */
4528 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4529 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4530 ) != 0)
4531 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004532
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004533 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004534#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004535 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004536#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004537 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004538#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004539 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004540#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004541#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004542 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004543#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004544#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004545 /* Amateur Radio AX.25 */
4546 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004547#endif
4548#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004549 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004550#endif
4551#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004552 /* Appletalk DDP */
4553 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004554#endif
4555#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004556 /* Amateur radio NetROM */
4557 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004558#endif
4559#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004560 /* Multiprotocol bridge */
4561 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004562#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004563#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004564 /* ATM PVCs */
4565 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004566#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004567#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004568 /* Reserved for Werner's ATM */
4569 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004570#endif
4571#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004572 /* Reserved for X.25 project */
4573 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004574#endif
4575#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004576 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004577#endif
4578#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004579 /* Amateur Radio X.25 PLP */
4580 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004581#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004582#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004583 /* Reserved for DECnet project */
4584 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004585#endif
4586#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004587 /* Reserved for 802.2LLC project */
4588 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004589#endif
4590#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004591 /* Security callback pseudo AF */
4592 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004593#endif
4594#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004595 /* PF_KEY key management API */
4596 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004597#endif
4598#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004599 /* */
4600 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4601 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004602#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004603 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004604#endif
4605#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004606 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004607#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004608 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4609 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004610#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004611 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004612#endif
4613#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004614 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004615#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004616#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004617 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004618#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004619#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004620 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004621#endif
4622#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004623 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004624#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004625 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004626#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004627 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4628#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004629#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004630 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004631#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004632#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004633#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004634 /* Alias to emulate 4.4BSD */
4635 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004636#endif
4637#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004638 /* Ash */
4639 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004640#endif
4641#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004642 /* Acorn Econet */
4643 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004644#endif
4645#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004646 /* ATM SVCs */
4647 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004648#endif
4649#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004650 /* Linux SNA Project (nutters!) */
4651 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004652#endif
4653#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004654 /* IRDA sockets */
4655 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004656#endif
4657#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004658 /* PPPoX sockets */
4659 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004660#endif
4661#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004662 /* Wanpipe API Sockets */
4663 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004664#endif
4665#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004666 /* Linux LLC */
4667 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004668#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004669
Hye-Shik Chang81268602004-02-02 06:05:24 +00004670#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004671 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4672 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4673 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4674 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004675#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004676 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004677#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004678#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004679#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004680 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004681#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004682 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4683 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004684#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004685 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4686 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4687 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004688#endif
4689
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004690#ifdef AF_PACKET
4691 PyModule_AddIntMacro(m, AF_PACKET);
4692#endif
4693#ifdef PF_PACKET
4694 PyModule_AddIntMacro(m, PF_PACKET);
4695#endif
4696#ifdef PACKET_HOST
4697 PyModule_AddIntMacro(m, PACKET_HOST);
4698#endif
4699#ifdef PACKET_BROADCAST
4700 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4701#endif
4702#ifdef PACKET_MULTICAST
4703 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4704#endif
4705#ifdef PACKET_OTHERHOST
4706 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4707#endif
4708#ifdef PACKET_OUTGOING
4709 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4710#endif
4711#ifdef PACKET_LOOPBACK
4712 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4713#endif
4714#ifdef PACKET_FASTROUTE
4715 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004716#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004717
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004718#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004719 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004720
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004721 /* for addresses */
4722 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4723 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4724 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004725
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004726 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4727 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4728 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004730 /* for setsockopt() */
4731 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4732 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4733 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4734 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4735 TIPC_DEST_DROPPABLE);
4736 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004737
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004738 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4739 TIPC_LOW_IMPORTANCE);
4740 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4741 TIPC_MEDIUM_IMPORTANCE);
4742 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4743 TIPC_HIGH_IMPORTANCE);
4744 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4745 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004747 /* for subscriptions */
4748 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4749 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004750#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004751 /* doesn't seem to be available everywhere */
4752 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004753#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004754 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4755 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4756 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4757 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4758 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4759 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004760#endif
4761
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004762 /* Socket types */
4763 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4764 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004765#ifndef __BEOS__
4766/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004767 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4768 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004769#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004770 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004771#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004772#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004773
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004774#ifdef SO_DEBUG
4775 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004776#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004777#ifdef SO_ACCEPTCONN
4778 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004779#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004780#ifdef SO_REUSEADDR
4781 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004782#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004783#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004784 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004785#endif
4786
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004787#ifdef SO_KEEPALIVE
4788 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004789#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004790#ifdef SO_DONTROUTE
4791 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004792#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004793#ifdef SO_BROADCAST
4794 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004795#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004796#ifdef SO_USELOOPBACK
4797 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004798#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004799#ifdef SO_LINGER
4800 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004801#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004802#ifdef SO_OOBINLINE
4803 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004804#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004805#ifdef SO_REUSEPORT
4806 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004807#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004808#ifdef SO_SNDBUF
4809 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004810#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004811#ifdef SO_RCVBUF
4812 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004813#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004814#ifdef SO_SNDLOWAT
4815 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004816#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004817#ifdef SO_RCVLOWAT
4818 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004819#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004820#ifdef SO_SNDTIMEO
4821 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004822#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004823#ifdef SO_RCVTIMEO
4824 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004825#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004826#ifdef SO_ERROR
4827 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004828#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004829#ifdef SO_TYPE
4830 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004831#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004832#ifdef SO_SETFIB
4833 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4834#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004835
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004836 /* Maximum number of connections for "listen" */
4837#ifdef SOMAXCONN
4838 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004839#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004840 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004841#endif
4842
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004843 /* Flags for send, recv */
4844#ifdef MSG_OOB
4845 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004846#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004847#ifdef MSG_PEEK
4848 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004849#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004850#ifdef MSG_DONTROUTE
4851 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004852#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004853#ifdef MSG_DONTWAIT
4854 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004855#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004856#ifdef MSG_EOR
4857 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004858#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004859#ifdef MSG_TRUNC
4860 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004861#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004862#ifdef MSG_CTRUNC
4863 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004864#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004865#ifdef MSG_WAITALL
4866 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004867#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004868#ifdef MSG_BTAG
4869 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004870#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004871#ifdef MSG_ETAG
4872 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004873#endif
4874
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004875 /* Protocol level and numbers, usable for [gs]etsockopt */
4876#ifdef SOL_SOCKET
4877 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004878#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004879#ifdef SOL_IP
4880 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004881#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004882 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004883#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884#ifdef SOL_IPX
4885 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004886#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004887#ifdef SOL_AX25
4888 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004889#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004890#ifdef SOL_ATALK
4891 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004892#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004893#ifdef SOL_NETROM
4894 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004895#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004896#ifdef SOL_ROSE
4897 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004898#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004899#ifdef SOL_TCP
4900 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004901#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004902 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004903#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004904#ifdef SOL_UDP
4905 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004906#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004907 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004908#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004909#ifdef IPPROTO_IP
4910 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004911#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004913#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004914#ifdef IPPROTO_HOPOPTS
4915 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004916#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004917#ifdef IPPROTO_ICMP
4918 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004919#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004920 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004921#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004922#ifdef IPPROTO_IGMP
4923 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004924#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004925#ifdef IPPROTO_GGP
4926 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004927#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004928#ifdef IPPROTO_IPV4
4929 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004930#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004931#ifdef IPPROTO_IPV6
4932 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004933#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004934#ifdef IPPROTO_IPIP
4935 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004936#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004937#ifdef IPPROTO_TCP
4938 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004939#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004940 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004941#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004942#ifdef IPPROTO_EGP
4943 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004944#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004945#ifdef IPPROTO_PUP
4946 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004947#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004948#ifdef IPPROTO_UDP
4949 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004950#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004951 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004952#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004953#ifdef IPPROTO_IDP
4954 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004955#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004956#ifdef IPPROTO_HELLO
4957 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004958#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004959#ifdef IPPROTO_ND
4960 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004961#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004962#ifdef IPPROTO_TP
4963 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004964#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004965#ifdef IPPROTO_IPV6
4966 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004967#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004968#ifdef IPPROTO_ROUTING
4969 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004970#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004971#ifdef IPPROTO_FRAGMENT
4972 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004973#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004974#ifdef IPPROTO_RSVP
4975 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004976#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004977#ifdef IPPROTO_GRE
4978 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004979#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004980#ifdef IPPROTO_ESP
4981 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004982#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004983#ifdef IPPROTO_AH
4984 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004985#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004986#ifdef IPPROTO_MOBILE
4987 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004988#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004989#ifdef IPPROTO_ICMPV6
4990 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004991#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004992#ifdef IPPROTO_NONE
4993 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004994#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004995#ifdef IPPROTO_DSTOPTS
4996 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004997#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004998#ifdef IPPROTO_XTP
4999 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005000#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005001#ifdef IPPROTO_EON
5002 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005003#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005004#ifdef IPPROTO_PIM
5005 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005006#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005007#ifdef IPPROTO_IPCOMP
5008 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005009#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005010#ifdef IPPROTO_VRRP
5011 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005012#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013#ifdef IPPROTO_BIP
5014 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005015#endif
5016/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005017#ifdef IPPROTO_RAW
5018 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005019#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005020 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005021#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005022#ifdef IPPROTO_MAX
5023 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005024#endif
5025
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026 /* Some port configuration */
5027#ifdef IPPORT_RESERVED
5028 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005029#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005030 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005031#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005032#ifdef IPPORT_USERRESERVED
5033 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005034#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005036#endif
5037
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005038 /* Some reserved IP v.4 addresses */
5039#ifdef INADDR_ANY
5040 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005041#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005042 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005043#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005044#ifdef INADDR_BROADCAST
5045 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005046#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005047 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005048#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005049#ifdef INADDR_LOOPBACK
5050 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005051#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005052 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005053#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005054#ifdef INADDR_UNSPEC_GROUP
5055 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005056#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005057 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005059#ifdef INADDR_ALLHOSTS_GROUP
5060 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5061 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005062#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005063 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065#ifdef INADDR_MAX_LOCAL_GROUP
5066 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5067 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005068#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005069 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005070#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005071#ifdef INADDR_NONE
5072 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005073#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005074 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005075#endif
5076
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005077 /* IPv4 [gs]etsockopt options */
5078#ifdef IP_OPTIONS
5079 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081#ifdef IP_HDRINCL
5082 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IP_TOS
5085 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IP_TTL
5088 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IP_RECVOPTS
5091 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IP_RECVRETOPTS
5094 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IP_RECVDSTADDR
5097 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IP_RETOPTS
5100 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IP_MULTICAST_IF
5103 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IP_MULTICAST_TTL
5106 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IP_MULTICAST_LOOP
5109 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111#ifdef IP_ADD_MEMBERSHIP
5112 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005113#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005114#ifdef IP_DROP_MEMBERSHIP
5115 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005116#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117#ifdef IP_DEFAULT_MULTICAST_TTL
5118 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5119 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005120#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121#ifdef IP_DEFAULT_MULTICAST_LOOP
5122 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5123 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005124#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005125#ifdef IP_MAX_MEMBERSHIPS
5126 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005127#endif
5128
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5130#ifdef IPV6_JOIN_GROUP
5131 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005132#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005133#ifdef IPV6_LEAVE_GROUP
5134 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005135#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005136#ifdef IPV6_MULTICAST_HOPS
5137 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005138#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139#ifdef IPV6_MULTICAST_IF
5140 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005141#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005142#ifdef IPV6_MULTICAST_LOOP
5143 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005144#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005145#ifdef IPV6_UNICAST_HOPS
5146 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005147#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005149#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005150 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005151#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005152 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005153#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005154 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005155#endif
5156#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005157 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005158#endif
5159#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005160 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005161#endif
5162#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005164#endif
5165#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005166 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005167#endif
5168#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005169 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005170#endif
5171#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005172 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005173#endif
5174#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005176#endif
5177#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005179#endif
5180#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005182#endif
5183#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005184 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005185#endif
5186#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005187 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005188#endif
5189#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005190 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005191#endif
5192#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005194#endif
5195#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005196 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005197#endif
5198#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005199 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005200#endif
5201#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005202 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005203#endif
5204#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005205 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005206#endif
5207#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005208 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005209#endif
5210#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005211 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005212#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005213
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005214 /* TCP options */
5215#ifdef TCP_NODELAY
5216 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef TCP_MAXSEG
5219 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef TCP_CORK
5222 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef TCP_KEEPIDLE
5225 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227#ifdef TCP_KEEPINTVL
5228 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005229#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005230#ifdef TCP_KEEPCNT
5231 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005232#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233#ifdef TCP_SYNCNT
5234 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef TCP_LINGER2
5237 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239#ifdef TCP_DEFER_ACCEPT
5240 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005241#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005242#ifdef TCP_WINDOW_CLAMP
5243 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005244#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005245#ifdef TCP_INFO
5246 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005247#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005248#ifdef TCP_QUICKACK
5249 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005250#endif
5251
Guido van Rossum09be4091999-08-09 14:40:40 +00005252
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005253 /* IPX options */
5254#ifdef IPX_TYPE
5255 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005256#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005257
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005258 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005259#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005260 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005261#endif
5262#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005263 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005264#endif
5265#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005266 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005267#endif
5268#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005269 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005270#endif
5271#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005272 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005273#endif
5274#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005275 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005276#endif
5277#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005278 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005279#endif
5280#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005281 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005282#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005283#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005284 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005285#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005286#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005287 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005288#endif
5289#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005290 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005291#endif
5292#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005293 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005294#endif
5295#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005296 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005297#endif
5298#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005299 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005300#endif
5301#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005302 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005303#endif
5304#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005305 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005306#endif
5307#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005308 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005309#endif
5310#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005311 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005312#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005313#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005314 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005315#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005316#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005317 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005318#endif
5319#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005320 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005321#endif
5322#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005323 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005324#endif
5325#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005326 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005327#endif
5328#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005329 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005330#endif
5331#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005332 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005333#endif
5334#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005335 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005336#endif
5337#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005338 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005339#endif
5340#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005341 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005342#endif
5343#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005344 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005345#endif
5346#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005347 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005348#endif
5349#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005350 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005351#endif
5352#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005353 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005354#endif
5355
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005356 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005357#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005358 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005359#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005360 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005361#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005362 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005363#endif
5364#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005365 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005366#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005368#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005369 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005370#endif
5371#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005372 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005373#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005374 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005375#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005376 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005377#endif
5378
Christian Heimes04ae9162008-01-04 15:23:30 +00005379#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005380 {
5381 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5382 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5383 int i;
5384 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5385 PyObject *tmp;
5386 tmp = PyLong_FromUnsignedLong(codes[i]);
5387 if (tmp == NULL)
5388 return;
5389 PyModule_AddObject(m, names[i], tmp);
5390 }
5391 }
5392 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5393 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5394 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005395#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005396 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005397#endif
5398#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005399 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005400#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005401#endif /* _MSTCPIP_ */
5402
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005404#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005405 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005406#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005407}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005408
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005409
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005410#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005411#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005412
5413/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005414/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005415
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005416int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005417inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005418{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005419 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005420#if (SIZEOF_INT != 4)
5421#error "Not sure if in_addr_t exists and int is not 32-bits."
5422#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005423 unsigned int packed_addr;
5424 packed_addr = inet_addr(src);
5425 if (packed_addr == INADDR_NONE)
5426 return 0;
5427 memcpy(dst, &packed_addr, 4);
5428 return 1;
5429 }
5430 /* Should set errno to EAFNOSUPPORT */
5431 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005432}
5433
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005434const char *
5435inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005436{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005437 if (af == AF_INET) {
5438 struct in_addr packed_addr;
5439 if (size < 16)
5440 /* Should set errno to ENOSPC. */
5441 return NULL;
5442 memcpy(&packed_addr, src, sizeof(packed_addr));
5443 return strncpy(dst, inet_ntoa(packed_addr), size);
5444 }
5445 /* Should set errno to EAFNOSUPPORT */
5446 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005447}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005448
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005449#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005450#endif