blob: 76d860cac50e81b3744a12d9b47478373350346c [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
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000459#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
460/* Platform can select file descriptors beyond FD_SETSIZE */
461#define IS_SELECTABLE(s) 1
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000462#elif defined(HAVE_POLL)
463/* Instead of select(), we'll use poll() since poll() works on any fd. */
464#define IS_SELECTABLE(s) 1
465/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000466#else
467/* POSIX says selecting file descriptors beyond FD_SETSIZE
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000468 has undefined behaviour. If there's no timeout left, we don't have to
469 call select, so it's a safe, little white lie. */
470#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000471#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000472
473static PyObject*
474select_error(void)
475{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000476 PyErr_SetString(socket_error, "unable to select on socket");
477 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000478}
479
Guido van Rossum30a685f1991-06-27 15:51:29 +0000480/* Convenience function to raise an error according to errno
481 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000482
Guido van Rossum73624e91994-10-10 17:59:00 +0000483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000484set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000486#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000487 int err_no = WSAGetLastError();
488 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
489 recognizes the error codes used by both GetLastError() and
490 WSAGetLastError */
491 if (err_no)
492 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000493#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000494
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000495#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000496 if (sock_errno() != NO_ERROR) {
497 APIRET rc;
498 ULONG msglen;
499 char outbuf[100];
500 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000501
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000502 /* Retrieve socket-related error message from MPTN.MSG file */
503 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
504 myerrorcode - SOCBASEERR + 26,
505 "mptn.msg",
506 &msglen);
507 if (rc == NO_ERROR) {
508 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000509
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000510 /* OS/2 doesn't guarantee a terminator */
511 outbuf[msglen] = '\0';
512 if (strlen(outbuf) > 0) {
513 /* If non-empty msg, trim CRLF */
514 char *lastc = &outbuf[ strlen(outbuf)-1 ];
515 while (lastc > outbuf &&
516 isspace(Py_CHARMASK(*lastc))) {
517 /* Trim trailing whitespace (CRLF) */
518 *lastc-- = '\0';
519 }
520 }
521 v = Py_BuildValue("(is)", myerrorcode, outbuf);
522 if (v != NULL) {
523 PyErr_SetObject(socket_error, v);
524 Py_DECREF(v);
525 }
526 return NULL;
527 }
528 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000529#endif
530
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000531#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 if (_inet_error.errnum != NULL) {
533 PyObject *v;
534 v = Py_BuildValue("(is)", errno, _inet_err());
535 if (v != NULL) {
536 PyErr_SetObject(socket_error, v);
537 Py_DECREF(v);
538 }
539 return NULL;
540 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000541#endif
542
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000543 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544}
545
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000548set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000550 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551
552#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000554#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000555 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000557 if (v != NULL) {
558 PyErr_SetObject(socket_herror, v);
559 Py_DECREF(v);
560 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563}
564
565
566static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000567set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570
Martin v. Löwis272cb402002-03-01 08:31:07 +0000571#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000572 /* EAI_SYSTEM is not available on Windows XP. */
573 if (error == EAI_SYSTEM)
574 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000575#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000577#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000578 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000579#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000581#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000582 if (v != NULL) {
583 PyErr_SetObject(socket_gaierror, v);
584 Py_DECREF(v);
585 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588}
589
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000590#ifdef __VMS
591/* Function to send in segments */
592static int
593sendsegmented(int sock_fd, char *buf, int len, int flags)
594{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000595 int n = 0;
596 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000597
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000598 while (remaining > 0) {
599 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000600
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000601 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
602 n = send(sock_fd, buf, segment, flags);
603 if (n < 0) {
604 return n;
605 }
606 remaining -= segment;
607 buf += segment;
608 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000609
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000610 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000611}
612#endif
613
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000614/* Function to perform the setting of socket blocking mode
615 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000616static int
617internal_setblocking(PySocketSockObject *s, int block)
618{
619#ifndef RISCOS
620#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000621 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622#endif
623#endif
624
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000625 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000627 block = !block;
628 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
629 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630#else
631#ifndef RISCOS
632#ifndef MS_WINDOWS
633#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 block = !block;
635 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000636#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 block = !block;
638 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000639#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000640 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
641 if (block)
642 delay_flag &= (~O_NONBLOCK);
643 else
644 delay_flag |= O_NONBLOCK;
645 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646#endif /* !PYOS_OS2 */
647#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 block = !block;
649 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000651#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000652 block = !block;
653 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000655#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000658 /* Since these don't return anything */
659 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660}
661
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000662/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000663 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000664 This does not raise an exception; we'll let our caller do that
665 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000666 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000667static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000668internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000670 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000671
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000672 /* Nothing to do unless we're in timeout mode (not non-blocking) */
673 if (s->sock_timeout <= 0.0)
674 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000675
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000676 /* Guard against closed socket */
677 if (s->sock_fd < 0)
678 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000679
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 /* Prefer poll, if available, since you can poll() any fd
681 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000682#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000683 {
684 struct pollfd pollfd;
685 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000687 pollfd.fd = s->sock_fd;
688 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000689
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000690 /* s->sock_timeout is in seconds, timeout in ms */
691 timeout = (int)(s->sock_timeout * 1000 + 0.5);
692 n = poll(&pollfd, 1, timeout);
693 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000694#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000695 {
696 /* Construct the arguments to select */
697 fd_set fds;
698 struct timeval tv;
699 tv.tv_sec = (int)s->sock_timeout;
700 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
701 FD_ZERO(&fds);
702 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000703
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 /* See if the socket is ready */
705 if (writing)
706 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
707 else
708 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
709 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000710#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000711
712 if (n < 0)
713 return -1;
714 if (n == 0)
715 return 1;
716 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000717}
718
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000719/* Initialize a new socket object. */
720
Tim Petersa12b4cf2002-07-18 22:38:44 +0000721static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000722
Mark Hammond62b1ab12002-07-23 06:31:15 +0000723PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000724init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000725 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000726{
727#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000728 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000729#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000730 s->sock_fd = fd;
731 s->sock_family = family;
732 s->sock_type = type;
733 s->sock_proto = proto;
734 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000735
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000736 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000737
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000738 if (defaulttimeout >= 0.0)
739 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000740
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000741#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000742 if (taskwindow)
743 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000744#endif
745}
746
747
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748/* Create a new socket object.
749 This just creates the object and initializes it.
750 If the creation fails, return NULL and set an exception (implicit
751 in NEWOBJ()). */
752
Guido van Rossum73624e91994-10-10 17:59:00 +0000753static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000754new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000755{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000756 PySocketSockObject *s;
757 s = (PySocketSockObject *)
758 PyType_GenericNew(&sock_type, NULL, NULL);
759 if (s != NULL)
760 init_sockobject(s, fd, family, type, proto);
761 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762}
763
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764
Guido van Rossum48a680c2001-03-02 06:34:14 +0000765/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000766 thread to be in gethostbyname or getaddrinfo */
767#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
768PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000769#endif
770
771
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772/* Convert a string specifying a host name or one of a few symbolic
773 names to a numeric IP address. This usually calls gethostbyname()
774 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000775 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 an error occurred; then an exception is raised. */
777
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000779setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000781 struct addrinfo hints, *res;
782 int error;
783 int d1, d2, d3, d4;
784 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000786 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
787 if (name[0] == '\0') {
788 int siz;
789 memset(&hints, 0, sizeof(hints));
790 hints.ai_family = af;
791 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
792 hints.ai_flags = AI_PASSIVE;
793 Py_BEGIN_ALLOW_THREADS
794 ACQUIRE_GETADDRINFO_LOCK
795 error = getaddrinfo(NULL, "0", &hints, &res);
796 Py_END_ALLOW_THREADS
797 /* We assume that those thread-unsafe getaddrinfo() versions
798 *are* safe regarding their return value, ie. that a
799 subsequent call to getaddrinfo() does not destroy the
800 outcome of the first call. */
801 RELEASE_GETADDRINFO_LOCK
802 if (error) {
803 set_gaierror(error);
804 return -1;
805 }
806 switch (res->ai_family) {
807 case AF_INET:
808 siz = 4;
809 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000810#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 case AF_INET6:
812 siz = 16;
813 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000814#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000815 default:
816 freeaddrinfo(res);
817 PyErr_SetString(socket_error,
818 "unsupported address family");
819 return -1;
820 }
821 if (res->ai_next) {
822 freeaddrinfo(res);
823 PyErr_SetString(socket_error,
824 "wildcard resolved to multiple address");
825 return -1;
826 }
827 if (res->ai_addrlen < addr_ret_size)
828 addr_ret_size = res->ai_addrlen;
829 memcpy(addr_ret, res->ai_addr, addr_ret_size);
830 freeaddrinfo(res);
831 return siz;
832 }
833 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
834 struct sockaddr_in *sin;
835 if (af != AF_INET && af != AF_UNSPEC) {
836 PyErr_SetString(socket_error,
837 "address family mismatched");
838 return -1;
839 }
840 sin = (struct sockaddr_in *)addr_ret;
841 memset((void *) sin, '\0', sizeof(*sin));
842 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000844 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000845#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000846 sin->sin_addr.s_addr = INADDR_BROADCAST;
847 return sizeof(sin->sin_addr);
848 }
849 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
850 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
851 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
852 struct sockaddr_in *sin;
853 sin = (struct sockaddr_in *)addr_ret;
854 sin->sin_addr.s_addr = htonl(
855 ((long) d1 << 24) | ((long) d2 << 16) |
856 ((long) d3 << 8) | ((long) d4 << 0));
857 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000858#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000859 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000860#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000861 return 4;
862 }
863 memset(&hints, 0, sizeof(hints));
864 hints.ai_family = af;
865 Py_BEGIN_ALLOW_THREADS
866 ACQUIRE_GETADDRINFO_LOCK
867 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000868#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000869 if (error == EAI_NONAME && af == AF_UNSPEC) {
870 /* On Tru64 V5.1, numeric-to-addr conversion fails
871 if no address family is given. Assume IPv4 for now.*/
872 hints.ai_family = AF_INET;
873 error = getaddrinfo(name, NULL, &hints, &res);
874 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000875#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000876 Py_END_ALLOW_THREADS
877 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
878 if (error) {
879 set_gaierror(error);
880 return -1;
881 }
882 if (res->ai_addrlen < addr_ret_size)
883 addr_ret_size = res->ai_addrlen;
884 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
885 freeaddrinfo(res);
886 switch (addr_ret->sa_family) {
887 case AF_INET:
888 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000889#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000890 case AF_INET6:
891 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000892#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000893 default:
894 PyErr_SetString(socket_error, "unknown address family");
895 return -1;
896 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897}
898
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900/* Create a string object representing an IP address.
901 This is always a string of the form 'dd.dd.dd.dd' (with variable
902 size numbers). */
903
Guido van Rossum73624e91994-10-10 17:59:00 +0000904static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000905makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000907 char buf[NI_MAXHOST];
908 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000909
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000910 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
911 NI_NUMERICHOST);
912 if (error) {
913 set_gaierror(error);
914 return NULL;
915 }
916 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917}
918
919
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000920#ifdef USE_BLUETOOTH
921/* Convert a string representation of a Bluetooth address into a numeric
922 address. Returns the length (6), or raises an exception and returns -1 if
923 an error occurred. */
924
925static int
926setbdaddr(char *name, bdaddr_t *bdaddr)
927{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 unsigned int b0, b1, b2, b3, b4, b5;
929 char ch;
930 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000931
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000932 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
933 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
934 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
935 bdaddr->b[0] = b0;
936 bdaddr->b[1] = b1;
937 bdaddr->b[2] = b2;
938 bdaddr->b[3] = b3;
939 bdaddr->b[4] = b4;
940 bdaddr->b[5] = b5;
941 return 6;
942 } else {
943 PyErr_SetString(socket_error, "bad bluetooth address");
944 return -1;
945 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000946}
947
948/* Create a string representation of the Bluetooth address. This is always a
949 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
950 value (zero padded if necessary). */
951
952static PyObject *
953makebdaddr(bdaddr_t *bdaddr)
954{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000955 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000956
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000957 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
958 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
959 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
960 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000961}
962#endif
963
964
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965/* Create an object representing the given socket address,
966 suitable for passing it back to bind(), connect() etc.
967 The family field of the sockaddr structure is inspected
968 to determine what kind of address it really is. */
969
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000971static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000972makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000974 if (addrlen == 0) {
975 /* No address -- may be recvfrom() from known socket */
976 Py_INCREF(Py_None);
977 return Py_None;
978 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000979
Guido van Rossumbcc20741998-08-04 22:53:56 +0000980#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000981 /* XXX: BeOS version of accept() doesn't set family correctly */
982 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000983#endif
984
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000985 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000987 case AF_INET:
988 {
989 struct sockaddr_in *a;
990 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
991 PyObject *ret = NULL;
992 if (addrobj) {
993 a = (struct sockaddr_in *)addr;
994 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
995 Py_DECREF(addrobj);
996 }
997 return ret;
998 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001000#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001001 case AF_UNIX:
1002 {
1003 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001004#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001005 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1006 addrlen -= offsetof(struct sockaddr_un, sun_path);
1007 return PyString_FromStringAndSize(a->sun_path,
1008 addrlen);
1009 }
1010 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001011#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001012 {
1013 /* regular NULL-terminated string */
1014 return PyString_FromString(a->sun_path);
1015 }
1016 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001017#endif /* AF_UNIX */
1018
Martin v. Löwis11017b12006-01-14 18:12:57 +00001019#if defined(AF_NETLINK)
1020 case AF_NETLINK:
1021 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001022 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1023 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001024 }
1025#endif /* AF_NETLINK */
1026
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001027#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001028 case AF_INET6:
1029 {
1030 struct sockaddr_in6 *a;
1031 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1032 PyObject *ret = NULL;
1033 if (addrobj) {
1034 a = (struct sockaddr_in6 *)addr;
1035 ret = Py_BuildValue("Oiii",
1036 addrobj,
1037 ntohs(a->sin6_port),
1038 a->sin6_flowinfo,
1039 a->sin6_scope_id);
1040 Py_DECREF(addrobj);
1041 }
1042 return ret;
1043 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001044#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001045
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001046#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001047 case AF_BLUETOOTH:
1048 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001049
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001050 case BTPROTO_L2CAP:
1051 {
1052 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1053 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1054 PyObject *ret = NULL;
1055 if (addrobj) {
1056 ret = Py_BuildValue("Oi",
1057 addrobj,
1058 _BT_L2_MEMB(a, psm));
1059 Py_DECREF(addrobj);
1060 }
1061 return ret;
1062 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001063
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001064 case BTPROTO_RFCOMM:
1065 {
1066 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1067 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1068 PyObject *ret = NULL;
1069 if (addrobj) {
1070 ret = Py_BuildValue("Oi",
1071 addrobj,
1072 _BT_RC_MEMB(a, channel));
1073 Py_DECREF(addrobj);
1074 }
1075 return ret;
1076 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001078 case BTPROTO_HCI:
1079 {
1080 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001081#if defined(__NetBSD__) || defined(__DragonFly__)
1082 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1083#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001084 PyObject *ret = NULL;
1085 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1086 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001087#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001088 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001089
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001090#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001091 case BTPROTO_SCO:
1092 {
1093 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1094 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1095 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001096#endif
1097
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001098 default:
1099 PyErr_SetString(PyExc_ValueError,
1100 "Unknown Bluetooth protocol");
1101 return NULL;
1102 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103#endif
1104
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001105#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001106 case AF_PACKET:
1107 {
1108 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1109 char *ifname = "";
1110 struct ifreq ifr;
1111 /* need to look up interface name give index */
1112 if (a->sll_ifindex) {
1113 ifr.ifr_ifindex = a->sll_ifindex;
1114 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1115 ifname = ifr.ifr_name;
1116 }
1117 return Py_BuildValue("shbhs#",
1118 ifname,
1119 ntohs(a->sll_protocol),
1120 a->sll_pkttype,
1121 a->sll_hatype,
1122 a->sll_addr,
1123 a->sll_halen);
1124 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001125#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001126
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001127#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001128 case AF_TIPC:
1129 {
1130 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1131 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1132 return Py_BuildValue("IIIII",
1133 a->addrtype,
1134 a->addr.nameseq.type,
1135 a->addr.nameseq.lower,
1136 a->addr.nameseq.upper,
1137 a->scope);
1138 } else if (a->addrtype == TIPC_ADDR_NAME) {
1139 return Py_BuildValue("IIIII",
1140 a->addrtype,
1141 a->addr.name.name.type,
1142 a->addr.name.name.instance,
1143 a->addr.name.name.instance,
1144 a->scope);
1145 } else if (a->addrtype == TIPC_ADDR_ID) {
1146 return Py_BuildValue("IIIII",
1147 a->addrtype,
1148 a->addr.id.node,
1149 a->addr.id.ref,
1150 0,
1151 a->scope);
1152 } else {
1153 PyErr_SetString(PyExc_ValueError,
1154 "Invalid address type");
1155 return NULL;
1156 }
1157 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001158#endif
1159
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001160 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001162 default:
1163 /* If we don't know the address family, don't raise an
1164 exception -- return it as a tuple. */
1165 return Py_BuildValue("is#",
1166 addr->sa_family,
1167 addr->sa_data,
1168 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001169
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001170 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171}
1172
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173
1174/* Parse a socket address argument according to the socket object's
1175 address family. Return 1 if the address was in the proper format,
1176 0 of not. The address is returned through addr_ret, its length
1177 through len_ret. */
1178
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001179static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001180getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001181 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001183 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001185#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001186 case AF_UNIX:
1187 {
1188 struct sockaddr_un* addr;
1189 char *path;
1190 int len;
1191 if (!PyArg_Parse(args, "t#", &path, &len))
1192 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001193
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001194 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001195#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001196 if (len > 0 && path[0] == 0) {
1197 /* Linux abstract namespace extension */
1198 if (len > sizeof addr->sun_path) {
1199 PyErr_SetString(socket_error,
1200 "AF_UNIX path too long");
1201 return 0;
1202 }
1203 }
1204 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001205#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001206 {
1207 /* regular NULL-terminated string */
1208 if (len >= sizeof addr->sun_path) {
1209 PyErr_SetString(socket_error,
1210 "AF_UNIX path too long");
1211 return 0;
1212 }
1213 addr->sun_path[len] = 0;
1214 }
1215 addr->sun_family = s->sock_family;
1216 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001217#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001218 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001219#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001220 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001221#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001222 return 1;
1223 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001224#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225
Martin v. Löwis11017b12006-01-14 18:12:57 +00001226#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001227 case AF_NETLINK:
1228 {
1229 struct sockaddr_nl* addr;
1230 int pid, groups;
1231 addr = (struct sockaddr_nl *)addr_ret;
1232 if (!PyTuple_Check(args)) {
1233 PyErr_Format(
1234 PyExc_TypeError,
1235 "getsockaddrarg: "
1236 "AF_NETLINK address must be tuple, not %.500s",
1237 Py_TYPE(args)->tp_name);
1238 return 0;
1239 }
1240 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1241 return 0;
1242 addr->nl_family = AF_NETLINK;
1243 addr->nl_pid = pid;
1244 addr->nl_groups = groups;
1245 *len_ret = sizeof(*addr);
1246 return 1;
1247 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001248#endif
1249
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 case AF_INET:
1251 {
1252 struct sockaddr_in* addr;
1253 char *host;
1254 int port, result;
1255 if (!PyTuple_Check(args)) {
1256 PyErr_Format(
1257 PyExc_TypeError,
1258 "getsockaddrarg: "
1259 "AF_INET address must be tuple, not %.500s",
1260 Py_TYPE(args)->tp_name);
1261 return 0;
1262 }
1263 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1264 "idna", &host, &port))
1265 return 0;
1266 addr=(struct sockaddr_in*)addr_ret;
1267 result = setipaddr(host, (struct sockaddr *)addr,
1268 sizeof(*addr), AF_INET);
1269 PyMem_Free(host);
1270 if (result < 0)
1271 return 0;
1272 if (port < 0 || port > 0xffff) {
1273 PyErr_SetString(
1274 PyExc_OverflowError,
1275 "getsockaddrarg: port must be 0-65535.");
1276 return 0;
1277 }
1278 addr->sin_family = AF_INET;
1279 addr->sin_port = htons((short)port);
1280 *len_ret = sizeof *addr;
1281 return 1;
1282 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001284#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001285 case AF_INET6:
1286 {
1287 struct sockaddr_in6* addr;
1288 char *host;
1289 int port, flowinfo, scope_id, result;
1290 flowinfo = scope_id = 0;
1291 if (!PyTuple_Check(args)) {
1292 PyErr_Format(
1293 PyExc_TypeError,
1294 "getsockaddrarg: "
1295 "AF_INET6 address must be tuple, not %.500s",
1296 Py_TYPE(args)->tp_name);
1297 return 0;
1298 }
1299 if (!PyArg_ParseTuple(args, "eti|ii",
1300 "idna", &host, &port, &flowinfo,
1301 &scope_id)) {
1302 return 0;
1303 }
1304 addr = (struct sockaddr_in6*)addr_ret;
1305 result = setipaddr(host, (struct sockaddr *)addr,
1306 sizeof(*addr), AF_INET6);
1307 PyMem_Free(host);
1308 if (result < 0)
1309 return 0;
1310 if (port < 0 || port > 0xffff) {
1311 PyErr_SetString(
1312 PyExc_OverflowError,
1313 "getsockaddrarg: port must be 0-65535.");
1314 return 0;
1315 }
1316 addr->sin6_family = s->sock_family;
1317 addr->sin6_port = htons((short)port);
1318 addr->sin6_flowinfo = flowinfo;
1319 addr->sin6_scope_id = scope_id;
1320 *len_ret = sizeof *addr;
1321 return 1;
1322 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001323#endif
1324
Hye-Shik Chang81268602004-02-02 06:05:24 +00001325#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001326 case AF_BLUETOOTH:
1327 {
1328 switch (s->sock_proto) {
1329 case BTPROTO_L2CAP:
1330 {
1331 struct sockaddr_l2 *addr;
1332 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001333
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001334 addr = (struct sockaddr_l2 *)addr_ret;
1335 memset(addr, 0, sizeof(struct sockaddr_l2));
1336 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1337 if (!PyArg_ParseTuple(args, "si", &straddr,
1338 &_BT_L2_MEMB(addr, psm))) {
1339 PyErr_SetString(socket_error, "getsockaddrarg: "
1340 "wrong format");
1341 return 0;
1342 }
1343 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1344 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001346 *len_ret = sizeof *addr;
1347 return 1;
1348 }
1349 case BTPROTO_RFCOMM:
1350 {
1351 struct sockaddr_rc *addr;
1352 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001353
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001354 addr = (struct sockaddr_rc *)addr_ret;
1355 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1356 if (!PyArg_ParseTuple(args, "si", &straddr,
1357 &_BT_RC_MEMB(addr, channel))) {
1358 PyErr_SetString(socket_error, "getsockaddrarg: "
1359 "wrong format");
1360 return 0;
1361 }
1362 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1363 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001364
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001365 *len_ret = sizeof *addr;
1366 return 1;
1367 }
1368 case BTPROTO_HCI:
1369 {
1370 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001371#if defined(__NetBSD__) || defined(__DragonFly__)
1372 char *straddr = PyBytes_AS_STRING(args);
1373
1374 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1375 if (straddr == NULL) {
1376 PyErr_SetString(socket_error, "getsockaddrarg: "
1377 "wrong format");
1378 return 0;
1379 }
1380 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1381 return 0;
1382#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001383 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1384 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1385 PyErr_SetString(socket_error, "getsockaddrarg: "
1386 "wrong format");
1387 return 0;
1388 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001389#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001390 *len_ret = sizeof *addr;
1391 return 1;
1392 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001393#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001394 case BTPROTO_SCO:
1395 {
1396 struct sockaddr_sco *addr;
1397 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001398
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001399 addr = (struct sockaddr_sco *)addr_ret;
1400 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1401 straddr = PyString_AsString(args);
1402 if (straddr == NULL) {
1403 PyErr_SetString(socket_error, "getsockaddrarg: "
1404 "wrong format");
1405 return 0;
1406 }
1407 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1408 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001410 *len_ret = sizeof *addr;
1411 return 1;
1412 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001413#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001414 default:
1415 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1416 return 0;
1417 }
1418 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001419#endif
1420
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001421#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001422 case AF_PACKET:
1423 {
1424 struct sockaddr_ll* addr;
1425 struct ifreq ifr;
1426 char *interfaceName;
1427 int protoNumber;
1428 int hatype = 0;
1429 int pkttype = 0;
1430 char *haddr = NULL;
1431 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001432
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001433 if (!PyTuple_Check(args)) {
1434 PyErr_Format(
1435 PyExc_TypeError,
1436 "getsockaddrarg: "
1437 "AF_PACKET address must be tuple, not %.500s",
1438 Py_TYPE(args)->tp_name);
1439 return 0;
1440 }
1441 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1442 &protoNumber, &pkttype, &hatype,
1443 &haddr, &halen))
1444 return 0;
1445 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1446 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1447 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1448 s->errorhandler();
1449 return 0;
1450 }
1451 if (halen > 8) {
1452 PyErr_SetString(PyExc_ValueError,
1453 "Hardware address must be 8 bytes or less");
1454 return 0;
1455 }
1456 if (protoNumber < 0 || protoNumber > 0xffff) {
1457 PyErr_SetString(
1458 PyExc_OverflowError,
1459 "getsockaddrarg: protoNumber must be 0-65535.");
1460 return 0;
1461 }
1462 addr = (struct sockaddr_ll*)addr_ret;
1463 addr->sll_family = AF_PACKET;
1464 addr->sll_protocol = htons((short)protoNumber);
1465 addr->sll_ifindex = ifr.ifr_ifindex;
1466 addr->sll_pkttype = pkttype;
1467 addr->sll_hatype = hatype;
1468 if (halen != 0) {
1469 memcpy(&addr->sll_addr, haddr, halen);
1470 }
1471 addr->sll_halen = halen;
1472 *len_ret = sizeof *addr;
1473 return 1;
1474 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001475#endif
1476
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001477#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001478 case AF_TIPC:
1479 {
1480 unsigned int atype, v1, v2, v3;
1481 unsigned int scope = TIPC_CLUSTER_SCOPE;
1482 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001483
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001484 if (!PyTuple_Check(args)) {
1485 PyErr_Format(
1486 PyExc_TypeError,
1487 "getsockaddrarg: "
1488 "AF_TIPC address must be tuple, not %.500s",
1489 Py_TYPE(args)->tp_name);
1490 return 0;
1491 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001492
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001493 if (!PyArg_ParseTuple(args,
1494 "IIII|I;Invalid TIPC address format",
1495 &atype, &v1, &v2, &v3, &scope))
1496 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001498 addr = (struct sockaddr_tipc *) addr_ret;
1499 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001500
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001501 addr->family = AF_TIPC;
1502 addr->scope = scope;
1503 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001504
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001505 if (atype == TIPC_ADDR_NAMESEQ) {
1506 addr->addr.nameseq.type = v1;
1507 addr->addr.nameseq.lower = v2;
1508 addr->addr.nameseq.upper = v3;
1509 } else if (atype == TIPC_ADDR_NAME) {
1510 addr->addr.name.name.type = v1;
1511 addr->addr.name.name.instance = v2;
1512 } else if (atype == TIPC_ADDR_ID) {
1513 addr->addr.id.node = v1;
1514 addr->addr.id.ref = v2;
1515 } else {
1516 /* Shouldn't happen */
1517 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1518 return 0;
1519 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001520
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001521 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001522
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001523 return 1;
1524 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001525#endif
1526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001527 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001528
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001529 default:
1530 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1531 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001533 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001534}
1535
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536
Guido van Rossum48a680c2001-03-02 06:34:14 +00001537/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001538 Return 1 if the family is known, 0 otherwise. The length is returned
1539 through len_ret. */
1540
1541static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001542getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001543{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001544 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001545
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001546#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001547 case AF_UNIX:
1548 {
1549 *len_ret = sizeof (struct sockaddr_un);
1550 return 1;
1551 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001552#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001553#if defined(AF_NETLINK)
1554 case AF_NETLINK:
1555 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001556 *len_ret = sizeof (struct sockaddr_nl);
1557 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001558 }
1559#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001560
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001561 case AF_INET:
1562 {
1563 *len_ret = sizeof (struct sockaddr_in);
1564 return 1;
1565 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001566
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001567#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001568 case AF_INET6:
1569 {
1570 *len_ret = sizeof (struct sockaddr_in6);
1571 return 1;
1572 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001573#endif
1574
Hye-Shik Chang81268602004-02-02 06:05:24 +00001575#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001576 case AF_BLUETOOTH:
1577 {
1578 switch(s->sock_proto)
1579 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001580
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001581 case BTPROTO_L2CAP:
1582 *len_ret = sizeof (struct sockaddr_l2);
1583 return 1;
1584 case BTPROTO_RFCOMM:
1585 *len_ret = sizeof (struct sockaddr_rc);
1586 return 1;
1587 case BTPROTO_HCI:
1588 *len_ret = sizeof (struct sockaddr_hci);
1589 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001590#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001591 case BTPROTO_SCO:
1592 *len_ret = sizeof (struct sockaddr_sco);
1593 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001594#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001595 default:
1596 PyErr_SetString(socket_error, "getsockaddrlen: "
1597 "unknown BT protocol");
1598 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001599
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001600 }
1601 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001602#endif
1603
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001604#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001605 case AF_PACKET:
1606 {
1607 *len_ret = sizeof (struct sockaddr_ll);
1608 return 1;
1609 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001610#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001611
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001612#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001613 case AF_TIPC:
1614 {
1615 *len_ret = sizeof (struct sockaddr_tipc);
1616 return 1;
1617 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001618#endif
1619
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001620 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001622 default:
1623 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1624 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001625
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001626 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001627}
1628
1629
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630/* s.accept() method */
1631
Guido van Rossum73624e91994-10-10 17:59:00 +00001632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001633sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001634{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001635 sock_addr_t addrbuf;
1636 SOCKET_T newfd;
1637 socklen_t addrlen;
1638 PyObject *sock = NULL;
1639 PyObject *addr = NULL;
1640 PyObject *res = NULL;
1641 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001642
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001643 if (!getsockaddrlen(s, &addrlen))
1644 return NULL;
1645 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001646
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001647#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001648 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001649#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001650 newfd = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001651#endif
1652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001653 if (!IS_SELECTABLE(s))
1654 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 Py_BEGIN_ALLOW_THREADS
1657 timeout = internal_select(s, 0);
1658 if (!timeout)
1659 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1660 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001662 if (timeout == 1) {
1663 PyErr_SetString(socket_timeout, "timed out");
1664 return NULL;
1665 }
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001666
Fred Drakea04eaad2000-06-30 02:46:07 +00001667#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001668 if (newfd == INVALID_SOCKET)
Fred Drakea04eaad2000-06-30 02:46:07 +00001669#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001671#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001672 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001673
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001674 /* Create the new object with unspecified family,
1675 to avoid calls to bind() etc. on it. */
1676 sock = (PyObject *) new_sockobject(newfd,
1677 s->sock_family,
1678 s->sock_type,
1679 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 if (sock == NULL) {
1682 SOCKETCLOSE(newfd);
1683 goto finally;
1684 }
1685 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1686 addrlen, s->sock_proto);
1687 if (addr == NULL)
1688 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001689
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001690 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001691
Guido van Rossum67f7a382002-06-06 21:08:16 +00001692finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001693 Py_XDECREF(sock);
1694 Py_XDECREF(addr);
1695 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001696}
1697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001698PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001699"accept() -> (socket object, address info)\n\
1700\n\
1701Wait for an incoming connection. Return a new socket representing the\n\
1702connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001703info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001704
Guido van Rossum11ba0942002-06-13 15:07:44 +00001705/* s.setblocking(flag) method. Argument:
1706 False -- non-blocking mode; same as settimeout(0)
1707 True -- blocking mode; same as settimeout(None)
1708*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001709
Guido van Rossum73624e91994-10-10 17:59:00 +00001710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001711sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001712{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001713 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001715 block = PyInt_AsLong(arg);
1716 if (block == -1 && PyErr_Occurred())
1717 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001718
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001719 s->sock_timeout = block ? -1.0 : 0.0;
1720 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001721
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001722 Py_INCREF(Py_None);
1723 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001724}
Guido van Rossume4485b01994-09-07 14:32:49 +00001725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001726PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001727"setblocking(flag)\n\
1728\n\
1729Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001730setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001731setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001732
Guido van Rossum11ba0942002-06-13 15:07:44 +00001733/* s.settimeout(timeout) method. Argument:
1734 None -- no timeout, blocking mode; same as setblocking(True)
1735 0.0 -- non-blocking mode; same as setblocking(False)
1736 > 0 -- timeout mode; operations time out after timeout seconds
1737 < 0 -- illegal; raises an exception
1738*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001739static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001740sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001741{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001742 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001743
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001744 if (arg == Py_None)
1745 timeout = -1.0;
1746 else {
1747 timeout = PyFloat_AsDouble(arg);
1748 if (timeout < 0.0) {
1749 if (!PyErr_Occurred())
1750 PyErr_SetString(PyExc_ValueError,
1751 "Timeout value out of range");
1752 return NULL;
1753 }
1754 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 s->sock_timeout = timeout;
1757 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001759 Py_INCREF(Py_None);
1760 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761}
1762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001763PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001764"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001765\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001766Set a timeout on socket operations. 'timeout' can be a float,\n\
1767giving in seconds, or None. Setting a timeout of None disables\n\
1768the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001769Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001770
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001771/* s.gettimeout() method.
1772 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001774sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001775{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001776 if (s->sock_timeout < 0.0) {
1777 Py_INCREF(Py_None);
1778 return Py_None;
1779 }
1780 else
1781 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001782}
1783
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001784PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001785"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001786\n\
1787Returns the timeout in floating seconds associated with socket \n\
1788operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001789operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001790
Guido van Rossum48a680c2001-03-02 06:34:14 +00001791#ifdef RISCOS
1792/* s.sleeptaskw(1 | 0) method */
1793
1794static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001795sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001796{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001797 int block;
1798 block = PyInt_AsLong(arg);
1799 if (block == -1 && PyErr_Occurred())
1800 return NULL;
1801 Py_BEGIN_ALLOW_THREADS
1802 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1803 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001805 Py_INCREF(Py_None);
1806 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001807}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001809"sleeptaskw(flag)\n\
1810\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001811Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001812#endif
1813
1814
Guido van Rossumaee08791992-09-08 09:05:33 +00001815/* s.setsockopt() method.
1816 With an integer third argument, sets an integer option.
1817 With a string third argument, sets an option from a buffer;
1818 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001819
Guido van Rossum73624e91994-10-10 17:59:00 +00001820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001821sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001823 int level;
1824 int optname;
1825 int res;
1826 char *buf;
1827 int buflen;
1828 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001830 if (PyArg_ParseTuple(args, "iii:setsockopt",
1831 &level, &optname, &flag)) {
1832 buf = (char *) &flag;
1833 buflen = sizeof flag;
1834 }
1835 else {
1836 PyErr_Clear();
1837 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1838 &level, &optname, &buf, &buflen))
1839 return NULL;
1840 }
1841 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1842 if (res < 0)
1843 return s->errorhandler();
1844 Py_INCREF(Py_None);
1845 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001846}
1847
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001848PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001849"setsockopt(level, option, value)\n\
1850\n\
1851Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001852The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001853
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001854
Guido van Rossumaee08791992-09-08 09:05:33 +00001855/* s.getsockopt() method.
1856 With two arguments, retrieves an integer option.
1857 With a third integer argument, retrieves a string buffer of that size;
1858 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001859
Guido van Rossum73624e91994-10-10 17:59:00 +00001860static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001861sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001862{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001863 int level;
1864 int optname;
1865 int res;
1866 PyObject *buf;
1867 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001868
Guido van Rossumbcc20741998-08-04 22:53:56 +00001869#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001870 /* We have incomplete socket support. */
1871 PyErr_SetString(socket_error, "getsockopt not supported");
1872 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001873#else
1874
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001875 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1876 &level, &optname, &buflen))
1877 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001878
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001879 if (buflen == 0) {
1880 int flag = 0;
1881 socklen_t flagsize = sizeof flag;
1882 res = getsockopt(s->sock_fd, level, optname,
1883 (void *)&flag, &flagsize);
1884 if (res < 0)
1885 return s->errorhandler();
1886 return PyInt_FromLong(flag);
1887 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001888#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001889 /* socklen_t is unsigned so no negative test is needed,
1890 test buflen == 0 is previously done */
1891 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001892#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001893 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001894#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001895 PyErr_SetString(socket_error,
1896 "getsockopt buflen out of range");
1897 return NULL;
1898 }
1899 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1900 if (buf == NULL)
1901 return NULL;
1902 res = getsockopt(s->sock_fd, level, optname,
1903 (void *)PyString_AS_STRING(buf), &buflen);
1904 if (res < 0) {
1905 Py_DECREF(buf);
1906 return s->errorhandler();
1907 }
1908 _PyString_Resize(&buf, buflen);
1909 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001910#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001911}
1912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001913PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914"getsockopt(level, option[, buffersize]) -> value\n\
1915\n\
1916Get a socket option. See the Unix manual for level and option.\n\
1917If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001918string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001919
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001920
Fred Drake728819a2000-07-01 03:40:12 +00001921/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001922
Guido van Rossum73624e91994-10-10 17:59:00 +00001923static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001924sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001926 sock_addr_t addrbuf;
1927 int addrlen;
1928 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001929
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001930 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1931 return NULL;
1932 Py_BEGIN_ALLOW_THREADS
1933 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1934 Py_END_ALLOW_THREADS
1935 if (res < 0)
1936 return s->errorhandler();
1937 Py_INCREF(Py_None);
1938 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001939}
1940
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001941PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001942"bind(address)\n\
1943\n\
1944Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001945pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001946sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001947
Guido van Rossum30a685f1991-06-27 15:51:29 +00001948
1949/* s.close() method.
1950 Set the file descriptor to -1 so operations tried subsequently
1951 will surely fail. */
1952
Guido van Rossum73624e91994-10-10 17:59:00 +00001953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001954sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001955{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001956 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001957
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001958 if ((fd = s->sock_fd) != -1) {
1959 s->sock_fd = -1;
1960 Py_BEGIN_ALLOW_THREADS
1961 (void) SOCKETCLOSE(fd);
1962 Py_END_ALLOW_THREADS
1963 }
1964 Py_INCREF(Py_None);
1965 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001966}
1967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001969"close()\n\
1970\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001973static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001974internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001975 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001976{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001977 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001978
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001979 timeout = 0;
1980 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001981
1982#ifdef MS_WINDOWS
1983
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001984 if (s->sock_timeout > 0.0) {
1985 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1986 IS_SELECTABLE(s)) {
1987 /* This is a mess. Best solution: trust select */
1988 fd_set fds;
1989 fd_set fds_exc;
1990 struct timeval tv;
1991 tv.tv_sec = (int)s->sock_timeout;
1992 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1993 FD_ZERO(&fds);
1994 FD_SET(s->sock_fd, &fds);
1995 FD_ZERO(&fds_exc);
1996 FD_SET(s->sock_fd, &fds_exc);
1997 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
1998 if (res == 0) {
1999 res = WSAEWOULDBLOCK;
2000 timeout = 1;
2001 } else if (res > 0) {
2002 if (FD_ISSET(s->sock_fd, &fds))
2003 /* The socket is in the writeable set - this
2004 means connected */
2005 res = 0;
2006 else {
2007 /* As per MS docs, we need to call getsockopt()
2008 to get the underlying error */
2009 int res_size = sizeof res;
2010 /* It must be in the exception set */
2011 assert(FD_ISSET(s->sock_fd, &fds_exc));
2012 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2013 (char *)&res, &res_size))
2014 /* getsockopt also clears WSAGetLastError,
2015 so reset it back. */
2016 WSASetLastError(res);
2017 else
2018 res = WSAGetLastError();
2019 }
2020 }
2021 /* else if (res < 0) an error occurred */
2022 }
2023 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002024
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002025 if (res < 0)
2026 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002027
2028#else
2029
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002030 if (s->sock_timeout > 0.0) {
2031 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2032 timeout = internal_select(s, 1);
2033 if (timeout == 0) {
2034 /* Bug #1019808: in case of an EINPROGRESS,
2035 use getsockopt(SO_ERROR) to get the real
2036 error. */
2037 socklen_t res_size = sizeof res;
2038 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2039 SO_ERROR, &res, &res_size);
2040 if (res == EISCONN)
2041 res = 0;
2042 errno = res;
2043 }
2044 else if (timeout == -1) {
2045 res = errno; /* had error */
2046 }
2047 else
2048 res = EWOULDBLOCK; /* timed out */
2049 }
2050 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002051
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002052 if (res < 0)
2053 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002054
2055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002056 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002057
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002058 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002059}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060
Fred Drake728819a2000-07-01 03:40:12 +00002061/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062
Guido van Rossum73624e91994-10-10 17:59:00 +00002063static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002064sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002065{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002066 sock_addr_t addrbuf;
2067 int addrlen;
2068 int res;
2069 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002070
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002071 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2072 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002074 Py_BEGIN_ALLOW_THREADS
2075 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2076 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002078 if (timeout == 1) {
2079 PyErr_SetString(socket_timeout, "timed out");
2080 return NULL;
2081 }
2082 if (res != 0)
2083 return s->errorhandler();
2084 Py_INCREF(Py_None);
2085 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002086}
2087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002088PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002089"connect(address)\n\
2090\n\
2091Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002092is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002093
Guido van Rossum30a685f1991-06-27 15:51:29 +00002094
Fred Drake728819a2000-07-01 03:40:12 +00002095/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002096
2097static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002098sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002099{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002100 sock_addr_t addrbuf;
2101 int addrlen;
2102 int res;
2103 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002104
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002105 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2106 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002108 Py_BEGIN_ALLOW_THREADS
2109 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2110 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002112 /* Signals are not errors (though they may raise exceptions). Adapted
2113 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002114#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 if (res == EINTR && PyErr_CheckSignals())
2116 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002117#endif
2118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002119 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002120}
2121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002123"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002124\n\
2125This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002126instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002127
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002128
Guido van Rossumed233a51992-06-23 09:07:03 +00002129/* s.fileno() method */
2130
Guido van Rossum73624e91994-10-10 17:59:00 +00002131static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002132sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002133{
Fred Drakea04eaad2000-06-30 02:46:07 +00002134#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002135 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002136#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002137 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002138#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002139}
2140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002141PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002142"fileno() -> integer\n\
2143\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002144Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145
Guido van Rossumed233a51992-06-23 09:07:03 +00002146
Guido van Rossumbe32c891996-06-20 16:25:29 +00002147#ifndef NO_DUP
2148/* s.dup() method */
2149
2150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002152{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002153 SOCKET_T newfd;
2154 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002155
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002156 newfd = dup(s->sock_fd);
2157 if (newfd < 0)
2158 return s->errorhandler();
2159 sock = (PyObject *) new_sockobject(newfd,
2160 s->sock_family,
2161 s->sock_type,
2162 s->sock_proto);
2163 if (sock == NULL)
2164 SOCKETCLOSE(newfd);
2165 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002166}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002168PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169"dup() -> socket object\n\
2170\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002171Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002172
Guido van Rossumbe32c891996-06-20 16:25:29 +00002173#endif
2174
2175
Guido van Rossumc89705d1992-11-26 08:54:07 +00002176/* s.getsockname() method */
2177
Guido van Rossum73624e91994-10-10 17:59:00 +00002178static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002179sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002180{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002181 sock_addr_t addrbuf;
2182 int res;
2183 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002184
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002185 if (!getsockaddrlen(s, &addrlen))
2186 return NULL;
2187 memset(&addrbuf, 0, addrlen);
2188 Py_BEGIN_ALLOW_THREADS
2189 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2190 Py_END_ALLOW_THREADS
2191 if (res < 0)
2192 return s->errorhandler();
2193 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2194 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002195}
2196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002197PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002198"getsockname() -> address info\n\
2199\n\
2200Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002201info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002202
Guido van Rossumc89705d1992-11-26 08:54:07 +00002203
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002204#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002205/* s.getpeername() method */
2206
Guido van Rossum73624e91994-10-10 17:59:00 +00002207static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002208sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002209{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002210 sock_addr_t addrbuf;
2211 int res;
2212 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002213
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002214 if (!getsockaddrlen(s, &addrlen))
2215 return NULL;
2216 memset(&addrbuf, 0, addrlen);
2217 Py_BEGIN_ALLOW_THREADS
2218 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2219 Py_END_ALLOW_THREADS
2220 if (res < 0)
2221 return s->errorhandler();
2222 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2223 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002224}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002226PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227"getpeername() -> address info\n\
2228\n\
2229Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002230info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231
Guido van Rossumb6775db1994-08-01 11:34:53 +00002232#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002233
2234
Guido van Rossum30a685f1991-06-27 15:51:29 +00002235/* s.listen(n) method */
2236
Guido van Rossum73624e91994-10-10 17:59:00 +00002237static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002239{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002240 int backlog;
2241 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002242
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002243 backlog = PyInt_AsLong(arg);
2244 if (backlog == -1 && PyErr_Occurred())
2245 return NULL;
2246 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002247 /* To avoid problems on systems that don't allow a negative backlog
2248 * (which doesn't make sense anyway) we force a minimum value of 0. */
2249 if (backlog < 0)
2250 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002251 res = listen(s->sock_fd, backlog);
2252 Py_END_ALLOW_THREADS
2253 if (res < 0)
2254 return s->errorhandler();
2255 Py_INCREF(Py_None);
2256 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002257}
2258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002259PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002260"listen(backlog)\n\
2261\n\
2262Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002263least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2264unaccepted connections that the system will allow before refusing new\n\
2265connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002266
2267
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002268#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002269/* s.makefile(mode) method.
2270 Create a new open file object referring to a dupped version of
2271 the socket's file descriptor. (The dup() call is necessary so
2272 that the open file and socket objects may be closed independent
2273 of each other.)
2274 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2275
Guido van Rossum73624e91994-10-10 17:59:00 +00002276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002277sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002278{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002279 extern int fclose(FILE *);
2280 char *mode = "r";
2281 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002282#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002283 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002284#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002285 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002286#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002287 FILE *fp;
2288 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002289#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002290 char *mode_r = "r";
2291 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002292#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002293
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002294 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2295 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002296#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002297 if (strcmp(mode,"rb") == 0) {
2298 mode = mode_r;
2299 }
2300 else {
2301 if (strcmp(mode,"wb") == 0) {
2302 mode = mode_w;
2303 }
2304 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002305#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002306#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002307 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2308 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002309#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002310 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002311#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002312 {
2313 if (fd >= 0)
2314 SOCKETCLOSE(fd);
2315 return s->errorhandler();
2316 }
2317 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2318 if (f != NULL)
2319 PyFile_SetBufSize(f, bufsize);
2320 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002321}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002323PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002324"makefile([mode[, buffersize]]) -> file object\n\
2325\n\
2326Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002327The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002329#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002330
Martin Blais2856e5f2006-05-26 12:03:27 +00002331/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002332 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002333 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002334 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002335 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002336 * also possible that we return a number of bytes smaller than the request
2337 * bytes.
2338 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002339static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002340sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2341{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002342 ssize_t outlen = -1;
2343 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002344#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002345 int remaining;
2346 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002347#endif
2348
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002349 if (!IS_SELECTABLE(s)) {
2350 select_error();
2351 return -1;
2352 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002353
2354#ifndef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002355 Py_BEGIN_ALLOW_THREADS
2356 timeout = internal_select(s, 0);
2357 if (!timeout)
2358 outlen = recv(s->sock_fd, cbuf, len, flags);
2359 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002361 if (timeout == 1) {
2362 PyErr_SetString(socket_timeout, "timed out");
2363 return -1;
2364 }
2365 if (outlen < 0) {
2366 /* Note: the call to errorhandler() ALWAYS indirectly returned
2367 NULL, so ignore its return value */
2368 s->errorhandler();
2369 return -1;
2370 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002371#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002372 read_buf = cbuf;
2373 remaining = len;
2374 while (remaining != 0) {
2375 unsigned int segment;
2376 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002378 segment = remaining /SEGMENT_SIZE;
2379 if (segment != 0) {
2380 segment = SEGMENT_SIZE;
2381 }
2382 else {
2383 segment = remaining;
2384 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002385
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002386 Py_BEGIN_ALLOW_THREADS
2387 timeout = internal_select(s, 0);
2388 if (!timeout)
2389 nread = recv(s->sock_fd, read_buf, segment, flags);
2390 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002391
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002392 if (timeout == 1) {
2393 PyErr_SetString(socket_timeout, "timed out");
2394 return -1;
2395 }
2396 if (nread < 0) {
2397 s->errorhandler();
2398 return -1;
2399 }
2400 if (nread != remaining) {
2401 read_buf += nread;
2402 break;
2403 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002404
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002405 remaining -= segment;
2406 read_buf += segment;
2407 }
2408 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002409#endif /* !__VMS */
2410
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002411 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002412}
2413
Guido van Rossum48a680c2001-03-02 06:34:14 +00002414
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002415/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002416
Guido van Rossum73624e91994-10-10 17:59:00 +00002417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002419{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002420 int recvlen, flags = 0;
2421 ssize_t outlen;
2422 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2425 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002426
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002427 if (recvlen < 0) {
2428 PyErr_SetString(PyExc_ValueError,
2429 "negative buffersize in recv");
2430 return NULL;
2431 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002433 /* Allocate a new string. */
2434 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2435 if (buf == NULL)
2436 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002437
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002438 /* Call the guts */
2439 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2440 if (outlen < 0) {
2441 /* An error occurred, release the string and return an
2442 error. */
2443 Py_DECREF(buf);
2444 return NULL;
2445 }
2446 if (outlen != recvlen) {
2447 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002448 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002449 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002450 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002451 return NULL;
2452 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002453
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002454 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002455}
2456
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002457PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002458"recv(buffersize[, flags]) -> data\n\
2459\n\
2460Receive up to buffersize bytes from the socket. For the optional flags\n\
2461argument, see the Unix manual. When no data is available, block until\n\
2462at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002463the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002464
Guido van Rossum30a685f1991-06-27 15:51:29 +00002465
Martin Blaisaf2ae722006-06-04 13:49:49 +00002466/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002467
Martin Blais2856e5f2006-05-26 12:03:27 +00002468static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002469sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002470{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002471 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002472
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002473 int recvlen = 0, flags = 0;
2474 ssize_t readlen;
2475 Py_buffer buf;
2476 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002477
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002478 /* Get the buffer's memory */
2479 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2480 &buf, &recvlen, &flags))
2481 return NULL;
2482 buflen = buf.len;
2483 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002485 if (recvlen < 0) {
2486 PyErr_SetString(PyExc_ValueError,
2487 "negative buffersize in recv_into");
2488 goto error;
2489 }
2490 if (recvlen == 0) {
2491 /* If nbytes was not specified, use the buffer's length */
2492 recvlen = buflen;
2493 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002494
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002495 /* Check if the buffer is large enough */
2496 if (buflen < recvlen) {
2497 PyErr_SetString(PyExc_ValueError,
2498 "buffer too small for requested bytes");
2499 goto error;
2500 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002501
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002502 /* Call the guts */
2503 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2504 if (readlen < 0) {
2505 /* Return an error. */
2506 goto error;
2507 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002508
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002509 PyBuffer_Release(&buf);
2510 /* Return the number of bytes read. Note that we do not do anything
2511 special here in the case that readlen < recvlen. */
2512 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002513
2514error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002515 PyBuffer_Release(&buf);
2516 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002517}
2518
Martin Blaisaf2ae722006-06-04 13:49:49 +00002519PyDoc_STRVAR(recv_into_doc,
2520"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002521\n\
2522A version of recv() that stores its data into a buffer rather than creating \n\
2523a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2524is not specified (or 0), receive up to the size available in the given buffer.\n\
2525\n\
2526See recv() for documentation about the flags.");
2527
2528
2529/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002530 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2531 * into a char buffer. If you have any inc/def ref to do to the objects that
2532 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002533 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002534 * that it is also possible that we return a number of bytes smaller than the
2535 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002536 *
2537 * 'addr' is a return value for the address object. Note that you must decref
2538 * it yourself.
2539 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002540static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002541sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002542 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002543{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002544 sock_addr_t addrbuf;
2545 int timeout;
2546 ssize_t n = -1;
2547 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002548
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002549 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002550
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002551 if (!getsockaddrlen(s, &addrlen))
2552 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002553
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002554 if (!IS_SELECTABLE(s)) {
2555 select_error();
2556 return -1;
2557 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002559 Py_BEGIN_ALLOW_THREADS
2560 memset(&addrbuf, 0, addrlen);
2561 timeout = internal_select(s, 0);
2562 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002563#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002564#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002565 n = recvfrom(s->sock_fd, cbuf, len, flags,
2566 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002567#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002568 n = recvfrom(s->sock_fd, cbuf, len, flags,
2569 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002570#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002571#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002572 n = recvfrom(s->sock_fd, cbuf, len, flags,
2573 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002574#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002575 }
2576 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002578 if (timeout == 1) {
2579 PyErr_SetString(socket_timeout, "timed out");
2580 return -1;
2581 }
2582 if (n < 0) {
2583 s->errorhandler();
2584 return -1;
2585 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002586
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002587 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2588 addrlen, s->sock_proto)))
2589 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002590
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002591 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002592}
2593
2594/* s.recvfrom(nbytes [,flags]) method */
2595
2596static PyObject *
2597sock_recvfrom(PySocketSockObject *s, PyObject *args)
2598{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002599 PyObject *buf = NULL;
2600 PyObject *addr = NULL;
2601 PyObject *ret = NULL;
2602 int recvlen, flags = 0;
2603 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002604
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002605 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2606 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002607
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002608 if (recvlen < 0) {
2609 PyErr_SetString(PyExc_ValueError,
2610 "negative buffersize in recvfrom");
2611 return NULL;
2612 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002614 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2615 if (buf == NULL)
2616 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002617
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002618 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2619 recvlen, flags, &addr);
2620 if (outlen < 0) {
2621 goto finally;
2622 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002623
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002624 if (outlen != recvlen) {
2625 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002626 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002627 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002628 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002629 goto finally;
2630 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002631
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002632 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002633
2634finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002635 Py_XDECREF(buf);
2636 Py_XDECREF(addr);
2637 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002638}
2639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002640PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002641"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2642\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002643Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644
Martin Blais2856e5f2006-05-26 12:03:27 +00002645
Martin Blaisaf2ae722006-06-04 13:49:49 +00002646/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002647
2648static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002649sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002650{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002651 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 int recvlen = 0, flags = 0;
2654 ssize_t readlen;
2655 Py_buffer buf;
2656 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002657
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002658 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002659
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002660 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2661 kwlist, &buf,
2662 &recvlen, &flags))
2663 return NULL;
2664 buflen = buf.len;
2665 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002666
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002667 if (recvlen < 0) {
2668 PyErr_SetString(PyExc_ValueError,
2669 "negative buffersize in recvfrom_into");
2670 goto error;
2671 }
2672 if (recvlen == 0) {
2673 /* If nbytes was not specified, use the buffer's length */
2674 recvlen = buflen;
2675 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002676
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002677 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2678 if (readlen < 0) {
2679 /* Return an error */
2680 goto error;
2681 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002682
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002683 PyBuffer_Release(&buf);
2684 /* Return the number of bytes read and the address. Note that we do
2685 not do anything special here in the case that readlen < recvlen. */
2686 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002687
2688error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002689 Py_XDECREF(addr);
2690 PyBuffer_Release(&buf);
2691 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002692}
2693
Martin Blaisaf2ae722006-06-04 13:49:49 +00002694PyDoc_STRVAR(recvfrom_into_doc,
2695"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002696\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002697Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002698
2699
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002700/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002701
Guido van Rossum73624e91994-10-10 17:59:00 +00002702static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002703sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002704{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002705 char *buf;
2706 int len, n = -1, flags = 0, timeout;
2707 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002709 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2710 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002712 if (!IS_SELECTABLE(s)) {
2713 PyBuffer_Release(&pbuf);
2714 return select_error();
2715 }
2716 buf = pbuf.buf;
2717 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002718
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002719 Py_BEGIN_ALLOW_THREADS
2720 timeout = internal_select(s, 1);
2721 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002722#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002723 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002724#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002725 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002726#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002727 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002728
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002729 PyBuffer_Release(&pbuf);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002731 if (timeout == 1) {
2732 PyErr_SetString(socket_timeout, "timed out");
2733 return NULL;
2734 }
2735 if (n < 0)
2736 return s->errorhandler();
2737 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002738}
2739
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002740PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002741"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742\n\
2743Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002744argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002746
2747
2748/* s.sendall(data [,flags]) method */
2749
2750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002752{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002753 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002754 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002755 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002756
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002757 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2758 return NULL;
2759 buf = pbuf.buf;
2760 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002761
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002762 if (!IS_SELECTABLE(s)) {
2763 PyBuffer_Release(&pbuf);
2764 return select_error();
2765 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002766
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002767 do {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002768 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002769 timeout = internal_select(s, 1);
2770 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002771 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002772#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002773 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002774#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002775 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002776#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002777 }
2778 Py_END_ALLOW_THREADS
2779 if (timeout == 1) {
2780 PyBuffer_Release(&pbuf);
2781 PyErr_SetString(socket_timeout, "timed out");
2782 return NULL;
2783 }
2784 /* PyErr_CheckSignals() might change errno */
2785 saved_errno = errno;
2786 /* We must run our signal handlers before looping again.
2787 send() can return a successful partial write when it is
2788 interrupted, so we can't restrict ourselves to EINTR. */
2789 if (PyErr_CheckSignals()) {
2790 PyBuffer_Release(&pbuf);
2791 return NULL;
2792 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002793 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002794 /* If interrupted, try again */
2795 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002797 else
2798 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 }
2800 buf += n;
2801 len -= n;
2802 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002803 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002805 if (n < 0)
2806 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002808 Py_INCREF(Py_None);
2809 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002810}
2811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002812PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002813"sendall(data[, flags])\n\
2814\n\
2815Send a data string to the socket. For the optional flags\n\
2816argument, see the Unix manual. This calls send() repeatedly\n\
2817until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002818to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002819
Guido van Rossum30a685f1991-06-27 15:51:29 +00002820
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002821/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002822
Guido van Rossum73624e91994-10-10 17:59:00 +00002823static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002824sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002825{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002826 Py_buffer pbuf;
2827 PyObject *addro;
2828 char *buf;
2829 Py_ssize_t len;
2830 sock_addr_t addrbuf;
2831 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002832 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002834 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002835 arglen = PyTuple_Size(args);
2836 switch(arglen) {
2837 case 2:
2838 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2839 break;
2840 case 3:
2841 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2842 break;
2843 default:
2844 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2845 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002846 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002847 if (PyErr_Occurred())
2848 return NULL;
2849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002850 buf = pbuf.buf;
2851 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002852
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002853 if (!IS_SELECTABLE(s)) {
2854 PyBuffer_Release(&pbuf);
2855 return select_error();
2856 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002857
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002858 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2859 PyBuffer_Release(&pbuf);
2860 return NULL;
2861 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002862
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002863 Py_BEGIN_ALLOW_THREADS
2864 timeout = internal_select(s, 1);
2865 if (!timeout)
2866 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2867 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002868
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002869 PyBuffer_Release(&pbuf);
2870 if (timeout == 1) {
2871 PyErr_SetString(socket_timeout, "timed out");
2872 return NULL;
2873 }
2874 if (n < 0)
2875 return s->errorhandler();
2876 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002877}
2878
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002879PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002880"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002881\n\
2882Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002883For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002884
Guido van Rossum30a685f1991-06-27 15:51:29 +00002885
2886/* s.shutdown(how) method */
2887
Guido van Rossum73624e91994-10-10 17:59:00 +00002888static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002889sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002890{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002891 int how;
2892 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002893
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 how = PyInt_AsLong(arg);
2895 if (how == -1 && PyErr_Occurred())
2896 return NULL;
2897 Py_BEGIN_ALLOW_THREADS
2898 res = shutdown(s->sock_fd, how);
2899 Py_END_ALLOW_THREADS
2900 if (res < 0)
2901 return s->errorhandler();
2902 Py_INCREF(Py_None);
2903 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002904}
2905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002907"shutdown(flag)\n\
2908\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002909Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2910of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002911
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002912#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002913static PyObject*
2914sock_ioctl(PySocketSockObject *s, PyObject *arg)
2915{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002916 unsigned long cmd = SIO_RCVALL;
2917 PyObject *argO;
2918 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002919
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002920 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2921 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002922
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002923 switch (cmd) {
2924 case SIO_RCVALL: {
2925 unsigned int option = RCVALL_ON;
2926 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2927 return NULL;
2928 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2929 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2930 return set_error();
2931 }
2932 return PyLong_FromUnsignedLong(recv); }
2933 case SIO_KEEPALIVE_VALS: {
2934 struct tcp_keepalive ka;
2935 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2936 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2937 return NULL;
2938 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2939 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2940 return set_error();
2941 }
2942 return PyLong_FromUnsignedLong(recv); }
2943 default:
2944 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2945 return NULL;
2946 }
Christian Heimes04ae9162008-01-04 15:23:30 +00002947}
2948PyDoc_STRVAR(sock_ioctl_doc,
2949"ioctl(cmd, option) -> long\n\
2950\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00002951Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2952SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2953SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00002954
2955#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002956
2957/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002958
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002959static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002960 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2961 accept_doc},
2962 {"bind", (PyCFunction)sock_bind, METH_O,
2963 bind_doc},
2964 {"close", (PyCFunction)sock_close, METH_NOARGS,
2965 close_doc},
2966 {"connect", (PyCFunction)sock_connect, METH_O,
2967 connect_doc},
2968 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2969 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002970#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002971 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2972 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002973#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002974 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2975 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002976#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002977 {"getpeername", (PyCFunction)sock_getpeername,
2978 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002979#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002980 {"getsockname", (PyCFunction)sock_getsockname,
2981 METH_NOARGS, getsockname_doc},
2982 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2983 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002984#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002985 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2986 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00002987#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002988 {"listen", (PyCFunction)sock_listen, METH_O,
2989 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002990#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002991 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2992 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002993#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002994 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2995 recv_doc},
2996 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2997 recv_into_doc},
2998 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2999 recvfrom_doc},
3000 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3001 recvfrom_into_doc},
3002 {"send", (PyCFunction)sock_send, METH_VARARGS,
3003 send_doc},
3004 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3005 sendall_doc},
3006 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3007 sendto_doc},
3008 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3009 setblocking_doc},
3010 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3011 settimeout_doc},
3012 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3013 gettimeout_doc},
3014 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3015 setsockopt_doc},
3016 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3017 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003018#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003019 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3020 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003021#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003022 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003023};
3024
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003025/* SockObject members */
3026static PyMemberDef sock_memberlist[] = {
3027 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3028 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3029 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3030 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3031 {0},
3032};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003033
Guido van Rossum73624e91994-10-10 17:59:00 +00003034/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003035 First close the file description. */
3036
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003037static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003038sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003039{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003040 if (s->sock_fd != -1)
3041 (void) SOCKETCLOSE(s->sock_fd);
3042 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003043}
3044
Guido van Rossum30a685f1991-06-27 15:51:29 +00003045
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003046static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003047sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003048{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003049 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003050#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003051 if (s->sock_fd > LONG_MAX) {
3052 /* this can occur on Win64, and actually there is a special
3053 ugly printf formatter for decimal pointer length integer
3054 printing, only bother if necessary*/
3055 PyErr_SetString(PyExc_OverflowError,
3056 "no printf formatter to display "
3057 "the socket descriptor in decimal");
3058 return NULL;
3059 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003060#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003061 PyOS_snprintf(
3062 buf, sizeof(buf),
3063 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3064 (long)s->sock_fd, s->sock_family,
3065 s->sock_type,
3066 s->sock_proto);
3067 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003068}
3069
3070
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003071/* Create a new, uninitialized socket object. */
3072
3073static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003074sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003075{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003076 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003078 new = type->tp_alloc(type, 0);
3079 if (new != NULL) {
3080 ((PySocketSockObject *)new)->sock_fd = -1;
3081 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3082 ((PySocketSockObject *)new)->errorhandler = &set_error;
3083 }
3084 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003085}
3086
3087
3088/* Initialize a new socket object. */
3089
3090/*ARGSUSED*/
3091static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003092sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003093{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003094 PySocketSockObject *s = (PySocketSockObject *)self;
3095 SOCKET_T fd;
3096 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3097 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003098
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003099 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3100 "|iii:socket", keywords,
3101 &family, &type, &proto))
3102 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003103
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003104 Py_BEGIN_ALLOW_THREADS
3105 fd = socket(family, type, proto);
3106 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003107
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003108#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003109 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003110#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003111 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003112#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003113 {
3114 set_error();
3115 return -1;
3116 }
3117 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003119 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003120
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003121}
3122
3123
Guido van Rossumb6775db1994-08-01 11:34:53 +00003124/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003125
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003126static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003127 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3128 "_socket.socket", /* tp_name */
3129 sizeof(PySocketSockObject), /* tp_basicsize */
3130 0, /* tp_itemsize */
3131 (destructor)sock_dealloc, /* tp_dealloc */
3132 0, /* tp_print */
3133 0, /* tp_getattr */
3134 0, /* tp_setattr */
3135 0, /* tp_compare */
3136 (reprfunc)sock_repr, /* tp_repr */
3137 0, /* tp_as_number */
3138 0, /* tp_as_sequence */
3139 0, /* tp_as_mapping */
3140 0, /* tp_hash */
3141 0, /* tp_call */
3142 0, /* tp_str */
3143 PyObject_GenericGetAttr, /* tp_getattro */
3144 0, /* tp_setattro */
3145 0, /* tp_as_buffer */
3146 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3147 sock_doc, /* tp_doc */
3148 0, /* tp_traverse */
3149 0, /* tp_clear */
3150 0, /* tp_richcompare */
3151 0, /* tp_weaklistoffset */
3152 0, /* tp_iter */
3153 0, /* tp_iternext */
3154 sock_methods, /* tp_methods */
3155 sock_memberlist, /* tp_members */
3156 0, /* tp_getset */
3157 0, /* tp_base */
3158 0, /* tp_dict */
3159 0, /* tp_descr_get */
3160 0, /* tp_descr_set */
3161 0, /* tp_dictoffset */
3162 sock_initobj, /* tp_init */
3163 PyType_GenericAlloc, /* tp_alloc */
3164 sock_new, /* tp_new */
3165 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003166};
3167
Guido van Rossum30a685f1991-06-27 15:51:29 +00003168
Guido van Rossum81194471991-07-27 21:42:02 +00003169/* Python interface to gethostname(). */
3170
3171/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003172static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003173socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003174{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003175 char buf[1024];
3176 int res;
3177 Py_BEGIN_ALLOW_THREADS
3178 res = gethostname(buf, (int) sizeof buf - 1);
3179 Py_END_ALLOW_THREADS
3180 if (res < 0)
3181 return set_error();
3182 buf[sizeof buf - 1] = '\0';
3183 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003184}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003186PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003187"gethostname() -> string\n\
3188\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003189Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003190
Guido van Rossumff4949e1992-08-05 19:58:53 +00003191
Guido van Rossum30a685f1991-06-27 15:51:29 +00003192/* Python interface to gethostbyname(name). */
3193
3194/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003195static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003196socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003197{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003198 char *name;
3199 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003200
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003201 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3202 return NULL;
3203 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3204 return NULL;
3205 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003206}
3207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003208PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003209"gethostbyname(host) -> address\n\
3210\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003211Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003212
3213
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003214/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3215
3216static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003217gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003218{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003219 char **pch;
3220 PyObject *rtn_tuple = (PyObject *)NULL;
3221 PyObject *name_list = (PyObject *)NULL;
3222 PyObject *addr_list = (PyObject *)NULL;
3223 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003224
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003225 if (h == NULL) {
3226 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003227#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003228 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003229#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003230 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003231#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003232 return NULL;
3233 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003234
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003235 if (h->h_addrtype != af) {
3236 /* Let's get real error message to return */
3237 PyErr_SetString(socket_error,
3238 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003239
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003240 return NULL;
3241 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003242
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003243 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003244
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003245 case AF_INET:
3246 if (alen < sizeof(struct sockaddr_in))
3247 return NULL;
3248 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003249
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003250#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003251 case AF_INET6:
3252 if (alen < sizeof(struct sockaddr_in6))
3253 return NULL;
3254 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003255#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003256
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003257 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003258
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003259 if ((name_list = PyList_New(0)) == NULL)
3260 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003261
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003262 if ((addr_list = PyList_New(0)) == NULL)
3263 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003264
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003265 /* SF #1511317: h_aliases can be NULL */
3266 if (h->h_aliases) {
3267 for (pch = h->h_aliases; *pch != NULL; pch++) {
3268 int status;
3269 tmp = PyString_FromString(*pch);
3270 if (tmp == NULL)
3271 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003272
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003273 status = PyList_Append(name_list, tmp);
3274 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003275
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003276 if (status)
3277 goto err;
3278 }
3279 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003280
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003281 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3282 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003283
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003284 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003285
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003286 case AF_INET:
3287 {
3288 struct sockaddr_in sin;
3289 memset(&sin, 0, sizeof(sin));
3290 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003291#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003292 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003293#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003294 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3295 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003296
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003297 if (pch == h->h_addr_list && alen >= sizeof(sin))
3298 memcpy((char *) addr, &sin, sizeof(sin));
3299 break;
3300 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003301
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003302#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003303 case AF_INET6:
3304 {
3305 struct sockaddr_in6 sin6;
3306 memset(&sin6, 0, sizeof(sin6));
3307 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003308#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003309 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003310#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003311 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3312 tmp = makeipaddr((struct sockaddr *)&sin6,
3313 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003314
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003315 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3316 memcpy((char *) addr, &sin6, sizeof(sin6));
3317 break;
3318 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003319#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003320
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003321 default: /* can't happen */
3322 PyErr_SetString(socket_error,
3323 "unsupported address family");
3324 return NULL;
3325 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003326
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003327 if (tmp == NULL)
3328 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003329
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003330 status = PyList_Append(addr_list, tmp);
3331 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003332
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003333 if (status)
3334 goto err;
3335 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003336
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003337 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003338
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003339 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 Py_XDECREF(name_list);
3341 Py_XDECREF(addr_list);
3342 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003343}
3344
3345
3346/* Python interface to gethostbyname_ex(name). */
3347
3348/*ARGSUSED*/
3349static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003350socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003351{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003352 char *name;
3353 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003354#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003355 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003356#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003357 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003358#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003359 struct sockaddr *sa;
3360 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003361#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003363#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003364 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003365#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003366 char buf[16384];
3367 int buf_len = (sizeof buf) - 1;
3368 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003369#endif
3370#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003371 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003372#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003373#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003375 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3376 return NULL;
3377 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3378 return NULL;
3379 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003380#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003381#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003382 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3383 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003384#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003385 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003386#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003387 memset((void *) &data, '\0', sizeof(data));
3388 result = gethostbyname_r(name, &hp_allocated, &data);
3389 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003390#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003391#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003392#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003393 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003394#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003395 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003396#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003397 Py_END_ALLOW_THREADS
3398 /* Some C libraries would require addr.__ss_family instead of
3399 addr.ss_family.
3400 Therefore, we cast the sockaddr_storage into sockaddr to
3401 access sa_family. */
3402 sa = (struct sockaddr*)&addr;
3403 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3404 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003405#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003406 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003407#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003408 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003409}
3410
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003411PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003412"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3413\n\
3414Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003415for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003416
3417
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003418/* Python interface to gethostbyaddr(IP). */
3419
3420/*ARGSUSED*/
3421static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003422socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003423{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003424#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003425 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003426#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003427 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003428#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003429 struct sockaddr *sa = (struct sockaddr *)&addr;
3430 char *ip_num;
3431 struct hostent *h;
3432 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003433#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003434 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003435#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003436 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003437#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003438 /* glibcs up to 2.10 assume that the buf argument to
3439 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3440 does not ensure. The attribute below instructs the compiler
3441 to maintain this alignment. */
3442 char buf[16384] Py_ALIGNED(8);
3443 int buf_len = (sizeof buf) - 1;
3444 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003445#endif
3446#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003447 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003448#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003449#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003450 char *ap;
3451 int al;
3452 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003453
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003454 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3455 return NULL;
3456 af = AF_UNSPEC;
3457 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3458 return NULL;
3459 af = sa->sa_family;
3460 ap = NULL;
3461 switch (af) {
3462 case AF_INET:
3463 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3464 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3465 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003466#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003467 case AF_INET6:
3468 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3469 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3470 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003471#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003472 default:
3473 PyErr_SetString(socket_error, "unsupported address family");
3474 return NULL;
3475 }
3476 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003477#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003478#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003479 result = gethostbyaddr_r(ap, al, af,
3480 &hp_allocated, buf, buf_len,
3481 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003482#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003483 h = gethostbyaddr_r(ap, al, af,
3484 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003485#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003486 memset((void *) &data, '\0', sizeof(data));
3487 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3488 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003489#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003490#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003491#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003492 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003493#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003494 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003495#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003496 Py_END_ALLOW_THREADS
3497 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003498#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003499 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003500#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003501 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003502}
3503
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003504PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003505"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3506\n\
3507Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003508for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003509
Guido van Rossum30a685f1991-06-27 15:51:29 +00003510
3511/* Python interface to getservbyname(name).
3512 This only returns the port number, since the other info is already
3513 known or not useful (like the list of aliases). */
3514
3515/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003517socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003518{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003519 char *name, *proto=NULL;
3520 struct servent *sp;
3521 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3522 return NULL;
3523 Py_BEGIN_ALLOW_THREADS
3524 sp = getservbyname(name, proto);
3525 Py_END_ALLOW_THREADS
3526 if (sp == NULL) {
3527 PyErr_SetString(socket_error, "service/proto not found");
3528 return NULL;
3529 }
3530 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003531}
3532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003533PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003534"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003535\n\
3536Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003537The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3538otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003539
Guido van Rossum30a685f1991-06-27 15:51:29 +00003540
Barry Warsaw11b91a02004-06-28 00:50:43 +00003541/* Python interface to getservbyport(port).
3542 This only returns the service name, since the other info is already
3543 known or not useful (like the list of aliases). */
3544
3545/*ARGSUSED*/
3546static PyObject *
3547socket_getservbyport(PyObject *self, PyObject *args)
3548{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003549 int port;
3550 char *proto=NULL;
3551 struct servent *sp;
3552 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3553 return NULL;
3554 if (port < 0 || port > 0xffff) {
3555 PyErr_SetString(
3556 PyExc_OverflowError,
3557 "getservbyport: port must be 0-65535.");
3558 return NULL;
3559 }
3560 Py_BEGIN_ALLOW_THREADS
3561 sp = getservbyport(htons((short)port), proto);
3562 Py_END_ALLOW_THREADS
3563 if (sp == NULL) {
3564 PyErr_SetString(socket_error, "port/proto not found");
3565 return NULL;
3566 }
3567 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003568}
3569
3570PyDoc_STRVAR(getservbyport_doc,
3571"getservbyport(port[, protocolname]) -> string\n\
3572\n\
3573Return the service name from a port number and protocol name.\n\
3574The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3575otherwise any protocol will match.");
3576
Guido van Rossum3901d851996-12-19 16:35:04 +00003577/* Python interface to getprotobyname(name).
3578 This only returns the protocol number, since the other info is
3579 already known or not useful (like the list of aliases). */
3580
3581/*ARGSUSED*/
3582static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003583socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003584{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003585 char *name;
3586 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003587#ifdef __BEOS__
3588/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003589 PyErr_SetString(socket_error, "getprotobyname not supported");
3590 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003591#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003592 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3593 return NULL;
3594 Py_BEGIN_ALLOW_THREADS
3595 sp = getprotobyname(name);
3596 Py_END_ALLOW_THREADS
3597 if (sp == NULL) {
3598 PyErr_SetString(socket_error, "protocol not found");
3599 return NULL;
3600 }
3601 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003602#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003603}
3604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003605PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003606"getprotobyname(name) -> integer\n\
3607\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003608Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003609
Guido van Rossum3901d851996-12-19 16:35:04 +00003610
Dave Cole331708b2004-08-09 04:51:41 +00003611#ifdef HAVE_SOCKETPAIR
3612/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003613 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003614 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003615
3616/*ARGSUSED*/
3617static PyObject *
3618socket_socketpair(PyObject *self, PyObject *args)
3619{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003620 PySocketSockObject *s0 = NULL, *s1 = NULL;
3621 SOCKET_T sv[2];
3622 int family, type = SOCK_STREAM, proto = 0;
3623 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003624
3625#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003626 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003627#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003628 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003629#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003630 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3631 &family, &type, &proto))
3632 return NULL;
3633 /* Create a pair of socket fds */
3634 if (socketpair(family, type, proto, sv) < 0)
3635 return set_error();
3636 s0 = new_sockobject(sv[0], family, type, proto);
3637 if (s0 == NULL)
3638 goto finally;
3639 s1 = new_sockobject(sv[1], family, type, proto);
3640 if (s1 == NULL)
3641 goto finally;
3642 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003643
3644finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003645 if (res == NULL) {
3646 if (s0 == NULL)
3647 SOCKETCLOSE(sv[0]);
3648 if (s1 == NULL)
3649 SOCKETCLOSE(sv[1]);
3650 }
3651 Py_XDECREF(s0);
3652 Py_XDECREF(s1);
3653 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003654}
3655
3656PyDoc_STRVAR(socketpair_doc,
3657"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3658\n\
3659Create a pair of socket objects from the sockets returned by the platform\n\
3660socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003661The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003662AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003663
3664#endif /* HAVE_SOCKETPAIR */
3665
3666
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003667#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003668/* Create a socket object from a numeric file description.
3669 Useful e.g. if stdin is a socket.
3670 Additional arguments as for socket(). */
3671
3672/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003673static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003674socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003675{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003676 PySocketSockObject *s;
3677 SOCKET_T fd;
3678 int family, type, proto = 0;
3679 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3680 &fd, &family, &type, &proto))
3681 return NULL;
3682 /* Dup the fd so it and the socket can be closed independently */
3683 fd = dup(fd);
3684 if (fd < 0)
3685 return set_error();
3686 s = new_sockobject(fd, family, type, proto);
3687 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003688}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003689
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003690PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003691"fromfd(fd, family, type[, proto]) -> socket object\n\
3692\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003693Create a socket object from a duplicate of the given\n\
3694file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003695The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003696
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003697#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003698
Guido van Rossum82a5c661998-07-07 20:45:43 +00003699
Guido van Rossum006bf911996-06-12 04:04:55 +00003700static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003701socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003702{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003703 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003704
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003705 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3706 return NULL;
3707 }
3708 if (x1 < 0) {
3709 PyErr_SetString(PyExc_OverflowError,
3710 "can't convert negative number to unsigned long");
3711 return NULL;
3712 }
3713 x2 = (unsigned int)ntohs((unsigned short)x1);
3714 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003715}
3716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003717PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003718"ntohs(integer) -> integer\n\
3719\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003720Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003721
3722
Guido van Rossum006bf911996-06-12 04:04:55 +00003723static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003724socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003725{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003726 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003728 if (PyInt_Check(arg)) {
3729 x = PyInt_AS_LONG(arg);
3730 if (x == (unsigned long) -1 && PyErr_Occurred())
3731 return NULL;
3732 if ((long)x < 0) {
3733 PyErr_SetString(PyExc_OverflowError,
3734 "can't convert negative number to unsigned long");
3735 return NULL;
3736 }
3737 }
3738 else if (PyLong_Check(arg)) {
3739 x = PyLong_AsUnsignedLong(arg);
3740 if (x == (unsigned long) -1 && PyErr_Occurred())
3741 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003742#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003743 {
3744 unsigned long y;
3745 /* only want the trailing 32 bits */
3746 y = x & 0xFFFFFFFFUL;
3747 if (y ^ x)
3748 return PyErr_Format(PyExc_OverflowError,
3749 "long int larger than 32 bits");
3750 x = y;
3751 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003752#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003753 }
3754 else
3755 return PyErr_Format(PyExc_TypeError,
3756 "expected int/long, %s found",
3757 Py_TYPE(arg)->tp_name);
3758 if (x == (unsigned long) -1 && PyErr_Occurred())
3759 return NULL;
3760 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003761}
3762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003763PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003764"ntohl(integer) -> integer\n\
3765\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003766Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003767
3768
Guido van Rossum006bf911996-06-12 04:04:55 +00003769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003770socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003771{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003772 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003773
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003774 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3775 return NULL;
3776 }
3777 if (x1 < 0) {
3778 PyErr_SetString(PyExc_OverflowError,
3779 "can't convert negative number to unsigned long");
3780 return NULL;
3781 }
3782 x2 = (unsigned int)htons((unsigned short)x1);
3783 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003784}
3785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003786PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003787"htons(integer) -> integer\n\
3788\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003789Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003790
3791
Guido van Rossum006bf911996-06-12 04:04:55 +00003792static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003793socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003794{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003795 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003796
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003797 if (PyInt_Check(arg)) {
3798 x = PyInt_AS_LONG(arg);
3799 if (x == (unsigned long) -1 && PyErr_Occurred())
3800 return NULL;
3801 if ((long)x < 0) {
3802 PyErr_SetString(PyExc_OverflowError,
3803 "can't convert negative number to unsigned long");
3804 return NULL;
3805 }
3806 }
3807 else if (PyLong_Check(arg)) {
3808 x = PyLong_AsUnsignedLong(arg);
3809 if (x == (unsigned long) -1 && PyErr_Occurred())
3810 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003811#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003812 {
3813 unsigned long y;
3814 /* only want the trailing 32 bits */
3815 y = x & 0xFFFFFFFFUL;
3816 if (y ^ x)
3817 return PyErr_Format(PyExc_OverflowError,
3818 "long int larger than 32 bits");
3819 x = y;
3820 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003821#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003822 }
3823 else
3824 return PyErr_Format(PyExc_TypeError,
3825 "expected int/long, %s found",
3826 Py_TYPE(arg)->tp_name);
3827 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003828}
3829
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003830PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003831"htonl(integer) -> integer\n\
3832\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003833Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003834
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003835/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003837PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003838"inet_aton(string) -> packed 32-bit IP representation\n\
3839\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003840Convert 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 +00003841binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003842
3843static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003844socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003845{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003846#ifndef INADDR_NONE
3847#define INADDR_NONE (-1)
3848#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003849#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003850 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003851#endif
3852
3853#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003854#if (SIZEOF_INT != 4)
3855#error "Not sure if in_addr_t exists and int is not 32-bits."
3856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003857 /* Have to use inet_addr() instead */
3858 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003859#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003860 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003861
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003862 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3863 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003864
Tim Peters1df9fdd2003-02-13 03:13:40 +00003865
3866#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003867
3868#ifdef USE_INET_ATON_WEAKLINK
3869 if (inet_aton != NULL) {
3870#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003871 if (inet_aton(ip_addr, &buf))
3872 return PyString_FromStringAndSize((char *)(&buf),
3873 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003874
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003875 PyErr_SetString(socket_error,
3876 "illegal IP address string passed to inet_aton");
3877 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003878
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003879#ifdef USE_INET_ATON_WEAKLINK
3880 } else {
3881#endif
3882
3883#endif
3884
3885#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3886
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003887 /* special-case this address as inet_addr might return INADDR_NONE
3888 * for this */
3889 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3890 packed_addr = 0xFFFFFFFF;
3891 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003892
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003893 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003894
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003895 if (packed_addr == INADDR_NONE) { /* invalid address */
3896 PyErr_SetString(socket_error,
3897 "illegal IP address string passed to inet_aton");
3898 return NULL;
3899 }
3900 }
3901 return PyString_FromStringAndSize((char *) &packed_addr,
3902 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003903
3904#ifdef USE_INET_ATON_WEAKLINK
3905 }
3906#endif
3907
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003908#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003909}
3910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003911PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003912"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003914Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003915
3916static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003917socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003918{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003919 char *packed_str;
3920 int addr_len;
3921 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003922
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003923 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
3924 return NULL;
3925 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003926
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003927 if (addr_len != sizeof(packed_addr)) {
3928 PyErr_SetString(socket_error,
3929 "packed IP wrong length for inet_ntoa");
3930 return NULL;
3931 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003932
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003933 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003934
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003935 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003936}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003937
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003938#ifdef HAVE_INET_PTON
3939
3940PyDoc_STRVAR(inet_pton_doc,
3941"inet_pton(af, ip) -> packed IP address string\n\
3942\n\
3943Convert an IP address from string format to a packed string suitable\n\
3944for use with low-level network functions.");
3945
3946static PyObject *
3947socket_inet_pton(PyObject *self, PyObject *args)
3948{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003949 int af;
3950 char* ip;
3951 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003952#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003953 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003954#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003955 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003957 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3958 return NULL;
3959 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003960
Martin v. Löwis04697e82004-06-02 12:35:29 +00003961#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003962 if(af == AF_INET6) {
3963 PyErr_SetString(socket_error,
3964 "can't use AF_INET6, IPv6 is disabled");
3965 return NULL;
3966 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003967#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003968
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003969 retval = inet_pton(af, ip, packed);
3970 if (retval < 0) {
3971 PyErr_SetFromErrno(socket_error);
3972 return NULL;
3973 } else if (retval == 0) {
3974 PyErr_SetString(socket_error,
3975 "illegal IP address string passed to inet_pton");
3976 return NULL;
3977 } else if (af == AF_INET) {
3978 return PyString_FromStringAndSize(packed,
3979 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003980#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003981 } else if (af == AF_INET6) {
3982 return PyString_FromStringAndSize(packed,
3983 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003984#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003985 } else {
3986 PyErr_SetString(socket_error, "unknown address family");
3987 return NULL;
3988 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003989}
Martin Blais2856e5f2006-05-26 12:03:27 +00003990
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003991PyDoc_STRVAR(inet_ntop_doc,
3992"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3993\n\
3994Convert a packed IP address of the given family to string format.");
3995
3996static PyObject *
3997socket_inet_ntop(PyObject *self, PyObject *args)
3998{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003999 int af;
4000 char* packed;
4001 int len;
4002 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004003#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004004 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004005#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004006 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004007#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004008
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004009 /* Guarantee NUL-termination for PyString_FromString() below */
4010 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004012 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4013 return NULL;
4014 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004015
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004016 if (af == AF_INET) {
4017 if (len != sizeof(struct in_addr)) {
4018 PyErr_SetString(PyExc_ValueError,
4019 "invalid length of packed IP address string");
4020 return NULL;
4021 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004022#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004023 } else if (af == AF_INET6) {
4024 if (len != sizeof(struct in6_addr)) {
4025 PyErr_SetString(PyExc_ValueError,
4026 "invalid length of packed IP address string");
4027 return NULL;
4028 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004029#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004030 } else {
4031 PyErr_Format(PyExc_ValueError,
4032 "unknown address family %d", af);
4033 return NULL;
4034 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004035
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004036 retval = inet_ntop(af, packed, ip, sizeof(ip));
4037 if (!retval) {
4038 PyErr_SetFromErrno(socket_error);
4039 return NULL;
4040 } else {
4041 return PyString_FromString(retval);
4042 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004044 /* NOTREACHED */
4045 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4046 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004047}
4048
4049#endif /* HAVE_INET_PTON */
4050
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004051/* Python interface to getaddrinfo(host, port). */
4052
4053/*ARGSUSED*/
4054static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004055socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004056{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004057 struct addrinfo hints, *res;
4058 struct addrinfo *res0 = NULL;
4059 PyObject *hobj = NULL;
4060 PyObject *pobj = (PyObject *)NULL;
4061 char pbuf[30];
4062 char *hptr, *pptr;
4063 int family, socktype, protocol, flags;
4064 int error;
4065 PyObject *all = (PyObject *)NULL;
4066 PyObject *single = (PyObject *)NULL;
4067 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004068
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004069 family = socktype = protocol = flags = 0;
4070 family = AF_UNSPEC;
4071 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4072 &hobj, &pobj, &family, &socktype,
4073 &protocol, &flags)) {
4074 return NULL;
4075 }
4076 if (hobj == Py_None) {
4077 hptr = NULL;
4078 } else if (PyUnicode_Check(hobj)) {
4079 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4080 if (!idna)
4081 return NULL;
4082 hptr = PyString_AsString(idna);
4083 } else if (PyString_Check(hobj)) {
4084 hptr = PyString_AsString(hobj);
4085 } else {
4086 PyErr_SetString(PyExc_TypeError,
4087 "getaddrinfo() argument 1 must be string or None");
4088 return NULL;
4089 }
4090 if (PyInt_Check(pobj)) {
4091 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
4092 pptr = pbuf;
4093 } else if (PyString_Check(pobj)) {
4094 pptr = PyString_AsString(pobj);
4095 } else if (pobj == Py_None) {
4096 pptr = (char *)NULL;
4097 } else {
4098 PyErr_SetString(socket_error, "Int or String expected");
4099 goto err;
4100 }
4101 memset(&hints, 0, sizeof(hints));
4102 hints.ai_family = family;
4103 hints.ai_socktype = socktype;
4104 hints.ai_protocol = protocol;
4105 hints.ai_flags = flags;
4106 Py_BEGIN_ALLOW_THREADS
4107 ACQUIRE_GETADDRINFO_LOCK
4108 error = getaddrinfo(hptr, pptr, &hints, &res0);
4109 Py_END_ALLOW_THREADS
4110 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4111 if (error) {
4112 set_gaierror(error);
4113 goto err;
4114 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004116 if ((all = PyList_New(0)) == NULL)
4117 goto err;
4118 for (res = res0; res; res = res->ai_next) {
4119 PyObject *addr =
4120 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4121 if (addr == NULL)
4122 goto err;
4123 single = Py_BuildValue("iiisO", res->ai_family,
4124 res->ai_socktype, res->ai_protocol,
4125 res->ai_canonname ? res->ai_canonname : "",
4126 addr);
4127 Py_DECREF(addr);
4128 if (single == NULL)
4129 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004130
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004131 if (PyList_Append(all, single))
4132 goto err;
4133 Py_XDECREF(single);
4134 }
4135 Py_XDECREF(idna);
4136 if (res0)
4137 freeaddrinfo(res0);
4138 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004139 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004140 Py_XDECREF(single);
4141 Py_XDECREF(all);
4142 Py_XDECREF(idna);
4143 if (res0)
4144 freeaddrinfo(res0);
4145 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004146}
4147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004148PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004149"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4150 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004151\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004152Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004153
4154/* Python interface to getnameinfo(sa, flags). */
4155
4156/*ARGSUSED*/
4157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004158socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004159{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004160 PyObject *sa = (PyObject *)NULL;
4161 int flags;
4162 char *hostp;
4163 int port, flowinfo, scope_id;
4164 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4165 struct addrinfo hints, *res = NULL;
4166 int error;
4167 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004168
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004169 flags = flowinfo = scope_id = 0;
4170 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4171 return NULL;
4172 if (!PyTuple_Check(sa)) {
4173 PyErr_SetString(PyExc_TypeError,
4174 "getnameinfo() argument 1 must be a tuple");
4175 return NULL;
4176 }
4177 if (!PyArg_ParseTuple(sa, "si|ii",
4178 &hostp, &port, &flowinfo, &scope_id))
4179 return NULL;
4180 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4181 memset(&hints, 0, sizeof(hints));
4182 hints.ai_family = AF_UNSPEC;
4183 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4184 Py_BEGIN_ALLOW_THREADS
4185 ACQUIRE_GETADDRINFO_LOCK
4186 error = getaddrinfo(hostp, pbuf, &hints, &res);
4187 Py_END_ALLOW_THREADS
4188 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4189 if (error) {
4190 set_gaierror(error);
4191 goto fail;
4192 }
4193 if (res->ai_next) {
4194 PyErr_SetString(socket_error,
4195 "sockaddr resolved to multiple addresses");
4196 goto fail;
4197 }
4198 switch (res->ai_family) {
4199 case AF_INET:
4200 {
4201 if (PyTuple_GET_SIZE(sa) != 2) {
4202 PyErr_SetString(socket_error,
4203 "IPv4 sockaddr must be 2 tuple");
4204 goto fail;
4205 }
4206 break;
4207 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004208#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004209 case AF_INET6:
4210 {
4211 struct sockaddr_in6 *sin6;
4212 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4213 sin6->sin6_flowinfo = flowinfo;
4214 sin6->sin6_scope_id = scope_id;
4215 break;
4216 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004218 }
4219 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4220 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4221 if (error) {
4222 set_gaierror(error);
4223 goto fail;
4224 }
4225 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004226
4227fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004228 if (res)
4229 freeaddrinfo(res);
4230 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004231}
4232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004233PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004234"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004235\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004236Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004237
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004238
4239/* Python API to getting and setting the default timeout value. */
4240
4241static PyObject *
4242socket_getdefaulttimeout(PyObject *self)
4243{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004244 if (defaulttimeout < 0.0) {
4245 Py_INCREF(Py_None);
4246 return Py_None;
4247 }
4248 else
4249 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004250}
4251
4252PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004253"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004254\n\
4255Returns the default timeout in floating seconds for new socket objects.\n\
4256A value of None indicates that new socket objects have no timeout.\n\
4257When the socket module is first imported, the default is None.");
4258
4259static PyObject *
4260socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4261{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004262 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004263
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004264 if (arg == Py_None)
4265 timeout = -1.0;
4266 else {
4267 timeout = PyFloat_AsDouble(arg);
4268 if (timeout < 0.0) {
4269 if (!PyErr_Occurred())
4270 PyErr_SetString(PyExc_ValueError,
4271 "Timeout value out of range");
4272 return NULL;
4273 }
4274 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004275
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004276 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004277
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004278 Py_INCREF(Py_None);
4279 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004280}
4281
4282PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004283"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004284\n\
4285Set the default timeout in floating seconds for new socket objects.\n\
4286A value of None indicates that new socket objects have no timeout.\n\
4287When the socket module is first imported, the default is None.");
4288
4289
Guido van Rossum30a685f1991-06-27 15:51:29 +00004290/* List of functions exported by this module. */
4291
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004292static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004293 {"gethostbyname", socket_gethostbyname,
4294 METH_VARARGS, gethostbyname_doc},
4295 {"gethostbyname_ex", socket_gethostbyname_ex,
4296 METH_VARARGS, ghbn_ex_doc},
4297 {"gethostbyaddr", socket_gethostbyaddr,
4298 METH_VARARGS, gethostbyaddr_doc},
4299 {"gethostname", socket_gethostname,
4300 METH_NOARGS, gethostname_doc},
4301 {"getservbyname", socket_getservbyname,
4302 METH_VARARGS, getservbyname_doc},
4303 {"getservbyport", socket_getservbyport,
4304 METH_VARARGS, getservbyport_doc},
4305 {"getprotobyname", socket_getprotobyname,
4306 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004307#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004308 {"fromfd", socket_fromfd,
4309 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004310#endif
Dave Cole331708b2004-08-09 04:51:41 +00004311#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004312 {"socketpair", socket_socketpair,
4313 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004314#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004315 {"ntohs", socket_ntohs,
4316 METH_VARARGS, ntohs_doc},
4317 {"ntohl", socket_ntohl,
4318 METH_O, ntohl_doc},
4319 {"htons", socket_htons,
4320 METH_VARARGS, htons_doc},
4321 {"htonl", socket_htonl,
4322 METH_O, htonl_doc},
4323 {"inet_aton", socket_inet_aton,
4324 METH_VARARGS, inet_aton_doc},
4325 {"inet_ntoa", socket_inet_ntoa,
4326 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004327#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004328 {"inet_pton", socket_inet_pton,
4329 METH_VARARGS, inet_pton_doc},
4330 {"inet_ntop", socket_inet_ntop,
4331 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004332#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004333 {"getaddrinfo", socket_getaddrinfo,
4334 METH_VARARGS, getaddrinfo_doc},
4335 {"getnameinfo", socket_getnameinfo,
4336 METH_VARARGS, getnameinfo_doc},
4337 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4338 METH_NOARGS, getdefaulttimeout_doc},
4339 {"setdefaulttimeout", socket_setdefaulttimeout,
4340 METH_O, setdefaulttimeout_doc},
4341 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004342};
4343
Guido van Rossum30a685f1991-06-27 15:51:29 +00004344
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004345#ifdef RISCOS
4346#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004347
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004348static int
4349os_init(void)
4350{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004351 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004352
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004353 r.r[0] = 0;
4354 _kernel_swi(0x43380, &r, &r);
4355 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004357 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004358}
4359
4360#endif /* RISCOS */
4361
4362
4363#ifdef MS_WINDOWS
4364#define OS_INIT_DEFINED
4365
4366/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004367
4368static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004369os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004370{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004371 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004372}
4373
4374static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004375os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004376{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004377 WSADATA WSAData;
4378 int ret;
4379 char buf[100];
4380 ret = WSAStartup(0x0101, &WSAData);
4381 switch (ret) {
4382 case 0: /* No error */
4383 Py_AtExit(os_cleanup);
4384 return 1; /* Success */
4385 case WSASYSNOTREADY:
4386 PyErr_SetString(PyExc_ImportError,
4387 "WSAStartup failed: network not ready");
4388 break;
4389 case WSAVERNOTSUPPORTED:
4390 case WSAEINVAL:
4391 PyErr_SetString(
4392 PyExc_ImportError,
4393 "WSAStartup failed: requested version not supported");
4394 break;
4395 default:
4396 PyOS_snprintf(buf, sizeof(buf),
4397 "WSAStartup failed: error code %d", ret);
4398 PyErr_SetString(PyExc_ImportError, buf);
4399 break;
4400 }
4401 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004402}
4403
Guido van Rossum8d665e61996-06-26 18:22:49 +00004404#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004405
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004406
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004407#ifdef PYOS_OS2
4408#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004409
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004410/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004411
4412static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004413os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004414{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004415#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004416 char reason[64];
4417 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004418
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004419 if (rc == 0) {
4420 return 1; /* Success */
4421 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004422
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004423 PyOS_snprintf(reason, sizeof(reason),
4424 "OS/2 TCP/IP Error# %d", sock_errno());
4425 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004426
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004427 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004428#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004429 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004430 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004431#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004432}
4433
4434#endif /* PYOS_OS2 */
4435
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004436
4437#ifndef OS_INIT_DEFINED
4438static int
4439os_init(void)
4440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004441 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004442}
4443#endif
4444
4445
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004446/* C API table - always add new things to the end for binary
4447 compatibility. */
4448static
4449PySocketModule_APIObject PySocketModuleAPI =
4450{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004451 &sock_type,
4452 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004453};
4454
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004455
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004456/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004457
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004458 This module is actually called "_socket", and there's a wrapper
4459 "socket.py" which implements some additional functionality. On some
4460 platforms (e.g. Windows and OS/2), socket.py also implements a
4461 wrapper for the socket type that provides missing functionality such
4462 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4463 with an ImportError exception if os-specific initialization fails.
4464 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004465 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004466 made at exit time.
4467*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004469PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004470"Implementation module for socket operations.\n\
4471\n\
4472See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004473
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004474PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004475init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004477 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004479 if (!os_init())
4480 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004482 Py_TYPE(&sock_type) = &PyType_Type;
4483 m = Py_InitModule3(PySocket_MODULE_NAME,
4484 socket_methods,
4485 socket_doc);
4486 if (m == NULL)
4487 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004488
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004489 socket_error = PyErr_NewException("socket.error",
4490 PyExc_IOError, NULL);
4491 if (socket_error == NULL)
4492 return;
4493 PySocketModuleAPI.error = socket_error;
4494 Py_INCREF(socket_error);
4495 PyModule_AddObject(m, "error", socket_error);
4496 socket_herror = PyErr_NewException("socket.herror",
4497 socket_error, NULL);
4498 if (socket_herror == NULL)
4499 return;
4500 Py_INCREF(socket_herror);
4501 PyModule_AddObject(m, "herror", socket_herror);
4502 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4503 NULL);
4504 if (socket_gaierror == NULL)
4505 return;
4506 Py_INCREF(socket_gaierror);
4507 PyModule_AddObject(m, "gaierror", socket_gaierror);
4508 socket_timeout = PyErr_NewException("socket.timeout",
4509 socket_error, NULL);
4510 if (socket_timeout == NULL)
4511 return;
4512 Py_INCREF(socket_timeout);
4513 PyModule_AddObject(m, "timeout", socket_timeout);
4514 Py_INCREF((PyObject *)&sock_type);
4515 if (PyModule_AddObject(m, "SocketType",
4516 (PyObject *)&sock_type) != 0)
4517 return;
4518 Py_INCREF((PyObject *)&sock_type);
4519 if (PyModule_AddObject(m, "socket",
4520 (PyObject *)&sock_type) != 0)
4521 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004522
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004523#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004524 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004525#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004526 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004527#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004528 Py_INCREF(has_ipv6);
4529 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004530
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004531 /* Export C API */
4532 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4533 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4534 ) != 0)
4535 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004536
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004537 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004538#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004539 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004540#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004541 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004542#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004543 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004544#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004545#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004546 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004547#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004548#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004549 /* Amateur Radio AX.25 */
4550 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004551#endif
4552#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004553 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004554#endif
4555#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004556 /* Appletalk DDP */
4557 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004558#endif
4559#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004560 /* Amateur radio NetROM */
4561 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004562#endif
4563#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004564 /* Multiprotocol bridge */
4565 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004566#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004567#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004568 /* ATM PVCs */
4569 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004570#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004571#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004572 /* Reserved for Werner's ATM */
4573 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004574#endif
4575#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004576 /* Reserved for X.25 project */
4577 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004578#endif
4579#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004580 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004581#endif
4582#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004583 /* Amateur Radio X.25 PLP */
4584 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004585#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004586#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004587 /* Reserved for DECnet project */
4588 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004589#endif
4590#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004591 /* Reserved for 802.2LLC project */
4592 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004593#endif
4594#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004595 /* Security callback pseudo AF */
4596 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004597#endif
4598#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004599 /* PF_KEY key management API */
4600 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004601#endif
4602#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004603 /* */
4604 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4605 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004606#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004607 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004608#endif
4609#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004610 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004611#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004612 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4613 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004614#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004615 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004616#endif
4617#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004618 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004619#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004620#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004621 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004622#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004623#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004624 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004625#endif
4626#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004627 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004628#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004629 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004630#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004631 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4632#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004633#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004634 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004635#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004636#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004637#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004638 /* Alias to emulate 4.4BSD */
4639 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004640#endif
4641#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004642 /* Ash */
4643 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004644#endif
4645#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004646 /* Acorn Econet */
4647 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004648#endif
4649#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004650 /* ATM SVCs */
4651 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004652#endif
4653#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004654 /* Linux SNA Project (nutters!) */
4655 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004656#endif
4657#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004658 /* IRDA sockets */
4659 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004660#endif
4661#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004662 /* PPPoX sockets */
4663 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004664#endif
4665#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004666 /* Wanpipe API Sockets */
4667 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004668#endif
4669#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004670 /* Linux LLC */
4671 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004672#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004673
Hye-Shik Chang81268602004-02-02 06:05:24 +00004674#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004675 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4676 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4677 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4678 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
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_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004681#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004682#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004683#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004684 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004685#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004686 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4687 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004688#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004689 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4690 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4691 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004692#endif
4693
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004694#ifdef AF_PACKET
4695 PyModule_AddIntMacro(m, AF_PACKET);
4696#endif
4697#ifdef PF_PACKET
4698 PyModule_AddIntMacro(m, PF_PACKET);
4699#endif
4700#ifdef PACKET_HOST
4701 PyModule_AddIntMacro(m, PACKET_HOST);
4702#endif
4703#ifdef PACKET_BROADCAST
4704 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4705#endif
4706#ifdef PACKET_MULTICAST
4707 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4708#endif
4709#ifdef PACKET_OTHERHOST
4710 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4711#endif
4712#ifdef PACKET_OUTGOING
4713 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4714#endif
4715#ifdef PACKET_LOOPBACK
4716 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4717#endif
4718#ifdef PACKET_FASTROUTE
4719 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004720#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004721
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004722#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004723 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004724
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004725 /* for addresses */
4726 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4727 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4728 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004730 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4731 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4732 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004733
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004734 /* for setsockopt() */
4735 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4736 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4737 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4738 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4739 TIPC_DEST_DROPPABLE);
4740 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004741
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4743 TIPC_LOW_IMPORTANCE);
4744 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4745 TIPC_MEDIUM_IMPORTANCE);
4746 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4747 TIPC_HIGH_IMPORTANCE);
4748 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4749 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004750
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004751 /* for subscriptions */
4752 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4753 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004754#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004755 /* doesn't seem to be available everywhere */
4756 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004757#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004758 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4759 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4760 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4761 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4762 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4763 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004764#endif
4765
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004766 /* Socket types */
4767 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4768 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004769#ifndef __BEOS__
4770/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004771 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4772 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004773#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004774 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004775#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004776#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004778#ifdef SO_DEBUG
4779 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004780#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004781#ifdef SO_ACCEPTCONN
4782 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004783#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004784#ifdef SO_REUSEADDR
4785 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004786#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004787#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004788 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004789#endif
4790
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004791#ifdef SO_KEEPALIVE
4792 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004793#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004794#ifdef SO_DONTROUTE
4795 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004796#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004797#ifdef SO_BROADCAST
4798 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004799#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004800#ifdef SO_USELOOPBACK
4801 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004802#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004803#ifdef SO_LINGER
4804 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004805#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004806#ifdef SO_OOBINLINE
4807 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004808#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004809#ifdef SO_REUSEPORT
4810 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004811#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004812#ifdef SO_SNDBUF
4813 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004814#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004815#ifdef SO_RCVBUF
4816 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004817#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004818#ifdef SO_SNDLOWAT
4819 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004820#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004821#ifdef SO_RCVLOWAT
4822 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004823#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004824#ifdef SO_SNDTIMEO
4825 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004826#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004827#ifdef SO_RCVTIMEO
4828 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004829#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004830#ifdef SO_ERROR
4831 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004832#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004833#ifdef SO_TYPE
4834 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004835#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004836#ifdef SO_SETFIB
4837 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4838#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004840 /* Maximum number of connections for "listen" */
4841#ifdef SOMAXCONN
4842 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004843#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004844 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004845#endif
4846
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004847 /* Flags for send, recv */
4848#ifdef MSG_OOB
4849 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004850#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004851#ifdef MSG_PEEK
4852 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004853#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004854#ifdef MSG_DONTROUTE
4855 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004857#ifdef MSG_DONTWAIT
4858 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004859#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004860#ifdef MSG_EOR
4861 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004862#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004863#ifdef MSG_TRUNC
4864 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004865#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866#ifdef MSG_CTRUNC
4867 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004868#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004869#ifdef MSG_WAITALL
4870 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004871#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004872#ifdef MSG_BTAG
4873 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004874#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004875#ifdef MSG_ETAG
4876 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004877#endif
4878
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004879 /* Protocol level and numbers, usable for [gs]etsockopt */
4880#ifdef SOL_SOCKET
4881 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004882#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004883#ifdef SOL_IP
4884 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004885#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004886 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004887#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004888#ifdef SOL_IPX
4889 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004890#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004891#ifdef SOL_AX25
4892 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004893#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004894#ifdef SOL_ATALK
4895 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004897#ifdef SOL_NETROM
4898 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004900#ifdef SOL_ROSE
4901 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004902#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903#ifdef SOL_TCP
4904 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004905#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004906 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004907#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908#ifdef SOL_UDP
4909 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004910#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004911 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004912#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004913#ifdef IPPROTO_IP
4914 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004915#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004916 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004917#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef IPPROTO_HOPOPTS
4919 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004920#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921#ifdef IPPROTO_ICMP
4922 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004923#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004924 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004925#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004926#ifdef IPPROTO_IGMP
4927 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004928#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004929#ifdef IPPROTO_GGP
4930 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004931#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004932#ifdef IPPROTO_IPV4
4933 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004934#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004935#ifdef IPPROTO_IPV6
4936 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004937#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004938#ifdef IPPROTO_IPIP
4939 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004940#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004941#ifdef IPPROTO_TCP
4942 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004943#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004944 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004945#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004946#ifdef IPPROTO_EGP
4947 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004948#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004949#ifdef IPPROTO_PUP
4950 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004951#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004952#ifdef IPPROTO_UDP
4953 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004954#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004955 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004957#ifdef IPPROTO_IDP
4958 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004959#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004960#ifdef IPPROTO_HELLO
4961 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004962#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004963#ifdef IPPROTO_ND
4964 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004965#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966#ifdef IPPROTO_TP
4967 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969#ifdef IPPROTO_IPV6
4970 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972#ifdef IPPROTO_ROUTING
4973 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef IPPROTO_FRAGMENT
4976 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef IPPROTO_RSVP
4979 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef IPPROTO_GRE
4982 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef IPPROTO_ESP
4985 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef IPPROTO_AH
4988 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef IPPROTO_MOBILE
4991 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef IPPROTO_ICMPV6
4994 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004996#ifdef IPPROTO_NONE
4997 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004998#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004999#ifdef IPPROTO_DSTOPTS
5000 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005001#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005002#ifdef IPPROTO_XTP
5003 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005004#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005005#ifdef IPPROTO_EON
5006 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef IPPROTO_PIM
5009 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005010#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011#ifdef IPPROTO_IPCOMP
5012 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005013#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005014#ifdef IPPROTO_VRRP
5015 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005016#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005017#ifdef IPPROTO_BIP
5018 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005019#endif
5020/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021#ifdef IPPROTO_RAW
5022 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005023#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005024 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005025#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026#ifdef IPPROTO_MAX
5027 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005028#endif
5029
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005030 /* Some port configuration */
5031#ifdef IPPORT_RESERVED
5032 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005033#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005034 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005035#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005036#ifdef IPPORT_USERRESERVED
5037 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005038#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005039 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005040#endif
5041
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005042 /* Some reserved IP v.4 addresses */
5043#ifdef INADDR_ANY
5044 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005045#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005046 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005047#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048#ifdef INADDR_BROADCAST
5049 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005050#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005051 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005052#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005053#ifdef INADDR_LOOPBACK
5054 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005055#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005057#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005058#ifdef INADDR_UNSPEC_GROUP
5059 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005060#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005061 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005062#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005063#ifdef INADDR_ALLHOSTS_GROUP
5064 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5065 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005066#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005067 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005068#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005069#ifdef INADDR_MAX_LOCAL_GROUP
5070 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5071 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005072#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005073 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005075#ifdef INADDR_NONE
5076 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005077#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005079#endif
5080
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081 /* IPv4 [gs]etsockopt options */
5082#ifdef IP_OPTIONS
5083 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005084#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005085#ifdef IP_HDRINCL
5086 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005087#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005088#ifdef IP_TOS
5089 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005090#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005091#ifdef IP_TTL
5092 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005093#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005094#ifdef IP_RECVOPTS
5095 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005096#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005097#ifdef IP_RECVRETOPTS
5098 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005099#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005100#ifdef IP_RECVDSTADDR
5101 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005102#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005103#ifdef IP_RETOPTS
5104 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005105#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005106#ifdef IP_MULTICAST_IF
5107 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005108#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005109#ifdef IP_MULTICAST_TTL
5110 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005111#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005112#ifdef IP_MULTICAST_LOOP
5113 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005114#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005115#ifdef IP_ADD_MEMBERSHIP
5116 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005117#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005118#ifdef IP_DROP_MEMBERSHIP
5119 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005120#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121#ifdef IP_DEFAULT_MULTICAST_TTL
5122 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5123 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005124#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005125#ifdef IP_DEFAULT_MULTICAST_LOOP
5126 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5127 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005128#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129#ifdef IP_MAX_MEMBERSHIPS
5130 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005131#endif
5132
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005133 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5134#ifdef IPV6_JOIN_GROUP
5135 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005136#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005137#ifdef IPV6_LEAVE_GROUP
5138 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005139#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005140#ifdef IPV6_MULTICAST_HOPS
5141 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005142#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005143#ifdef IPV6_MULTICAST_IF
5144 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005145#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005146#ifdef IPV6_MULTICAST_LOOP
5147 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005148#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005149#ifdef IPV6_UNICAST_HOPS
5150 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005151#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005152 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005153#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005154 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005155#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005156 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005157#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005158 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005159#endif
5160#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005162#endif
5163#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005164 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005165#endif
5166#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005167 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005168#endif
5169#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005170 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005171#endif
5172#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005174#endif
5175#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005176 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005177#endif
5178#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005179 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005180#endif
5181#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005182 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005183#endif
5184#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005186#endif
5187#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005189#endif
5190#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005192#endif
5193#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005195#endif
5196#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005197 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005198#endif
5199#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005201#endif
5202#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005204#endif
5205#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005207#endif
5208#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005210#endif
5211#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005213#endif
5214#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005216#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005217
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218 /* TCP options */
5219#ifdef TCP_NODELAY
5220 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005221#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005222#ifdef TCP_MAXSEG
5223 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005224#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005225#ifdef TCP_CORK
5226 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005227#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005228#ifdef TCP_KEEPIDLE
5229 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005230#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005231#ifdef TCP_KEEPINTVL
5232 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005233#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005234#ifdef TCP_KEEPCNT
5235 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005236#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005237#ifdef TCP_SYNCNT
5238 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005239#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005240#ifdef TCP_LINGER2
5241 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef TCP_DEFER_ACCEPT
5244 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005245#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005246#ifdef TCP_WINDOW_CLAMP
5247 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005248#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249#ifdef TCP_INFO
5250 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005251#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005252#ifdef TCP_QUICKACK
5253 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005254#endif
5255
Guido van Rossum09be4091999-08-09 14:40:40 +00005256
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005257 /* IPX options */
5258#ifdef IPX_TYPE
5259 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005260#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005261
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005262 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005263#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005265#endif
5266#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005268#endif
5269#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005271#endif
5272#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005274#endif
5275#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005277#endif
5278#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005280#endif
5281#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005283#endif
5284#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005286#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005287#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005290#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005292#endif
5293#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005295#endif
5296#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005298#endif
5299#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005301#endif
5302#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005304#endif
5305#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005307#endif
5308#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005310#endif
5311#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005313#endif
5314#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005316#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005317#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005319#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005320#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005322#endif
5323#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005325#endif
5326#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005328#endif
5329#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005331#endif
5332#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005334#endif
5335#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005337#endif
5338#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005340#endif
5341#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005342 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005343#endif
5344#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005345 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005346#endif
5347#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005348 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349#endif
5350#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005351 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352#endif
5353#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005354 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005355#endif
5356#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005357 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358#endif
5359
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005360 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005361#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005362 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005363#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005364 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005365#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005366 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005367#endif
5368#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005369 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005370#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005371 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005372#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005374#endif
5375#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005376 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005377#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005378 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005379#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005380 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005381#endif
5382
Christian Heimes04ae9162008-01-04 15:23:30 +00005383#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005384 {
5385 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5386 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5387 int i;
5388 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5389 PyObject *tmp;
5390 tmp = PyLong_FromUnsignedLong(codes[i]);
5391 if (tmp == NULL)
5392 return;
5393 PyModule_AddObject(m, names[i], tmp);
5394 }
5395 }
5396 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5397 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5398 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005399#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005401#endif
5402#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005404#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005405#endif /* _MSTCPIP_ */
5406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005407 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005408#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005410#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005411}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005412
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005413
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005414#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005415#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005416
5417/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005418/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005419
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005420int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005421inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005422{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005423 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005424#if (SIZEOF_INT != 4)
5425#error "Not sure if in_addr_t exists and int is not 32-bits."
5426#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005427 unsigned int packed_addr;
5428 packed_addr = inet_addr(src);
5429 if (packed_addr == INADDR_NONE)
5430 return 0;
5431 memcpy(dst, &packed_addr, 4);
5432 return 1;
5433 }
5434 /* Should set errno to EAFNOSUPPORT */
5435 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005436}
5437
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005438const char *
5439inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005441 if (af == AF_INET) {
5442 struct in_addr packed_addr;
5443 if (size < 16)
5444 /* Should set errno to ENOSPC. */
5445 return NULL;
5446 memcpy(&packed_addr, src, sizeof(packed_addr));
5447 return strncpy(dst, inet_ntoa(packed_addr), size);
5448 }
5449 /* Should set errno to EAFNOSUPPORT */
5450 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005451}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005452
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005453#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005454#endif