blob: 96b83b1150be683db3976faeb09dfcc46f8dc8d5 [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
2247 if (backlog < 1)
2248 backlog = 1;
2249 res = listen(s->sock_fd, backlog);
2250 Py_END_ALLOW_THREADS
2251 if (res < 0)
2252 return s->errorhandler();
2253 Py_INCREF(Py_None);
2254 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002255}
2256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002257PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258"listen(backlog)\n\
2259\n\
2260Enable a server to accept connections. The backlog argument must be at\n\
2261least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002262will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002263
2264
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002265#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002266/* s.makefile(mode) method.
2267 Create a new open file object referring to a dupped version of
2268 the socket's file descriptor. (The dup() call is necessary so
2269 that the open file and socket objects may be closed independent
2270 of each other.)
2271 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2272
Guido van Rossum73624e91994-10-10 17:59:00 +00002273static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002274sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002275{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002276 extern int fclose(FILE *);
2277 char *mode = "r";
2278 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002279#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002280 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002281#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002282 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002283#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002284 FILE *fp;
2285 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002286#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002287 char *mode_r = "r";
2288 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002289#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002290
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002291 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2292 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002293#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002294 if (strcmp(mode,"rb") == 0) {
2295 mode = mode_r;
2296 }
2297 else {
2298 if (strcmp(mode,"wb") == 0) {
2299 mode = mode_w;
2300 }
2301 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002302#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002303#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002304 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2305 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002306#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002307 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002308#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002309 {
2310 if (fd >= 0)
2311 SOCKETCLOSE(fd);
2312 return s->errorhandler();
2313 }
2314 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2315 if (f != NULL)
2316 PyFile_SetBufSize(f, bufsize);
2317 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002318}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002320PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002321"makefile([mode[, buffersize]]) -> file object\n\
2322\n\
2323Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002324The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002326#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002327
Martin Blais2856e5f2006-05-26 12:03:27 +00002328/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002329 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002330 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002331 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002332 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002333 * also possible that we return a number of bytes smaller than the request
2334 * bytes.
2335 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002336static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002337sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2338{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002339 ssize_t outlen = -1;
2340 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002341#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002342 int remaining;
2343 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002344#endif
2345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002346 if (!IS_SELECTABLE(s)) {
2347 select_error();
2348 return -1;
2349 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002350
2351#ifndef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002352 Py_BEGIN_ALLOW_THREADS
2353 timeout = internal_select(s, 0);
2354 if (!timeout)
2355 outlen = recv(s->sock_fd, cbuf, len, flags);
2356 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002357
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002358 if (timeout == 1) {
2359 PyErr_SetString(socket_timeout, "timed out");
2360 return -1;
2361 }
2362 if (outlen < 0) {
2363 /* Note: the call to errorhandler() ALWAYS indirectly returned
2364 NULL, so ignore its return value */
2365 s->errorhandler();
2366 return -1;
2367 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002368#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002369 read_buf = cbuf;
2370 remaining = len;
2371 while (remaining != 0) {
2372 unsigned int segment;
2373 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 segment = remaining /SEGMENT_SIZE;
2376 if (segment != 0) {
2377 segment = SEGMENT_SIZE;
2378 }
2379 else {
2380 segment = remaining;
2381 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002382
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002383 Py_BEGIN_ALLOW_THREADS
2384 timeout = internal_select(s, 0);
2385 if (!timeout)
2386 nread = recv(s->sock_fd, read_buf, segment, flags);
2387 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002389 if (timeout == 1) {
2390 PyErr_SetString(socket_timeout, "timed out");
2391 return -1;
2392 }
2393 if (nread < 0) {
2394 s->errorhandler();
2395 return -1;
2396 }
2397 if (nread != remaining) {
2398 read_buf += nread;
2399 break;
2400 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002402 remaining -= segment;
2403 read_buf += segment;
2404 }
2405 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002406#endif /* !__VMS */
2407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002408 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002409}
2410
Guido van Rossum48a680c2001-03-02 06:34:14 +00002411
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002412/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002413
Guido van Rossum73624e91994-10-10 17:59:00 +00002414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002415sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002416{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002417 int recvlen, flags = 0;
2418 ssize_t outlen;
2419 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002420
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002421 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2422 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 if (recvlen < 0) {
2425 PyErr_SetString(PyExc_ValueError,
2426 "negative buffersize in recv");
2427 return NULL;
2428 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 /* Allocate a new string. */
2431 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2432 if (buf == NULL)
2433 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002435 /* Call the guts */
2436 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2437 if (outlen < 0) {
2438 /* An error occurred, release the string and return an
2439 error. */
2440 Py_DECREF(buf);
2441 return NULL;
2442 }
2443 if (outlen != recvlen) {
2444 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002445 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002446 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002447 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002448 return NULL;
2449 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002450
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002451 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002452}
2453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002454PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002455"recv(buffersize[, flags]) -> data\n\
2456\n\
2457Receive up to buffersize bytes from the socket. For the optional flags\n\
2458argument, see the Unix manual. When no data is available, block until\n\
2459at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461
Guido van Rossum30a685f1991-06-27 15:51:29 +00002462
Martin Blaisaf2ae722006-06-04 13:49:49 +00002463/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002464
Martin Blais2856e5f2006-05-26 12:03:27 +00002465static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002466sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002467{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002468 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002469
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002470 int recvlen = 0, flags = 0;
2471 ssize_t readlen;
2472 Py_buffer buf;
2473 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002475 /* Get the buffer's memory */
2476 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2477 &buf, &recvlen, &flags))
2478 return NULL;
2479 buflen = buf.len;
2480 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002482 if (recvlen < 0) {
2483 PyErr_SetString(PyExc_ValueError,
2484 "negative buffersize in recv_into");
2485 goto error;
2486 }
2487 if (recvlen == 0) {
2488 /* If nbytes was not specified, use the buffer's length */
2489 recvlen = buflen;
2490 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002491
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002492 /* Check if the buffer is large enough */
2493 if (buflen < recvlen) {
2494 PyErr_SetString(PyExc_ValueError,
2495 "buffer too small for requested bytes");
2496 goto error;
2497 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002498
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002499 /* Call the guts */
2500 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2501 if (readlen < 0) {
2502 /* Return an error. */
2503 goto error;
2504 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002506 PyBuffer_Release(&buf);
2507 /* Return the number of bytes read. Note that we do not do anything
2508 special here in the case that readlen < recvlen. */
2509 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002510
2511error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002512 PyBuffer_Release(&buf);
2513 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002514}
2515
Martin Blaisaf2ae722006-06-04 13:49:49 +00002516PyDoc_STRVAR(recv_into_doc,
2517"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002518\n\
2519A version of recv() that stores its data into a buffer rather than creating \n\
2520a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2521is not specified (or 0), receive up to the size available in the given buffer.\n\
2522\n\
2523See recv() for documentation about the flags.");
2524
2525
2526/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002527 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2528 * into a char buffer. If you have any inc/def ref to do to the objects that
2529 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002530 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002531 * that it is also possible that we return a number of bytes smaller than the
2532 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002533 *
2534 * 'addr' is a return value for the address object. Note that you must decref
2535 * it yourself.
2536 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002537static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002538sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002539 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002541 sock_addr_t addrbuf;
2542 int timeout;
2543 ssize_t n = -1;
2544 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002545
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002546 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002547
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002548 if (!getsockaddrlen(s, &addrlen))
2549 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002550
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002551 if (!IS_SELECTABLE(s)) {
2552 select_error();
2553 return -1;
2554 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002555
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002556 Py_BEGIN_ALLOW_THREADS
2557 memset(&addrbuf, 0, addrlen);
2558 timeout = internal_select(s, 0);
2559 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002560#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002561#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002562 n = recvfrom(s->sock_fd, cbuf, len, flags,
2563 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002564#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002565 n = recvfrom(s->sock_fd, cbuf, len, flags,
2566 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002567#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002568#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002569 n = recvfrom(s->sock_fd, cbuf, len, flags,
2570 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002571#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002572 }
2573 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002574
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002575 if (timeout == 1) {
2576 PyErr_SetString(socket_timeout, "timed out");
2577 return -1;
2578 }
2579 if (n < 0) {
2580 s->errorhandler();
2581 return -1;
2582 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002584 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2585 addrlen, s->sock_proto)))
2586 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002588 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002589}
2590
2591/* s.recvfrom(nbytes [,flags]) method */
2592
2593static PyObject *
2594sock_recvfrom(PySocketSockObject *s, PyObject *args)
2595{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002596 PyObject *buf = NULL;
2597 PyObject *addr = NULL;
2598 PyObject *ret = NULL;
2599 int recvlen, flags = 0;
2600 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002601
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002602 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2603 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002604
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002605 if (recvlen < 0) {
2606 PyErr_SetString(PyExc_ValueError,
2607 "negative buffersize in recvfrom");
2608 return NULL;
2609 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002610
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002611 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2612 if (buf == NULL)
2613 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002614
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002615 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2616 recvlen, flags, &addr);
2617 if (outlen < 0) {
2618 goto finally;
2619 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002620
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002621 if (outlen != recvlen) {
2622 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002623 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002624 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002625 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002626 goto finally;
2627 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002628
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002629 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002630
2631finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002632 Py_XDECREF(buf);
2633 Py_XDECREF(addr);
2634 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002635}
2636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002637PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002638"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2639\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002640Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002641
Martin Blais2856e5f2006-05-26 12:03:27 +00002642
Martin Blaisaf2ae722006-06-04 13:49:49 +00002643/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002644
2645static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002646sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002647{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002648 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002649
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002650 int recvlen = 0, flags = 0;
2651 ssize_t readlen;
2652 Py_buffer buf;
2653 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002654
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002655 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002656
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002657 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2658 kwlist, &buf,
2659 &recvlen, &flags))
2660 return NULL;
2661 buflen = buf.len;
2662 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002663
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002664 if (recvlen < 0) {
2665 PyErr_SetString(PyExc_ValueError,
2666 "negative buffersize in recvfrom_into");
2667 goto error;
2668 }
2669 if (recvlen == 0) {
2670 /* If nbytes was not specified, use the buffer's length */
2671 recvlen = buflen;
2672 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002673
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002674 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2675 if (readlen < 0) {
2676 /* Return an error */
2677 goto error;
2678 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002679
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002680 PyBuffer_Release(&buf);
2681 /* Return the number of bytes read and the address. Note that we do
2682 not do anything special here in the case that readlen < recvlen. */
2683 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002684
2685error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002686 Py_XDECREF(addr);
2687 PyBuffer_Release(&buf);
2688 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002689}
2690
Martin Blaisaf2ae722006-06-04 13:49:49 +00002691PyDoc_STRVAR(recvfrom_into_doc,
2692"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002693\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002694Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002695
2696
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002697/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002698
Guido van Rossum73624e91994-10-10 17:59:00 +00002699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002700sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002701{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002702 char *buf;
2703 int len, n = -1, flags = 0, timeout;
2704 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002705
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002706 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2707 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002709 if (!IS_SELECTABLE(s)) {
2710 PyBuffer_Release(&pbuf);
2711 return select_error();
2712 }
2713 buf = pbuf.buf;
2714 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002715
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002716 Py_BEGIN_ALLOW_THREADS
2717 timeout = internal_select(s, 1);
2718 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002719#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002720 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002721#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002722 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002723#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002724 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002725
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002726 PyBuffer_Release(&pbuf);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002728 if (timeout == 1) {
2729 PyErr_SetString(socket_timeout, "timed out");
2730 return NULL;
2731 }
2732 if (n < 0)
2733 return s->errorhandler();
2734 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002735}
2736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002737PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002738"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739\n\
2740Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002741argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002742sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002743
2744
2745/* s.sendall(data [,flags]) method */
2746
2747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002748sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002749{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002750 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002751 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002752 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002753
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002754 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2755 return NULL;
2756 buf = pbuf.buf;
2757 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002758
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002759 if (!IS_SELECTABLE(s)) {
2760 PyBuffer_Release(&pbuf);
2761 return select_error();
2762 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002763
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002764 do {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002765 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002766 timeout = internal_select(s, 1);
2767 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002768 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002769#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002770 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002771#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002772 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002773#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002774 }
2775 Py_END_ALLOW_THREADS
2776 if (timeout == 1) {
2777 PyBuffer_Release(&pbuf);
2778 PyErr_SetString(socket_timeout, "timed out");
2779 return NULL;
2780 }
2781 /* PyErr_CheckSignals() might change errno */
2782 saved_errno = errno;
2783 /* We must run our signal handlers before looping again.
2784 send() can return a successful partial write when it is
2785 interrupted, so we can't restrict ourselves to EINTR. */
2786 if (PyErr_CheckSignals()) {
2787 PyBuffer_Release(&pbuf);
2788 return NULL;
2789 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002790 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002791 /* If interrupted, try again */
2792 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002793 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002794 else
2795 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 }
2797 buf += n;
2798 len -= n;
2799 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002800 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002801
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 if (n < 0)
2803 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002805 Py_INCREF(Py_None);
2806 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002807}
2808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002809PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002810"sendall(data[, flags])\n\
2811\n\
2812Send a data string to the socket. For the optional flags\n\
2813argument, see the Unix manual. This calls send() repeatedly\n\
2814until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002815to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002816
Guido van Rossum30a685f1991-06-27 15:51:29 +00002817
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002818/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002819
Guido van Rossum73624e91994-10-10 17:59:00 +00002820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002821sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002823 Py_buffer pbuf;
2824 PyObject *addro;
2825 char *buf;
2826 Py_ssize_t len;
2827 sock_addr_t addrbuf;
2828 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002829 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002830
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002831 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002832 arglen = PyTuple_Size(args);
2833 switch(arglen) {
2834 case 2:
2835 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2836 break;
2837 case 3:
2838 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2839 break;
2840 default:
2841 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2842 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002843 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002844 if (PyErr_Occurred())
2845 return NULL;
2846
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002847 buf = pbuf.buf;
2848 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002850 if (!IS_SELECTABLE(s)) {
2851 PyBuffer_Release(&pbuf);
2852 return select_error();
2853 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002854
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002855 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2856 PyBuffer_Release(&pbuf);
2857 return NULL;
2858 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002859
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002860 Py_BEGIN_ALLOW_THREADS
2861 timeout = internal_select(s, 1);
2862 if (!timeout)
2863 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2864 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002866 PyBuffer_Release(&pbuf);
2867 if (timeout == 1) {
2868 PyErr_SetString(socket_timeout, "timed out");
2869 return NULL;
2870 }
2871 if (n < 0)
2872 return s->errorhandler();
2873 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002874}
2875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002876PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002877"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002878\n\
2879Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002880For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002881
Guido van Rossum30a685f1991-06-27 15:51:29 +00002882
2883/* s.shutdown(how) method */
2884
Guido van Rossum73624e91994-10-10 17:59:00 +00002885static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002886sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002887{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002888 int how;
2889 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002891 how = PyInt_AsLong(arg);
2892 if (how == -1 && PyErr_Occurred())
2893 return NULL;
2894 Py_BEGIN_ALLOW_THREADS
2895 res = shutdown(s->sock_fd, how);
2896 Py_END_ALLOW_THREADS
2897 if (res < 0)
2898 return s->errorhandler();
2899 Py_INCREF(Py_None);
2900 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002901}
2902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002903PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002904"shutdown(flag)\n\
2905\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002906Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2907of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002908
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002909#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002910static PyObject*
2911sock_ioctl(PySocketSockObject *s, PyObject *arg)
2912{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002913 unsigned long cmd = SIO_RCVALL;
2914 PyObject *argO;
2915 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002916
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002917 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2918 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002919
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002920 switch (cmd) {
2921 case SIO_RCVALL: {
2922 unsigned int option = RCVALL_ON;
2923 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2924 return NULL;
2925 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2926 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2927 return set_error();
2928 }
2929 return PyLong_FromUnsignedLong(recv); }
2930 case SIO_KEEPALIVE_VALS: {
2931 struct tcp_keepalive ka;
2932 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2933 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2934 return NULL;
2935 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2936 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2937 return set_error();
2938 }
2939 return PyLong_FromUnsignedLong(recv); }
2940 default:
2941 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2942 return NULL;
2943 }
Christian Heimes04ae9162008-01-04 15:23:30 +00002944}
2945PyDoc_STRVAR(sock_ioctl_doc,
2946"ioctl(cmd, option) -> long\n\
2947\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00002948Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2949SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2950SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00002951
2952#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002953
2954/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002955
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002956static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002957 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2958 accept_doc},
2959 {"bind", (PyCFunction)sock_bind, METH_O,
2960 bind_doc},
2961 {"close", (PyCFunction)sock_close, METH_NOARGS,
2962 close_doc},
2963 {"connect", (PyCFunction)sock_connect, METH_O,
2964 connect_doc},
2965 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2966 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002967#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002968 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2969 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002970#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002971 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2972 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002973#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002974 {"getpeername", (PyCFunction)sock_getpeername,
2975 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002976#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002977 {"getsockname", (PyCFunction)sock_getsockname,
2978 METH_NOARGS, getsockname_doc},
2979 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2980 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002981#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002982 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2983 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00002984#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002985 {"listen", (PyCFunction)sock_listen, METH_O,
2986 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002987#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002988 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2989 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002990#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002991 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2992 recv_doc},
2993 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2994 recv_into_doc},
2995 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2996 recvfrom_doc},
2997 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2998 recvfrom_into_doc},
2999 {"send", (PyCFunction)sock_send, METH_VARARGS,
3000 send_doc},
3001 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3002 sendall_doc},
3003 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3004 sendto_doc},
3005 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3006 setblocking_doc},
3007 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3008 settimeout_doc},
3009 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3010 gettimeout_doc},
3011 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3012 setsockopt_doc},
3013 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3014 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003015#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003016 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3017 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003018#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003019 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003020};
3021
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003022/* SockObject members */
3023static PyMemberDef sock_memberlist[] = {
3024 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3025 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3026 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3027 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3028 {0},
3029};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003030
Guido van Rossum73624e91994-10-10 17:59:00 +00003031/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003032 First close the file description. */
3033
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003034static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003035sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003036{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003037 if (s->sock_fd != -1)
3038 (void) SOCKETCLOSE(s->sock_fd);
3039 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003040}
3041
Guido van Rossum30a685f1991-06-27 15:51:29 +00003042
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003043static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003045{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003046 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003047#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003048 if (s->sock_fd > LONG_MAX) {
3049 /* this can occur on Win64, and actually there is a special
3050 ugly printf formatter for decimal pointer length integer
3051 printing, only bother if necessary*/
3052 PyErr_SetString(PyExc_OverflowError,
3053 "no printf formatter to display "
3054 "the socket descriptor in decimal");
3055 return NULL;
3056 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003057#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003058 PyOS_snprintf(
3059 buf, sizeof(buf),
3060 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3061 (long)s->sock_fd, s->sock_family,
3062 s->sock_type,
3063 s->sock_proto);
3064 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003065}
3066
3067
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003068/* Create a new, uninitialized socket object. */
3069
3070static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003071sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003072{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003073 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003074
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003075 new = type->tp_alloc(type, 0);
3076 if (new != NULL) {
3077 ((PySocketSockObject *)new)->sock_fd = -1;
3078 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3079 ((PySocketSockObject *)new)->errorhandler = &set_error;
3080 }
3081 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003082}
3083
3084
3085/* Initialize a new socket object. */
3086
3087/*ARGSUSED*/
3088static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003089sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003090{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003091 PySocketSockObject *s = (PySocketSockObject *)self;
3092 SOCKET_T fd;
3093 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3094 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003095
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003096 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3097 "|iii:socket", keywords,
3098 &family, &type, &proto))
3099 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003100
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003101 Py_BEGIN_ALLOW_THREADS
3102 fd = socket(family, type, proto);
3103 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003104
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003105#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003106 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003107#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003108 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003109#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003110 {
3111 set_error();
3112 return -1;
3113 }
3114 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003116 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003117
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003118}
3119
3120
Guido van Rossumb6775db1994-08-01 11:34:53 +00003121/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003122
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003123static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003124 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3125 "_socket.socket", /* tp_name */
3126 sizeof(PySocketSockObject), /* tp_basicsize */
3127 0, /* tp_itemsize */
3128 (destructor)sock_dealloc, /* tp_dealloc */
3129 0, /* tp_print */
3130 0, /* tp_getattr */
3131 0, /* tp_setattr */
3132 0, /* tp_compare */
3133 (reprfunc)sock_repr, /* tp_repr */
3134 0, /* tp_as_number */
3135 0, /* tp_as_sequence */
3136 0, /* tp_as_mapping */
3137 0, /* tp_hash */
3138 0, /* tp_call */
3139 0, /* tp_str */
3140 PyObject_GenericGetAttr, /* tp_getattro */
3141 0, /* tp_setattro */
3142 0, /* tp_as_buffer */
3143 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3144 sock_doc, /* tp_doc */
3145 0, /* tp_traverse */
3146 0, /* tp_clear */
3147 0, /* tp_richcompare */
3148 0, /* tp_weaklistoffset */
3149 0, /* tp_iter */
3150 0, /* tp_iternext */
3151 sock_methods, /* tp_methods */
3152 sock_memberlist, /* tp_members */
3153 0, /* tp_getset */
3154 0, /* tp_base */
3155 0, /* tp_dict */
3156 0, /* tp_descr_get */
3157 0, /* tp_descr_set */
3158 0, /* tp_dictoffset */
3159 sock_initobj, /* tp_init */
3160 PyType_GenericAlloc, /* tp_alloc */
3161 sock_new, /* tp_new */
3162 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003163};
3164
Guido van Rossum30a685f1991-06-27 15:51:29 +00003165
Guido van Rossum81194471991-07-27 21:42:02 +00003166/* Python interface to gethostname(). */
3167
3168/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003169static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003170socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003171{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003172 char buf[1024];
3173 int res;
3174 Py_BEGIN_ALLOW_THREADS
3175 res = gethostname(buf, (int) sizeof buf - 1);
3176 Py_END_ALLOW_THREADS
3177 if (res < 0)
3178 return set_error();
3179 buf[sizeof buf - 1] = '\0';
3180 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003181}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003183PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003184"gethostname() -> string\n\
3185\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003186Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003187
Guido van Rossumff4949e1992-08-05 19:58:53 +00003188
Guido van Rossum30a685f1991-06-27 15:51:29 +00003189/* Python interface to gethostbyname(name). */
3190
3191/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003192static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003193socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003194{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003195 char *name;
3196 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003197
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003198 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3199 return NULL;
3200 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3201 return NULL;
3202 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003203}
3204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003205PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003206"gethostbyname(host) -> address\n\
3207\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003208Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003209
3210
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003211/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3212
3213static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003214gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003215{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003216 char **pch;
3217 PyObject *rtn_tuple = (PyObject *)NULL;
3218 PyObject *name_list = (PyObject *)NULL;
3219 PyObject *addr_list = (PyObject *)NULL;
3220 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003221
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003222 if (h == NULL) {
3223 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003224#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003225 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003226#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003227 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003228#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003229 return NULL;
3230 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003231
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003232 if (h->h_addrtype != af) {
3233 /* Let's get real error message to return */
3234 PyErr_SetString(socket_error,
3235 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003236
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003237 return NULL;
3238 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003239
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003240 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003241
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003242 case AF_INET:
3243 if (alen < sizeof(struct sockaddr_in))
3244 return NULL;
3245 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003246
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003247#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003248 case AF_INET6:
3249 if (alen < sizeof(struct sockaddr_in6))
3250 return NULL;
3251 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003252#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003253
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003254 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003255
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003256 if ((name_list = PyList_New(0)) == NULL)
3257 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003258
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003259 if ((addr_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 /* SF #1511317: h_aliases can be NULL */
3263 if (h->h_aliases) {
3264 for (pch = h->h_aliases; *pch != NULL; pch++) {
3265 int status;
3266 tmp = PyString_FromString(*pch);
3267 if (tmp == NULL)
3268 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003269
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003270 status = PyList_Append(name_list, tmp);
3271 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003272
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003273 if (status)
3274 goto err;
3275 }
3276 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003277
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003278 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3279 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003280
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003281 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003282
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003283 case AF_INET:
3284 {
3285 struct sockaddr_in sin;
3286 memset(&sin, 0, sizeof(sin));
3287 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003288#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003289 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003290#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003291 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3292 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003293
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003294 if (pch == h->h_addr_list && alen >= sizeof(sin))
3295 memcpy((char *) addr, &sin, sizeof(sin));
3296 break;
3297 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003298
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003299#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003300 case AF_INET6:
3301 {
3302 struct sockaddr_in6 sin6;
3303 memset(&sin6, 0, sizeof(sin6));
3304 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003306 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003307#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003308 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3309 tmp = makeipaddr((struct sockaddr *)&sin6,
3310 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003311
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003312 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3313 memcpy((char *) addr, &sin6, sizeof(sin6));
3314 break;
3315 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003316#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003318 default: /* can't happen */
3319 PyErr_SetString(socket_error,
3320 "unsupported address family");
3321 return NULL;
3322 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 if (tmp == NULL)
3325 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003326
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003327 status = PyList_Append(addr_list, tmp);
3328 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003329
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003330 if (status)
3331 goto err;
3332 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003333
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003334 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003335
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003336 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003337 Py_XDECREF(name_list);
3338 Py_XDECREF(addr_list);
3339 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003340}
3341
3342
3343/* Python interface to gethostbyname_ex(name). */
3344
3345/*ARGSUSED*/
3346static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003347socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003348{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003349 char *name;
3350 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003351#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003352 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003353#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003354 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003355#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003356 struct sockaddr *sa;
3357 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003358#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003359 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003360#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003361 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003362#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003363 char buf[16384];
3364 int buf_len = (sizeof buf) - 1;
3365 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003366#endif
3367#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003368 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003369#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003370#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003371
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003372 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3373 return NULL;
3374 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3375 return NULL;
3376 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003377#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003378#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003379 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3380 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003381#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003382 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003383#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003384 memset((void *) &data, '\0', sizeof(data));
3385 result = gethostbyname_r(name, &hp_allocated, &data);
3386 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003387#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003388#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003389#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003390 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003391#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003392 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003393#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003394 Py_END_ALLOW_THREADS
3395 /* Some C libraries would require addr.__ss_family instead of
3396 addr.ss_family.
3397 Therefore, we cast the sockaddr_storage into sockaddr to
3398 access sa_family. */
3399 sa = (struct sockaddr*)&addr;
3400 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3401 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003402#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003403 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003404#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003405 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003406}
3407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003408PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003409"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3410\n\
3411Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003412for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003413
3414
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003415/* Python interface to gethostbyaddr(IP). */
3416
3417/*ARGSUSED*/
3418static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003419socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003420{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003421#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003422 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003423#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003424 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003425#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003426 struct sockaddr *sa = (struct sockaddr *)&addr;
3427 char *ip_num;
3428 struct hostent *h;
3429 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003430#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003431 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003432#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003433 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003434#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003435 /* glibcs up to 2.10 assume that the buf argument to
3436 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3437 does not ensure. The attribute below instructs the compiler
3438 to maintain this alignment. */
3439 char buf[16384] Py_ALIGNED(8);
3440 int buf_len = (sizeof buf) - 1;
3441 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003442#endif
3443#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003444 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003445#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003446#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003447 char *ap;
3448 int al;
3449 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003450
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003451 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3452 return NULL;
3453 af = AF_UNSPEC;
3454 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3455 return NULL;
3456 af = sa->sa_family;
3457 ap = NULL;
3458 switch (af) {
3459 case AF_INET:
3460 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3461 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3462 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003463#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003464 case AF_INET6:
3465 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3466 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3467 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003468#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003469 default:
3470 PyErr_SetString(socket_error, "unsupported address family");
3471 return NULL;
3472 }
3473 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003474#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003475#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003476 result = gethostbyaddr_r(ap, al, af,
3477 &hp_allocated, buf, buf_len,
3478 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003479#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003480 h = gethostbyaddr_r(ap, al, af,
3481 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003482#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003483 memset((void *) &data, '\0', sizeof(data));
3484 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3485 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003486#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003487#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003488#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003489 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003490#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003491 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003492#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003493 Py_END_ALLOW_THREADS
3494 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003495#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003496 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003497#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003498 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003499}
3500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003501PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003502"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3503\n\
3504Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003505for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003506
Guido van Rossum30a685f1991-06-27 15:51:29 +00003507
3508/* Python interface to getservbyname(name).
3509 This only returns the port number, since the other info is already
3510 known or not useful (like the list of aliases). */
3511
3512/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003514socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003515{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003516 char *name, *proto=NULL;
3517 struct servent *sp;
3518 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3519 return NULL;
3520 Py_BEGIN_ALLOW_THREADS
3521 sp = getservbyname(name, proto);
3522 Py_END_ALLOW_THREADS
3523 if (sp == NULL) {
3524 PyErr_SetString(socket_error, "service/proto not found");
3525 return NULL;
3526 }
3527 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003528}
3529
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003530PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003531"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003532\n\
3533Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003534The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3535otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003536
Guido van Rossum30a685f1991-06-27 15:51:29 +00003537
Barry Warsaw11b91a02004-06-28 00:50:43 +00003538/* Python interface to getservbyport(port).
3539 This only returns the service name, since the other info is already
3540 known or not useful (like the list of aliases). */
3541
3542/*ARGSUSED*/
3543static PyObject *
3544socket_getservbyport(PyObject *self, PyObject *args)
3545{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003546 int port;
3547 char *proto=NULL;
3548 struct servent *sp;
3549 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3550 return NULL;
3551 if (port < 0 || port > 0xffff) {
3552 PyErr_SetString(
3553 PyExc_OverflowError,
3554 "getservbyport: port must be 0-65535.");
3555 return NULL;
3556 }
3557 Py_BEGIN_ALLOW_THREADS
3558 sp = getservbyport(htons((short)port), proto);
3559 Py_END_ALLOW_THREADS
3560 if (sp == NULL) {
3561 PyErr_SetString(socket_error, "port/proto not found");
3562 return NULL;
3563 }
3564 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003565}
3566
3567PyDoc_STRVAR(getservbyport_doc,
3568"getservbyport(port[, protocolname]) -> string\n\
3569\n\
3570Return the service name from a port number and protocol name.\n\
3571The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3572otherwise any protocol will match.");
3573
Guido van Rossum3901d851996-12-19 16:35:04 +00003574/* Python interface to getprotobyname(name).
3575 This only returns the protocol number, since the other info is
3576 already known or not useful (like the list of aliases). */
3577
3578/*ARGSUSED*/
3579static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003580socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003581{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003582 char *name;
3583 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003584#ifdef __BEOS__
3585/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003586 PyErr_SetString(socket_error, "getprotobyname not supported");
3587 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003588#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003589 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3590 return NULL;
3591 Py_BEGIN_ALLOW_THREADS
3592 sp = getprotobyname(name);
3593 Py_END_ALLOW_THREADS
3594 if (sp == NULL) {
3595 PyErr_SetString(socket_error, "protocol not found");
3596 return NULL;
3597 }
3598 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003599#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003600}
3601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003602PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003603"getprotobyname(name) -> integer\n\
3604\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003605Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003606
Guido van Rossum3901d851996-12-19 16:35:04 +00003607
Dave Cole331708b2004-08-09 04:51:41 +00003608#ifdef HAVE_SOCKETPAIR
3609/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003610 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003611 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003612
3613/*ARGSUSED*/
3614static PyObject *
3615socket_socketpair(PyObject *self, PyObject *args)
3616{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003617 PySocketSockObject *s0 = NULL, *s1 = NULL;
3618 SOCKET_T sv[2];
3619 int family, type = SOCK_STREAM, proto = 0;
3620 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003621
3622#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003623 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003624#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003625 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003626#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003627 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3628 &family, &type, &proto))
3629 return NULL;
3630 /* Create a pair of socket fds */
3631 if (socketpair(family, type, proto, sv) < 0)
3632 return set_error();
3633 s0 = new_sockobject(sv[0], family, type, proto);
3634 if (s0 == NULL)
3635 goto finally;
3636 s1 = new_sockobject(sv[1], family, type, proto);
3637 if (s1 == NULL)
3638 goto finally;
3639 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003640
3641finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003642 if (res == NULL) {
3643 if (s0 == NULL)
3644 SOCKETCLOSE(sv[0]);
3645 if (s1 == NULL)
3646 SOCKETCLOSE(sv[1]);
3647 }
3648 Py_XDECREF(s0);
3649 Py_XDECREF(s1);
3650 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003651}
3652
3653PyDoc_STRVAR(socketpair_doc,
3654"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3655\n\
3656Create a pair of socket objects from the sockets returned by the platform\n\
3657socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003658The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003659AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003660
3661#endif /* HAVE_SOCKETPAIR */
3662
3663
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003664#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003665/* Create a socket object from a numeric file description.
3666 Useful e.g. if stdin is a socket.
3667 Additional arguments as for socket(). */
3668
3669/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003670static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003671socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003672{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003673 PySocketSockObject *s;
3674 SOCKET_T fd;
3675 int family, type, proto = 0;
3676 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3677 &fd, &family, &type, &proto))
3678 return NULL;
3679 /* Dup the fd so it and the socket can be closed independently */
3680 fd = dup(fd);
3681 if (fd < 0)
3682 return set_error();
3683 s = new_sockobject(fd, family, type, proto);
3684 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003685}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003687PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003688"fromfd(fd, family, type[, proto]) -> socket object\n\
3689\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003690Create a socket object from a duplicate of the given\n\
3691file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003692The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003693
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003694#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003695
Guido van Rossum82a5c661998-07-07 20:45:43 +00003696
Guido van Rossum006bf911996-06-12 04:04:55 +00003697static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003698socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003700 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003701
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003702 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3703 return NULL;
3704 }
3705 if (x1 < 0) {
3706 PyErr_SetString(PyExc_OverflowError,
3707 "can't convert negative number to unsigned long");
3708 return NULL;
3709 }
3710 x2 = (unsigned int)ntohs((unsigned short)x1);
3711 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003712}
3713
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003714PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003715"ntohs(integer) -> integer\n\
3716\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003717Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003718
3719
Guido van Rossum006bf911996-06-12 04:04:55 +00003720static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003721socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003722{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003723 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003724
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003725 if (PyInt_Check(arg)) {
3726 x = PyInt_AS_LONG(arg);
3727 if (x == (unsigned long) -1 && PyErr_Occurred())
3728 return NULL;
3729 if ((long)x < 0) {
3730 PyErr_SetString(PyExc_OverflowError,
3731 "can't convert negative number to unsigned long");
3732 return NULL;
3733 }
3734 }
3735 else if (PyLong_Check(arg)) {
3736 x = PyLong_AsUnsignedLong(arg);
3737 if (x == (unsigned long) -1 && PyErr_Occurred())
3738 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003739#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003740 {
3741 unsigned long y;
3742 /* only want the trailing 32 bits */
3743 y = x & 0xFFFFFFFFUL;
3744 if (y ^ x)
3745 return PyErr_Format(PyExc_OverflowError,
3746 "long int larger than 32 bits");
3747 x = y;
3748 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003749#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003750 }
3751 else
3752 return PyErr_Format(PyExc_TypeError,
3753 "expected int/long, %s found",
3754 Py_TYPE(arg)->tp_name);
3755 if (x == (unsigned long) -1 && PyErr_Occurred())
3756 return NULL;
3757 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003758}
3759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003760PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003761"ntohl(integer) -> integer\n\
3762\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003763Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003764
3765
Guido van Rossum006bf911996-06-12 04:04:55 +00003766static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003767socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003768{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003769 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003770
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003771 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3772 return NULL;
3773 }
3774 if (x1 < 0) {
3775 PyErr_SetString(PyExc_OverflowError,
3776 "can't convert negative number to unsigned long");
3777 return NULL;
3778 }
3779 x2 = (unsigned int)htons((unsigned short)x1);
3780 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003781}
3782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003783PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003784"htons(integer) -> integer\n\
3785\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003786Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003787
3788
Guido van Rossum006bf911996-06-12 04:04:55 +00003789static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003790socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003791{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003792 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003793
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003794 if (PyInt_Check(arg)) {
3795 x = PyInt_AS_LONG(arg);
3796 if (x == (unsigned long) -1 && PyErr_Occurred())
3797 return NULL;
3798 if ((long)x < 0) {
3799 PyErr_SetString(PyExc_OverflowError,
3800 "can't convert negative number to unsigned long");
3801 return NULL;
3802 }
3803 }
3804 else if (PyLong_Check(arg)) {
3805 x = PyLong_AsUnsignedLong(arg);
3806 if (x == (unsigned long) -1 && PyErr_Occurred())
3807 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003808#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003809 {
3810 unsigned long y;
3811 /* only want the trailing 32 bits */
3812 y = x & 0xFFFFFFFFUL;
3813 if (y ^ x)
3814 return PyErr_Format(PyExc_OverflowError,
3815 "long int larger than 32 bits");
3816 x = y;
3817 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003818#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003819 }
3820 else
3821 return PyErr_Format(PyExc_TypeError,
3822 "expected int/long, %s found",
3823 Py_TYPE(arg)->tp_name);
3824 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003825}
3826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003827PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003828"htonl(integer) -> integer\n\
3829\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003830Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003831
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003832/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003834PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003835"inet_aton(string) -> packed 32-bit IP representation\n\
3836\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003837Convert 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 +00003838binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003839
3840static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003841socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003842{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003843#ifndef INADDR_NONE
3844#define INADDR_NONE (-1)
3845#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003846#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003847 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003848#endif
3849
3850#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003851#if (SIZEOF_INT != 4)
3852#error "Not sure if in_addr_t exists and int is not 32-bits."
3853#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003854 /* Have to use inet_addr() instead */
3855 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003857 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003858
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003859 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3860 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003861
Tim Peters1df9fdd2003-02-13 03:13:40 +00003862
3863#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003864
3865#ifdef USE_INET_ATON_WEAKLINK
3866 if (inet_aton != NULL) {
3867#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003868 if (inet_aton(ip_addr, &buf))
3869 return PyString_FromStringAndSize((char *)(&buf),
3870 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003871
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003872 PyErr_SetString(socket_error,
3873 "illegal IP address string passed to inet_aton");
3874 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003875
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003876#ifdef USE_INET_ATON_WEAKLINK
3877 } else {
3878#endif
3879
3880#endif
3881
3882#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3883
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003884 /* special-case this address as inet_addr might return INADDR_NONE
3885 * for this */
3886 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3887 packed_addr = 0xFFFFFFFF;
3888 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003890 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003891
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003892 if (packed_addr == INADDR_NONE) { /* invalid address */
3893 PyErr_SetString(socket_error,
3894 "illegal IP address string passed to inet_aton");
3895 return NULL;
3896 }
3897 }
3898 return PyString_FromStringAndSize((char *) &packed_addr,
3899 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003900
3901#ifdef USE_INET_ATON_WEAKLINK
3902 }
3903#endif
3904
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003905#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003906}
3907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003908PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003909"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003910\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003911Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003912
3913static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003914socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003915{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003916 char *packed_str;
3917 int addr_len;
3918 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003919
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003920 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
3921 return NULL;
3922 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003923
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003924 if (addr_len != sizeof(packed_addr)) {
3925 PyErr_SetString(socket_error,
3926 "packed IP wrong length for inet_ntoa");
3927 return NULL;
3928 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003929
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003930 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003931
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003932 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003933}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003934
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003935#ifdef HAVE_INET_PTON
3936
3937PyDoc_STRVAR(inet_pton_doc,
3938"inet_pton(af, ip) -> packed IP address string\n\
3939\n\
3940Convert an IP address from string format to a packed string suitable\n\
3941for use with low-level network functions.");
3942
3943static PyObject *
3944socket_inet_pton(PyObject *self, PyObject *args)
3945{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003946 int af;
3947 char* ip;
3948 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003949#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003950 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003951#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003954 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3955 return NULL;
3956 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003957
Martin v. Löwis04697e82004-06-02 12:35:29 +00003958#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003959 if(af == AF_INET6) {
3960 PyErr_SetString(socket_error,
3961 "can't use AF_INET6, IPv6 is disabled");
3962 return NULL;
3963 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003964#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003965
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003966 retval = inet_pton(af, ip, packed);
3967 if (retval < 0) {
3968 PyErr_SetFromErrno(socket_error);
3969 return NULL;
3970 } else if (retval == 0) {
3971 PyErr_SetString(socket_error,
3972 "illegal IP address string passed to inet_pton");
3973 return NULL;
3974 } else if (af == AF_INET) {
3975 return PyString_FromStringAndSize(packed,
3976 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003977#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003978 } else if (af == AF_INET6) {
3979 return PyString_FromStringAndSize(packed,
3980 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003981#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003982 } else {
3983 PyErr_SetString(socket_error, "unknown address family");
3984 return NULL;
3985 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003986}
Martin Blais2856e5f2006-05-26 12:03:27 +00003987
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003988PyDoc_STRVAR(inet_ntop_doc,
3989"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3990\n\
3991Convert a packed IP address of the given family to string format.");
3992
3993static PyObject *
3994socket_inet_ntop(PyObject *self, PyObject *args)
3995{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003996 int af;
3997 char* packed;
3998 int len;
3999 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004000#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004001 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004002#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004003 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004004#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004005
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004006 /* Guarantee NUL-termination for PyString_FromString() below */
4007 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004008
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004009 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4010 return NULL;
4011 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004012
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004013 if (af == AF_INET) {
4014 if (len != sizeof(struct in_addr)) {
4015 PyErr_SetString(PyExc_ValueError,
4016 "invalid length of packed IP address string");
4017 return NULL;
4018 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004019#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004020 } else if (af == AF_INET6) {
4021 if (len != sizeof(struct in6_addr)) {
4022 PyErr_SetString(PyExc_ValueError,
4023 "invalid length of packed IP address string");
4024 return NULL;
4025 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004026#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004027 } else {
4028 PyErr_Format(PyExc_ValueError,
4029 "unknown address family %d", af);
4030 return NULL;
4031 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004032
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004033 retval = inet_ntop(af, packed, ip, sizeof(ip));
4034 if (!retval) {
4035 PyErr_SetFromErrno(socket_error);
4036 return NULL;
4037 } else {
4038 return PyString_FromString(retval);
4039 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004040
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004041 /* NOTREACHED */
4042 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4043 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004044}
4045
4046#endif /* HAVE_INET_PTON */
4047
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004048/* Python interface to getaddrinfo(host, port). */
4049
4050/*ARGSUSED*/
4051static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004052socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004053{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004054 struct addrinfo hints, *res;
4055 struct addrinfo *res0 = NULL;
4056 PyObject *hobj = NULL;
4057 PyObject *pobj = (PyObject *)NULL;
4058 char pbuf[30];
4059 char *hptr, *pptr;
4060 int family, socktype, protocol, flags;
4061 int error;
4062 PyObject *all = (PyObject *)NULL;
4063 PyObject *single = (PyObject *)NULL;
4064 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004065
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004066 family = socktype = protocol = flags = 0;
4067 family = AF_UNSPEC;
4068 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4069 &hobj, &pobj, &family, &socktype,
4070 &protocol, &flags)) {
4071 return NULL;
4072 }
4073 if (hobj == Py_None) {
4074 hptr = NULL;
4075 } else if (PyUnicode_Check(hobj)) {
4076 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4077 if (!idna)
4078 return NULL;
4079 hptr = PyString_AsString(idna);
4080 } else if (PyString_Check(hobj)) {
4081 hptr = PyString_AsString(hobj);
4082 } else {
4083 PyErr_SetString(PyExc_TypeError,
4084 "getaddrinfo() argument 1 must be string or None");
4085 return NULL;
4086 }
4087 if (PyInt_Check(pobj)) {
4088 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
4089 pptr = pbuf;
4090 } else if (PyString_Check(pobj)) {
4091 pptr = PyString_AsString(pobj);
4092 } else if (pobj == Py_None) {
4093 pptr = (char *)NULL;
4094 } else {
4095 PyErr_SetString(socket_error, "Int or String expected");
4096 goto err;
4097 }
4098 memset(&hints, 0, sizeof(hints));
4099 hints.ai_family = family;
4100 hints.ai_socktype = socktype;
4101 hints.ai_protocol = protocol;
4102 hints.ai_flags = flags;
4103 Py_BEGIN_ALLOW_THREADS
4104 ACQUIRE_GETADDRINFO_LOCK
4105 error = getaddrinfo(hptr, pptr, &hints, &res0);
4106 Py_END_ALLOW_THREADS
4107 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4108 if (error) {
4109 set_gaierror(error);
4110 goto err;
4111 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004112
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004113 if ((all = PyList_New(0)) == NULL)
4114 goto err;
4115 for (res = res0; res; res = res->ai_next) {
4116 PyObject *addr =
4117 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4118 if (addr == NULL)
4119 goto err;
4120 single = Py_BuildValue("iiisO", res->ai_family,
4121 res->ai_socktype, res->ai_protocol,
4122 res->ai_canonname ? res->ai_canonname : "",
4123 addr);
4124 Py_DECREF(addr);
4125 if (single == NULL)
4126 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004127
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004128 if (PyList_Append(all, single))
4129 goto err;
4130 Py_XDECREF(single);
4131 }
4132 Py_XDECREF(idna);
4133 if (res0)
4134 freeaddrinfo(res0);
4135 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004136 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004137 Py_XDECREF(single);
4138 Py_XDECREF(all);
4139 Py_XDECREF(idna);
4140 if (res0)
4141 freeaddrinfo(res0);
4142 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004143}
4144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004145PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004146"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4147 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004148\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004149Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004150
4151/* Python interface to getnameinfo(sa, flags). */
4152
4153/*ARGSUSED*/
4154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004155socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004156{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004157 PyObject *sa = (PyObject *)NULL;
4158 int flags;
4159 char *hostp;
4160 int port, flowinfo, scope_id;
4161 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4162 struct addrinfo hints, *res = NULL;
4163 int error;
4164 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004165
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004166 flags = flowinfo = scope_id = 0;
4167 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4168 return NULL;
4169 if (!PyTuple_Check(sa)) {
4170 PyErr_SetString(PyExc_TypeError,
4171 "getnameinfo() argument 1 must be a tuple");
4172 return NULL;
4173 }
4174 if (!PyArg_ParseTuple(sa, "si|ii",
4175 &hostp, &port, &flowinfo, &scope_id))
4176 return NULL;
4177 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4178 memset(&hints, 0, sizeof(hints));
4179 hints.ai_family = AF_UNSPEC;
4180 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4181 Py_BEGIN_ALLOW_THREADS
4182 ACQUIRE_GETADDRINFO_LOCK
4183 error = getaddrinfo(hostp, pbuf, &hints, &res);
4184 Py_END_ALLOW_THREADS
4185 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4186 if (error) {
4187 set_gaierror(error);
4188 goto fail;
4189 }
4190 if (res->ai_next) {
4191 PyErr_SetString(socket_error,
4192 "sockaddr resolved to multiple addresses");
4193 goto fail;
4194 }
4195 switch (res->ai_family) {
4196 case AF_INET:
4197 {
4198 if (PyTuple_GET_SIZE(sa) != 2) {
4199 PyErr_SetString(socket_error,
4200 "IPv4 sockaddr must be 2 tuple");
4201 goto fail;
4202 }
4203 break;
4204 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004205#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004206 case AF_INET6:
4207 {
4208 struct sockaddr_in6 *sin6;
4209 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4210 sin6->sin6_flowinfo = flowinfo;
4211 sin6->sin6_scope_id = scope_id;
4212 break;
4213 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004215 }
4216 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4217 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4218 if (error) {
4219 set_gaierror(error);
4220 goto fail;
4221 }
4222 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004223
4224fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004225 if (res)
4226 freeaddrinfo(res);
4227 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004228}
4229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004230PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004231"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004233Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004234
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004235
4236/* Python API to getting and setting the default timeout value. */
4237
4238static PyObject *
4239socket_getdefaulttimeout(PyObject *self)
4240{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004241 if (defaulttimeout < 0.0) {
4242 Py_INCREF(Py_None);
4243 return Py_None;
4244 }
4245 else
4246 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004247}
4248
4249PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004250"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004251\n\
4252Returns the default timeout in floating seconds for new socket objects.\n\
4253A value of None indicates that new socket objects have no timeout.\n\
4254When the socket module is first imported, the default is None.");
4255
4256static PyObject *
4257socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4258{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004259 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004260
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004261 if (arg == Py_None)
4262 timeout = -1.0;
4263 else {
4264 timeout = PyFloat_AsDouble(arg);
4265 if (timeout < 0.0) {
4266 if (!PyErr_Occurred())
4267 PyErr_SetString(PyExc_ValueError,
4268 "Timeout value out of range");
4269 return NULL;
4270 }
4271 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004272
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004273 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004274
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004275 Py_INCREF(Py_None);
4276 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004277}
4278
4279PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004280"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004281\n\
4282Set the default timeout in floating seconds for new socket objects.\n\
4283A value of None indicates that new socket objects have no timeout.\n\
4284When the socket module is first imported, the default is None.");
4285
4286
Guido van Rossum30a685f1991-06-27 15:51:29 +00004287/* List of functions exported by this module. */
4288
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004289static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004290 {"gethostbyname", socket_gethostbyname,
4291 METH_VARARGS, gethostbyname_doc},
4292 {"gethostbyname_ex", socket_gethostbyname_ex,
4293 METH_VARARGS, ghbn_ex_doc},
4294 {"gethostbyaddr", socket_gethostbyaddr,
4295 METH_VARARGS, gethostbyaddr_doc},
4296 {"gethostname", socket_gethostname,
4297 METH_NOARGS, gethostname_doc},
4298 {"getservbyname", socket_getservbyname,
4299 METH_VARARGS, getservbyname_doc},
4300 {"getservbyport", socket_getservbyport,
4301 METH_VARARGS, getservbyport_doc},
4302 {"getprotobyname", socket_getprotobyname,
4303 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004304#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004305 {"fromfd", socket_fromfd,
4306 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004307#endif
Dave Cole331708b2004-08-09 04:51:41 +00004308#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004309 {"socketpair", socket_socketpair,
4310 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004311#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004312 {"ntohs", socket_ntohs,
4313 METH_VARARGS, ntohs_doc},
4314 {"ntohl", socket_ntohl,
4315 METH_O, ntohl_doc},
4316 {"htons", socket_htons,
4317 METH_VARARGS, htons_doc},
4318 {"htonl", socket_htonl,
4319 METH_O, htonl_doc},
4320 {"inet_aton", socket_inet_aton,
4321 METH_VARARGS, inet_aton_doc},
4322 {"inet_ntoa", socket_inet_ntoa,
4323 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004324#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004325 {"inet_pton", socket_inet_pton,
4326 METH_VARARGS, inet_pton_doc},
4327 {"inet_ntop", socket_inet_ntop,
4328 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004329#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004330 {"getaddrinfo", socket_getaddrinfo,
4331 METH_VARARGS, getaddrinfo_doc},
4332 {"getnameinfo", socket_getnameinfo,
4333 METH_VARARGS, getnameinfo_doc},
4334 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4335 METH_NOARGS, getdefaulttimeout_doc},
4336 {"setdefaulttimeout", socket_setdefaulttimeout,
4337 METH_O, setdefaulttimeout_doc},
4338 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004339};
4340
Guido van Rossum30a685f1991-06-27 15:51:29 +00004341
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004342#ifdef RISCOS
4343#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004344
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004345static int
4346os_init(void)
4347{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004348 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004349
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004350 r.r[0] = 0;
4351 _kernel_swi(0x43380, &r, &r);
4352 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004353
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004354 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004355}
4356
4357#endif /* RISCOS */
4358
4359
4360#ifdef MS_WINDOWS
4361#define OS_INIT_DEFINED
4362
4363/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004364
4365static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004366os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004367{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004368 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004369}
4370
4371static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004372os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004373{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004374 WSADATA WSAData;
4375 int ret;
4376 char buf[100];
4377 ret = WSAStartup(0x0101, &WSAData);
4378 switch (ret) {
4379 case 0: /* No error */
4380 Py_AtExit(os_cleanup);
4381 return 1; /* Success */
4382 case WSASYSNOTREADY:
4383 PyErr_SetString(PyExc_ImportError,
4384 "WSAStartup failed: network not ready");
4385 break;
4386 case WSAVERNOTSUPPORTED:
4387 case WSAEINVAL:
4388 PyErr_SetString(
4389 PyExc_ImportError,
4390 "WSAStartup failed: requested version not supported");
4391 break;
4392 default:
4393 PyOS_snprintf(buf, sizeof(buf),
4394 "WSAStartup failed: error code %d", ret);
4395 PyErr_SetString(PyExc_ImportError, buf);
4396 break;
4397 }
4398 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004399}
4400
Guido van Rossum8d665e61996-06-26 18:22:49 +00004401#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004402
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004403
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004404#ifdef PYOS_OS2
4405#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004406
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004407/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004408
4409static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004410os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004411{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004412#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004413 char reason[64];
4414 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004415
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004416 if (rc == 0) {
4417 return 1; /* Success */
4418 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004419
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004420 PyOS_snprintf(reason, sizeof(reason),
4421 "OS/2 TCP/IP Error# %d", sock_errno());
4422 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004424 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004425#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004426 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004427 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004428#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004429}
4430
4431#endif /* PYOS_OS2 */
4432
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004433
4434#ifndef OS_INIT_DEFINED
4435static int
4436os_init(void)
4437{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004438 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004439}
4440#endif
4441
4442
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004443/* C API table - always add new things to the end for binary
4444 compatibility. */
4445static
4446PySocketModule_APIObject PySocketModuleAPI =
4447{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004448 &sock_type,
4449 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004450};
4451
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004452
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004453/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004454
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004455 This module is actually called "_socket", and there's a wrapper
4456 "socket.py" which implements some additional functionality. On some
4457 platforms (e.g. Windows and OS/2), socket.py also implements a
4458 wrapper for the socket type that provides missing functionality such
4459 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4460 with an ImportError exception if os-specific initialization fails.
4461 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004462 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004463 made at exit time.
4464*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004465
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004466PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004467"Implementation module for socket operations.\n\
4468\n\
4469See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004470
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004471PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004472init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004473{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004474 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004475
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004476 if (!os_init())
4477 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004479 Py_TYPE(&sock_type) = &PyType_Type;
4480 m = Py_InitModule3(PySocket_MODULE_NAME,
4481 socket_methods,
4482 socket_doc);
4483 if (m == NULL)
4484 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004485
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004486 socket_error = PyErr_NewException("socket.error",
4487 PyExc_IOError, NULL);
4488 if (socket_error == NULL)
4489 return;
4490 PySocketModuleAPI.error = socket_error;
4491 Py_INCREF(socket_error);
4492 PyModule_AddObject(m, "error", socket_error);
4493 socket_herror = PyErr_NewException("socket.herror",
4494 socket_error, NULL);
4495 if (socket_herror == NULL)
4496 return;
4497 Py_INCREF(socket_herror);
4498 PyModule_AddObject(m, "herror", socket_herror);
4499 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4500 NULL);
4501 if (socket_gaierror == NULL)
4502 return;
4503 Py_INCREF(socket_gaierror);
4504 PyModule_AddObject(m, "gaierror", socket_gaierror);
4505 socket_timeout = PyErr_NewException("socket.timeout",
4506 socket_error, NULL);
4507 if (socket_timeout == NULL)
4508 return;
4509 Py_INCREF(socket_timeout);
4510 PyModule_AddObject(m, "timeout", socket_timeout);
4511 Py_INCREF((PyObject *)&sock_type);
4512 if (PyModule_AddObject(m, "SocketType",
4513 (PyObject *)&sock_type) != 0)
4514 return;
4515 Py_INCREF((PyObject *)&sock_type);
4516 if (PyModule_AddObject(m, "socket",
4517 (PyObject *)&sock_type) != 0)
4518 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004519
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004520#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004521 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004522#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004523 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004524#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004525 Py_INCREF(has_ipv6);
4526 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004527
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004528 /* Export C API */
4529 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4530 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4531 ) != 0)
4532 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004533
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004534 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004535#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004536 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004537#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004538 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004539#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004540 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004541#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004542#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004543 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004544#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004545#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004546 /* Amateur Radio AX.25 */
4547 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004548#endif
4549#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004550 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004551#endif
4552#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004553 /* Appletalk DDP */
4554 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004555#endif
4556#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004557 /* Amateur radio NetROM */
4558 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004559#endif
4560#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004561 /* Multiprotocol bridge */
4562 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004563#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004564#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004565 /* ATM PVCs */
4566 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004567#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004568#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004569 /* Reserved for Werner's ATM */
4570 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004571#endif
4572#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004573 /* Reserved for X.25 project */
4574 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004575#endif
4576#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004577 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004578#endif
4579#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004580 /* Amateur Radio X.25 PLP */
4581 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004582#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004583#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004584 /* Reserved for DECnet project */
4585 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004586#endif
4587#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004588 /* Reserved for 802.2LLC project */
4589 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004590#endif
4591#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004592 /* Security callback pseudo AF */
4593 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004594#endif
4595#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004596 /* PF_KEY key management API */
4597 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004598#endif
4599#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004600 /* */
4601 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4602 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004603#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004604 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004605#endif
4606#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004607 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004608#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004609 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4610 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004611#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004612 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004613#endif
4614#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004615 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004616#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004617#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004618 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004619#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004620#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004621 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004622#endif
4623#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004624 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004625#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004626 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004627#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004628 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4629#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004630#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004631 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004632#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004633#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004634#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004635 /* Alias to emulate 4.4BSD */
4636 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004637#endif
4638#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004639 /* Ash */
4640 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004641#endif
4642#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004643 /* Acorn Econet */
4644 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004645#endif
4646#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004647 /* ATM SVCs */
4648 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004649#endif
4650#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004651 /* Linux SNA Project (nutters!) */
4652 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004653#endif
4654#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 /* IRDA sockets */
4656 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004657#endif
4658#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004659 /* PPPoX sockets */
4660 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004661#endif
4662#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004663 /* Wanpipe API Sockets */
4664 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004665#endif
4666#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 /* Linux LLC */
4668 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004669#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004670
Hye-Shik Chang81268602004-02-02 06:05:24 +00004671#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004672 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4673 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4674 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4675 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004676#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004677 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004678#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004679#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004680#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004681 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004682#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004683 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4684 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004685#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004686 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4687 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4688 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004689#endif
4690
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004691#ifdef AF_PACKET
4692 PyModule_AddIntMacro(m, AF_PACKET);
4693#endif
4694#ifdef PF_PACKET
4695 PyModule_AddIntMacro(m, PF_PACKET);
4696#endif
4697#ifdef PACKET_HOST
4698 PyModule_AddIntMacro(m, PACKET_HOST);
4699#endif
4700#ifdef PACKET_BROADCAST
4701 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4702#endif
4703#ifdef PACKET_MULTICAST
4704 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4705#endif
4706#ifdef PACKET_OTHERHOST
4707 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4708#endif
4709#ifdef PACKET_OUTGOING
4710 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4711#endif
4712#ifdef PACKET_LOOPBACK
4713 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4714#endif
4715#ifdef PACKET_FASTROUTE
4716 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004717#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004718
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004719#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004720 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004721
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004722 /* for addresses */
4723 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4724 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4725 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004726
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004727 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4728 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4729 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004731 /* for setsockopt() */
4732 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4733 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4734 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4735 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4736 TIPC_DEST_DROPPABLE);
4737 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004738
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004739 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4740 TIPC_LOW_IMPORTANCE);
4741 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4742 TIPC_MEDIUM_IMPORTANCE);
4743 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4744 TIPC_HIGH_IMPORTANCE);
4745 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4746 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004747
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004748 /* for subscriptions */
4749 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4750 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004751#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004752 /* doesn't seem to be available everywhere */
4753 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004754#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004755 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4756 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4757 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4758 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4759 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4760 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004761#endif
4762
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004763 /* Socket types */
4764 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4765 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004766#ifndef __BEOS__
4767/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004768 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4769 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004770#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004771 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004772#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004773#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004774
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004775#ifdef SO_DEBUG
4776 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004777#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004778#ifdef SO_ACCEPTCONN
4779 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004780#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004781#ifdef SO_REUSEADDR
4782 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004783#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004784#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004785 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004786#endif
4787
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004788#ifdef SO_KEEPALIVE
4789 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004790#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004791#ifdef SO_DONTROUTE
4792 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004793#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004794#ifdef SO_BROADCAST
4795 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004796#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004797#ifdef SO_USELOOPBACK
4798 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004799#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004800#ifdef SO_LINGER
4801 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004802#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004803#ifdef SO_OOBINLINE
4804 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004805#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004806#ifdef SO_REUSEPORT
4807 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004808#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004809#ifdef SO_SNDBUF
4810 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004811#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004812#ifdef SO_RCVBUF
4813 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004814#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004815#ifdef SO_SNDLOWAT
4816 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004817#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004818#ifdef SO_RCVLOWAT
4819 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004820#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004821#ifdef SO_SNDTIMEO
4822 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004823#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004824#ifdef SO_RCVTIMEO
4825 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004826#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004827#ifdef SO_ERROR
4828 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004829#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004830#ifdef SO_TYPE
4831 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004832#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004833#ifdef SO_SETFIB
4834 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4835#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004836
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004837 /* Maximum number of connections for "listen" */
4838#ifdef SOMAXCONN
4839 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004840#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004841 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004842#endif
4843
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004844 /* Flags for send, recv */
4845#ifdef MSG_OOB
4846 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004847#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004848#ifdef MSG_PEEK
4849 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004850#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004851#ifdef MSG_DONTROUTE
4852 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004853#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004854#ifdef MSG_DONTWAIT
4855 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004857#ifdef MSG_EOR
4858 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004859#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004860#ifdef MSG_TRUNC
4861 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004862#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004863#ifdef MSG_CTRUNC
4864 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004865#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866#ifdef MSG_WAITALL
4867 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004868#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004869#ifdef MSG_BTAG
4870 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004871#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004872#ifdef MSG_ETAG
4873 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004874#endif
4875
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004876 /* Protocol level and numbers, usable for [gs]etsockopt */
4877#ifdef SOL_SOCKET
4878 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004879#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004880#ifdef SOL_IP
4881 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004882#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004883 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004884#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004885#ifdef SOL_IPX
4886 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004887#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004888#ifdef SOL_AX25
4889 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004890#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004891#ifdef SOL_ATALK
4892 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004893#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004894#ifdef SOL_NETROM
4895 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004897#ifdef SOL_ROSE
4898 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004900#ifdef SOL_TCP
4901 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004902#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004904#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004905#ifdef SOL_UDP
4906 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004907#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004909#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004910#ifdef IPPROTO_IP
4911 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004912#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004913 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004914#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915#ifdef IPPROTO_HOPOPTS
4916 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004917#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef IPPROTO_ICMP
4919 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004920#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004922#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004923#ifdef IPPROTO_IGMP
4924 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004925#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004926#ifdef IPPROTO_GGP
4927 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004928#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004929#ifdef IPPROTO_IPV4
4930 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004931#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004932#ifdef IPPROTO_IPV6
4933 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004934#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004935#ifdef IPPROTO_IPIP
4936 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004937#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004938#ifdef IPPROTO_TCP
4939 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004940#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004941 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004942#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004943#ifdef IPPROTO_EGP
4944 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004945#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004946#ifdef IPPROTO_PUP
4947 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004948#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004949#ifdef IPPROTO_UDP
4950 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004951#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004952 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004954#ifdef IPPROTO_IDP
4955 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004957#ifdef IPPROTO_HELLO
4958 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004959#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004960#ifdef IPPROTO_ND
4961 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004962#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004963#ifdef IPPROTO_TP
4964 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004965#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966#ifdef IPPROTO_IPV6
4967 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969#ifdef IPPROTO_ROUTING
4970 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972#ifdef IPPROTO_FRAGMENT
4973 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef IPPROTO_RSVP
4976 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef IPPROTO_GRE
4979 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef IPPROTO_ESP
4982 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef IPPROTO_AH
4985 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef IPPROTO_MOBILE
4988 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef IPPROTO_ICMPV6
4991 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef IPPROTO_NONE
4994 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004996#ifdef IPPROTO_DSTOPTS
4997 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004998#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004999#ifdef IPPROTO_XTP
5000 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005001#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005002#ifdef IPPROTO_EON
5003 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005004#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005005#ifdef IPPROTO_PIM
5006 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef IPPROTO_IPCOMP
5009 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005010#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011#ifdef IPPROTO_VRRP
5012 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005013#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005014#ifdef IPPROTO_BIP
5015 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005016#endif
5017/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005018#ifdef IPPROTO_RAW
5019 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005020#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005022#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005023#ifdef IPPROTO_MAX
5024 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005025#endif
5026
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005027 /* Some port configuration */
5028#ifdef IPPORT_RESERVED
5029 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005030#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005031 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005032#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033#ifdef IPPORT_USERRESERVED
5034 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005035#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005036 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005037#endif
5038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005039 /* Some reserved IP v.4 addresses */
5040#ifdef INADDR_ANY
5041 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005042#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005043 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005044#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005045#ifdef INADDR_BROADCAST
5046 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005047#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005049#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005050#ifdef INADDR_LOOPBACK
5051 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005052#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005053 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005054#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005055#ifdef INADDR_UNSPEC_GROUP
5056 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005057#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005058 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005059#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005060#ifdef INADDR_ALLHOSTS_GROUP
5061 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5062 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005063#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005064 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005065#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005066#ifdef INADDR_MAX_LOCAL_GROUP
5067 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5068 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005069#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005070 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005071#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005072#ifdef INADDR_NONE
5073 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005074#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005075 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005076#endif
5077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078 /* IPv4 [gs]etsockopt options */
5079#ifdef IP_OPTIONS
5080 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005081#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005082#ifdef IP_HDRINCL
5083 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005084#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005085#ifdef IP_TOS
5086 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005087#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005088#ifdef IP_TTL
5089 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005090#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005091#ifdef IP_RECVOPTS
5092 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005093#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005094#ifdef IP_RECVRETOPTS
5095 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005096#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005097#ifdef IP_RECVDSTADDR
5098 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005099#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005100#ifdef IP_RETOPTS
5101 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005102#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005103#ifdef IP_MULTICAST_IF
5104 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005105#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005106#ifdef IP_MULTICAST_TTL
5107 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005108#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005109#ifdef IP_MULTICAST_LOOP
5110 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005111#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005112#ifdef IP_ADD_MEMBERSHIP
5113 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005114#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005115#ifdef IP_DROP_MEMBERSHIP
5116 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005117#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005118#ifdef IP_DEFAULT_MULTICAST_TTL
5119 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5120 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005121#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005122#ifdef IP_DEFAULT_MULTICAST_LOOP
5123 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5124 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005125#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126#ifdef IP_MAX_MEMBERSHIPS
5127 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005128#endif
5129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5131#ifdef IPV6_JOIN_GROUP
5132 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005133#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005134#ifdef IPV6_LEAVE_GROUP
5135 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005136#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005137#ifdef IPV6_MULTICAST_HOPS
5138 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005139#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005140#ifdef IPV6_MULTICAST_IF
5141 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005142#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005143#ifdef IPV6_MULTICAST_LOOP
5144 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005145#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005146#ifdef IPV6_UNICAST_HOPS
5147 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005148#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005149 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005150#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005151 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005152#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005153 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005154#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005155 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005156#endif
5157#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005158 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005159#endif
5160#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005162#endif
5163#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005164 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005165#endif
5166#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005167 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005168#endif
5169#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005170 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005171#endif
5172#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005174#endif
5175#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005176 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005177#endif
5178#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005179 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005180#endif
5181#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005182 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005183#endif
5184#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005186#endif
5187#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005189#endif
5190#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005192#endif
5193#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005195#endif
5196#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005197 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005198#endif
5199#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005201#endif
5202#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005204#endif
5205#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005207#endif
5208#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005210#endif
5211#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005213#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005214
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215 /* TCP options */
5216#ifdef TCP_NODELAY
5217 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005218#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005219#ifdef TCP_MAXSEG
5220 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005221#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005222#ifdef TCP_CORK
5223 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005224#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005225#ifdef TCP_KEEPIDLE
5226 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005227#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005228#ifdef TCP_KEEPINTVL
5229 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005230#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005231#ifdef TCP_KEEPCNT
5232 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005233#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005234#ifdef TCP_SYNCNT
5235 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005236#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005237#ifdef TCP_LINGER2
5238 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005239#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005240#ifdef TCP_DEFER_ACCEPT
5241 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef TCP_WINDOW_CLAMP
5244 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005245#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005246#ifdef TCP_INFO
5247 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005248#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249#ifdef TCP_QUICKACK
5250 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005251#endif
5252
Guido van Rossum09be4091999-08-09 14:40:40 +00005253
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005254 /* IPX options */
5255#ifdef IPX_TYPE
5256 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005257#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005258
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005259 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005260#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005261 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005262#endif
5263#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005265#endif
5266#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005268#endif
5269#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005271#endif
5272#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005274#endif
5275#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005277#endif
5278#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005280#endif
5281#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005283#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005284#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005287#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005289#endif
5290#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005292#endif
5293#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005295#endif
5296#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005298#endif
5299#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005301#endif
5302#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005304#endif
5305#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005307#endif
5308#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005310#endif
5311#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005313#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005314#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005316#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005317#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005319#endif
5320#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005322#endif
5323#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005325#endif
5326#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005328#endif
5329#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005331#endif
5332#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005334#endif
5335#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005337#endif
5338#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005340#endif
5341#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005342 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005343#endif
5344#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005345 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005346#endif
5347#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005348 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349#endif
5350#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005351 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352#endif
5353#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005354 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005355#endif
5356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005357 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005358#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005359 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005360#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005361 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005362#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005363 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005364#endif
5365#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005366 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005367#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005368 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005369#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005370 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005371#endif
5372#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005374#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005375 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005376#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005377 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005378#endif
5379
Christian Heimes04ae9162008-01-04 15:23:30 +00005380#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005381 {
5382 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5383 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5384 int i;
5385 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5386 PyObject *tmp;
5387 tmp = PyLong_FromUnsignedLong(codes[i]);
5388 if (tmp == NULL)
5389 return;
5390 PyModule_AddObject(m, names[i], tmp);
5391 }
5392 }
5393 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5394 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5395 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005396#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005397 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005398#endif
5399#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005401#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005402#endif /* _MSTCPIP_ */
5403
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005404 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005405#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005406 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005407#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005408}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005409
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005410
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005411#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005412#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005413
5414/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005415/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005416
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005417int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005418inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005419{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005420 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005421#if (SIZEOF_INT != 4)
5422#error "Not sure if in_addr_t exists and int is not 32-bits."
5423#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005424 unsigned int packed_addr;
5425 packed_addr = inet_addr(src);
5426 if (packed_addr == INADDR_NONE)
5427 return 0;
5428 memcpy(dst, &packed_addr, 4);
5429 return 1;
5430 }
5431 /* Should set errno to EAFNOSUPPORT */
5432 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005433}
5434
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005435const char *
5436inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005437{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005438 if (af == AF_INET) {
5439 struct in_addr packed_addr;
5440 if (size < 16)
5441 /* Should set errno to ENOSPC. */
5442 return NULL;
5443 memcpy(&packed_addr, src, sizeof(packed_addr));
5444 return strncpy(dst, inet_ntoa(packed_addr), size);
5445 }
5446 /* Should set errno to EAFNOSUPPORT */
5447 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005448}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005449
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005450#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005451#endif