blob: 27df333b7a7e1cfe6ff59bf09c2313f886ad8bc7 [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"
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -070095#include "timefuncs.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000096
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000097#undef MAX
98#define MAX(x, y) ((x) < (y) ? (y) : (x))
99
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000100/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000102"socket([family[, type[, proto]]]) -> socket object\n\
103\n\
104Open a socket of the given type. The family argument specifies the\n\
105address family; it defaults to AF_INET. The type argument specifies\n\
106whether this is a stream (SOCK_STREAM, this is the default)\n\
107or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
108specifying the default protocol. Keyword arguments are accepted.\n\
109\n\
110A socket object represents one endpoint of a network connection.\n\
111\n\
112Methods of socket objects (keyword arguments not allowed):\n\
113\n\
114accept() -- accept a connection, returning new socket and client address\n\
115bind(addr) -- bind the socket to a local address\n\
116close() -- close the socket\n\
117connect(addr) -- connect the socket to a remote address\n\
118connect_ex(addr) -- connect, return an error code instead of an exception\n\
119dup() -- return a new socket object identical to the current one [*]\n\
120fileno() -- return underlying file descriptor\n\
121getpeername() -- return remote address [*]\n\
122getsockname() -- return local address\n\
123getsockopt(level, optname[, buflen]) -- get socket options\n\
124gettimeout() -- return timeout or None\n\
125listen(n) -- start listening for incoming connections\n\
126makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
127recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
139\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000140 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000142/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000143 I hope some day someone can clean this up please... */
144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
146 script doesn't get this right, so we hardcode some platform checks below.
147 On the other hand, not all Linux versions agree, so there the settings
148 computed by the configure script are needed! */
149
150#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151# undef HAVE_GETHOSTBYNAME_R_3_ARG
152# undef HAVE_GETHOSTBYNAME_R_5_ARG
153# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000154#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000155
Guido van Rossum7a122991999-04-13 04:07:32 +0000156#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000158#endif
159
Guido van Rossume7de2061999-03-24 17:24:33 +0000160#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161# if defined(_AIX) || defined(__osf__)
162# define HAVE_GETHOSTBYNAME_R_3_ARG
163# elif defined(__sun) || defined(__sgi)
164# define HAVE_GETHOSTBYNAME_R_5_ARG
165# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000166/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# else
168# undef HAVE_GETHOSTBYNAME_R
169# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#endif
171
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000172#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
173 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000175#endif
176
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000177/* To use __FreeBSD_version */
178#ifdef HAVE_SYS_PARAM_H
179#include <sys/param.h>
180#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000181/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000182 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000183#if defined(WITH_THREAD) && (defined(__APPLE__) || \
184 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000185 defined(__OpenBSD__) || defined(__NetBSD__) || \
186 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000187#define USE_GETADDRINFO_LOCK
188#endif
189
190#ifdef USE_GETADDRINFO_LOCK
191#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
192#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
193#else
194#define ACQUIRE_GETADDRINFO_LOCK
195#define RELEASE_GETADDRINFO_LOCK
196#endif
197
198#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000200#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000201
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000202#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# include <types.h>
204# include <io.h>
205# include <sys/ioctl.h>
206# include <utils.h>
207# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000208#endif
209
Martin v. Löwis9e437302002-12-06 12:57:26 +0000210#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000211# include <ioctl.h>
212#endif
213
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000214#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000215# define INCL_DOS
216# define INCL_DOSERRORS
217# define INCL_NOPMAPI
218# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000219#endif
220
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000221#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000222/* make sure that the reentrant (gethostbyaddr_r etc)
223 functions are declared correctly if compiling with
224 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000225
Martin Blais2856e5f2006-05-26 12:03:27 +0000226/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000227 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000228#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000229#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000230
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000231#undef _XOPEN_SOURCE
232#include <sys/socket.h>
233#include <sys/types.h>
234#include <netinet/in.h>
235#ifdef _SS_ALIGNSIZE
236#define HAVE_GETADDRINFO 1
237#define HAVE_GETNAMEINFO 1
238#endif
239
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240#define HAVE_INET_PTON
241#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000242#endif
243
Martin Blais2856e5f2006-05-26 12:03:27 +0000244/* Irix 6.5 fails to define this variable at all. This is needed
245 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000246 are just busted. Same thing for Solaris. */
247#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000248#define INET_ADDRSTRLEN 16
249#endif
250
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000251/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000252#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000253#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000254#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000256/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000257#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000258#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259
260/* Addressing includes */
261
Guido van Rossum6f489d91996-06-28 20:15:15 +0000262#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263
264/* Non-MS WINDOWS includes */
265# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000266
Guido van Rossum9376b741999-09-15 22:01:40 +0000267/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268# ifdef __BEOS__
269# include <net/netdb.h>
270# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
271# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000272typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000276
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277# ifndef RISCOS
278# include <fcntl.h>
279# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000280# include <sys/ioctl.h>
281# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000283int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000284# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285# endif
286
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000287#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000288
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000290# ifdef HAVE_FCNTL_H
291# include <fcntl.h>
292# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000293
Jeremy Hylton22308652001-02-02 03:23:09 +0000294#endif
295
Skip Montanaro7befb992004-02-10 16:50:21 +0000296#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000297
298#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000299# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000300#endif
301
Neal Norwitz39d22e52002-11-02 19:55:21 +0000302#ifndef O_NONBLOCK
303# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000304#endif
305
Trent Micka708d6e2004-09-07 17:48:26 +0000306/* include Python's addrinfo.h unless it causes trouble */
307#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
308 /* Do not include addinfo.h on some newer IRIX versions.
309 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
310 * for example, but not by 6.5.10.
311 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000312#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000313 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
314 * EAI_* constants are defined in (the already included) ws2tcpip.h.
315 */
316#else
317# include "addrinfo.h"
318#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000319
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000321#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000322int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000323const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000324#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000325#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000326
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#ifdef __APPLE__
328/* On OS X, getaddrinfo returns no error indication of lookup
329 failure, so we must use the emulation instead of the libinfo
330 implementation. Unfortunately, performing an autoconf test
331 for this bug would require DNS access for the machine performing
332 the configuration, which is not acceptable. Therefore, we
333 determine the bug just by checking for __APPLE__. If this bug
334 gets ever fixed, perhaps checking for sys/version.h would be
335 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000336#ifndef HAVE_GETNAMEINFO
337/* This bug seems to be fixed in Jaguar. Ths easiest way I could
338 Find to check for Jaguar is that it has getnameinfo(), which
339 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000341#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000342
343#ifdef HAVE_INET_ATON
344#define USE_INET_ATON_WEAKLINK
345#endif
346
Jack Jansen84262fb2002-07-02 14:40:42 +0000347#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000350#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000351/* avoid clashes with the C library definition of the symbol. */
352#define getaddrinfo fake_getaddrinfo
353#define gai_strerror fake_gai_strerror
354#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355#include "getaddrinfo.c"
356#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000358#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000359#include "getnameinfo.c"
360#endif
361
Guido van Rossumbcc20741998-08-04 22:53:56 +0000362#if defined(MS_WINDOWS) || defined(__BEOS__)
363/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000364/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000365#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000366#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000367#endif
368
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000369#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000370#define EAFNOSUPPORT WSAEAFNOSUPPORT
371#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000372#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000373
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000374#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000375#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000376#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000377#endif
378
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000379#ifndef SOCKETCLOSE
380#define SOCKETCLOSE close
381#endif
382
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000383#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define USE_BLUETOOTH 1
385#if defined(__FreeBSD__)
386#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
387#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000388#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000389#define SOL_HCI SOL_HCI_RAW
390#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define sockaddr_l2 sockaddr_l2cap
392#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000393#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
395#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000396#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000397#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000398#define sockaddr_l2 sockaddr_bt
399#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000400#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000401#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000402#define SOL_HCI BTPROTO_HCI
403#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000404#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
405#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000406#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000407#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
410#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000411#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
413#endif
414#endif
415
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000416#ifdef __VMS
417/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
418#define SEGMENT_SIZE (32 * 1024 -1)
419#endif
420
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000421#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000422
Martin v. Löwise9416172003-05-03 10:12:45 +0000423/*
424 * Constants for getnameinfo()
425 */
426#if !defined(NI_MAXHOST)
427#define NI_MAXHOST 1025
428#endif
429#if !defined(NI_MAXSERV)
430#define NI_MAXSERV 32
431#endif
432
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000433/* XXX There's a problem here: *static* functions are not supposed to have
434 a Py prefix (or use CapitalizedWords). Later... */
435
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436/* Global variable holding the exception type for errors detected
437 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000438static PyObject *socket_error;
439static PyObject *socket_herror;
440static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000441static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442
Guido van Rossum48a680c2001-03-02 06:34:14 +0000443#ifdef RISCOS
444/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
445static int taskwindow;
446#endif
447
Tim Peters643a7fc2002-02-17 04:13:21 +0000448/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000449 The sock_type variable contains pointers to various functions,
450 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000451 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000452static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000453
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000454#if defined(HAVE_POLL_H)
455#include <poll.h>
456#elif defined(HAVE_SYS_POLL_H)
457#include <sys/poll.h>
458#endif
459
Charles-François Natalifda7b372011-08-28 16:22:33 +0200460#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000461/* Instead of select(), we'll use poll() since poll() works on any fd. */
462#define IS_SELECTABLE(s) 1
463/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200465/* If there's no timeout left, we don't have to call select, so it's a safe,
466 * little white lie. */
467#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000469
470static PyObject*
471select_error(void)
472{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000473 PyErr_SetString(socket_error, "unable to select on socket");
474 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000475}
476
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700477#ifdef MS_WINDOWS
478#ifndef WSAEAGAIN
479#define WSAEAGAIN WSAEWOULDBLOCK
480#endif
481#define CHECK_ERRNO(expected) \
482 (WSAGetLastError() == WSA ## expected)
483#else
484#define CHECK_ERRNO(expected) \
485 (errno == expected)
486#endif
487
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488/* Convenience function to raise an error according to errno
489 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000492set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000493{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000494#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000495 int err_no = WSAGetLastError();
496 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
497 recognizes the error codes used by both GetLastError() and
498 WSAGetLastError */
499 if (err_no)
500 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000501#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000502
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000503#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000504 if (sock_errno() != NO_ERROR) {
505 APIRET rc;
506 ULONG msglen;
507 char outbuf[100];
508 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000509
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000510 /* Retrieve socket-related error message from MPTN.MSG file */
511 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
512 myerrorcode - SOCBASEERR + 26,
513 "mptn.msg",
514 &msglen);
515 if (rc == NO_ERROR) {
516 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000517
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000518 /* OS/2 doesn't guarantee a terminator */
519 outbuf[msglen] = '\0';
520 if (strlen(outbuf) > 0) {
521 /* If non-empty msg, trim CRLF */
522 char *lastc = &outbuf[ strlen(outbuf)-1 ];
523 while (lastc > outbuf &&
524 isspace(Py_CHARMASK(*lastc))) {
525 /* Trim trailing whitespace (CRLF) */
526 *lastc-- = '\0';
527 }
528 }
529 v = Py_BuildValue("(is)", myerrorcode, outbuf);
530 if (v != NULL) {
531 PyErr_SetObject(socket_error, v);
532 Py_DECREF(v);
533 }
534 return NULL;
535 }
536 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537#endif
538
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000539#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000540 if (_inet_error.errnum != NULL) {
541 PyObject *v;
542 v = Py_BuildValue("(is)", errno, _inet_err());
543 if (v != NULL) {
544 PyErr_SetObject(socket_error, v);
545 Py_DECREF(v);
546 }
547 return NULL;
548 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000549#endif
550
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552}
553
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000556set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000558 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559
560#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000561 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 if (v != NULL) {
566 PyErr_SetObject(socket_herror, v);
567 Py_DECREF(v);
568 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000570 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571}
572
573
574static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000575set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578
Martin v. Löwis272cb402002-03-01 08:31:07 +0000579#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 /* EAI_SYSTEM is not available on Windows XP. */
581 if (error == EAI_SYSTEM)
582 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000583#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000585#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000587#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000588 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000589#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000590 if (v != NULL) {
591 PyErr_SetObject(socket_gaierror, v);
592 Py_DECREF(v);
593 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000595 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596}
597
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000598#ifdef __VMS
599/* Function to send in segments */
600static int
601sendsegmented(int sock_fd, char *buf, int len, int flags)
602{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000603 int n = 0;
604 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 while (remaining > 0) {
607 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000608
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000609 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
610 n = send(sock_fd, buf, segment, flags);
611 if (n < 0) {
612 return n;
613 }
614 remaining -= segment;
615 buf += segment;
616 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000619}
620#endif
621
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000622/* Function to perform the setting of socket blocking mode
623 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624static int
625internal_setblocking(PySocketSockObject *s, int block)
626{
627#ifndef RISCOS
628#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630#endif
631#endif
632
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000635 block = !block;
636 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
637 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638#else
639#ifndef RISCOS
640#ifndef MS_WINDOWS
641#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000642 block = !block;
643 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000644#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000645 block = !block;
646 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000647#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
649 if (block)
650 delay_flag &= (~O_NONBLOCK);
651 else
652 delay_flag |= O_NONBLOCK;
653 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#endif /* !PYOS_OS2 */
655#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 block = !block;
657 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000659#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000660 block = !block;
661 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000662#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000663#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000664 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000666 /* Since these don't return anything */
667 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668}
669
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000670/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000671 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000672 This does not raise an exception; we'll let our caller do that
673 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000674 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000675static int
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700676internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000678 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000679
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 /* Nothing to do unless we're in timeout mode (not non-blocking) */
681 if (s->sock_timeout <= 0.0)
682 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000684 /* Guard against closed socket */
685 if (s->sock_fd < 0)
686 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000687
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700688 /* Handling this condition here simplifies the select loops */
689 if (interval < 0.0)
690 return 1;
691
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000692 /* Prefer poll, if available, since you can poll() any fd
693 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000694#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000695 {
696 struct pollfd pollfd;
697 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000699 pollfd.fd = s->sock_fd;
700 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000701
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000702 /* s->sock_timeout is in seconds, timeout in ms */
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700703 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 n = poll(&pollfd, 1, timeout);
705 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000706#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000707 {
708 /* Construct the arguments to select */
709 fd_set fds;
710 struct timeval tv;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700711 tv.tv_sec = (int)interval;
712 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000713 FD_ZERO(&fds);
714 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000715
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000716 /* See if the socket is ready */
717 if (writing)
718 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
719 else
720 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
721 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000722#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000723
724 if (n < 0)
725 return -1;
726 if (n == 0)
727 return 1;
728 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000729}
730
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700731static int
732internal_select(PySocketSockObject *s, int writing)
733{
734 return internal_select_ex(s, writing, s->sock_timeout);
735}
736
737/*
738 Two macros for automatic retry of select() in case of false positives
739 (for example, select() could indicate a socket is ready for reading
740 but the data then discarded by the OS because of a wrong checksum).
741 Here is an example of use:
742
743 BEGIN_SELECT_LOOP(s)
744 Py_BEGIN_ALLOW_THREADS
745 timeout = internal_select_ex(s, 0, interval);
746 if (!timeout)
747 outlen = recv(s->sock_fd, cbuf, len, flags);
748 Py_END_ALLOW_THREADS
749 if (timeout == 1) {
750 PyErr_SetString(socket_timeout, "timed out");
751 return -1;
752 }
753 END_SELECT_LOOP(s)
754*/
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700755#define BEGIN_SELECT_LOOP(s) \
756 { \
757 double deadline, interval = s->sock_timeout; \
758 int has_timeout = s->sock_timeout > 0.0; \
759 if (has_timeout) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700760 deadline = _PyTime_FloatTime() + s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700761 } \
762 while (1) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700763 errno = 0;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700764
765#define END_SELECT_LOOP(s) \
766 if (!has_timeout || \
767 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
768 break; \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700769 interval = deadline - _PyTime_FloatTime(); \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700770 } \
Kristján Valur Jónsson620e3642013-03-19 13:01:05 -0700771 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700772
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000773/* Initialize a new socket object. */
774
Tim Petersa12b4cf2002-07-18 22:38:44 +0000775static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000776
Mark Hammond62b1ab12002-07-23 06:31:15 +0000777PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000778init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000779 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000780{
781#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000782 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000783#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000784 s->sock_fd = fd;
785 s->sock_family = family;
786 s->sock_type = type;
787 s->sock_proto = proto;
788 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000789
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000790 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000791
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000792 if (defaulttimeout >= 0.0)
793 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000794
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000796 if (taskwindow)
797 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000798#endif
799}
800
801
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802/* Create a new socket object.
803 This just creates the object and initializes it.
804 If the creation fails, return NULL and set an exception (implicit
805 in NEWOBJ()). */
806
Guido van Rossum73624e91994-10-10 17:59:00 +0000807static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000808new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000810 PySocketSockObject *s;
811 s = (PySocketSockObject *)
812 PyType_GenericNew(&sock_type, NULL, NULL);
813 if (s != NULL)
814 init_sockobject(s, fd, family, type, proto);
815 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816}
817
Guido van Rossum30a685f1991-06-27 15:51:29 +0000818
Guido van Rossum48a680c2001-03-02 06:34:14 +0000819/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000820 thread to be in gethostbyname or getaddrinfo */
821#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosec5517762012-08-14 17:24:47 +0200822static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000823#endif
824
825
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826/* Convert a string specifying a host name or one of a few symbolic
827 names to a numeric IP address. This usually calls gethostbyname()
828 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000829 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830 an error occurred; then an exception is raised. */
831
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000833setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000835 struct addrinfo hints, *res;
836 int error;
837 int d1, d2, d3, d4;
838 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
841 if (name[0] == '\0') {
842 int siz;
843 memset(&hints, 0, sizeof(hints));
844 hints.ai_family = af;
845 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
846 hints.ai_flags = AI_PASSIVE;
847 Py_BEGIN_ALLOW_THREADS
848 ACQUIRE_GETADDRINFO_LOCK
849 error = getaddrinfo(NULL, "0", &hints, &res);
850 Py_END_ALLOW_THREADS
851 /* We assume that those thread-unsafe getaddrinfo() versions
852 *are* safe regarding their return value, ie. that a
853 subsequent call to getaddrinfo() does not destroy the
854 outcome of the first call. */
855 RELEASE_GETADDRINFO_LOCK
856 if (error) {
857 set_gaierror(error);
858 return -1;
859 }
860 switch (res->ai_family) {
861 case AF_INET:
862 siz = 4;
863 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000864#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000865 case AF_INET6:
866 siz = 16;
867 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000868#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000869 default:
870 freeaddrinfo(res);
871 PyErr_SetString(socket_error,
872 "unsupported address family");
873 return -1;
874 }
875 if (res->ai_next) {
876 freeaddrinfo(res);
877 PyErr_SetString(socket_error,
878 "wildcard resolved to multiple address");
879 return -1;
880 }
881 if (res->ai_addrlen < addr_ret_size)
882 addr_ret_size = res->ai_addrlen;
883 memcpy(addr_ret, res->ai_addr, addr_ret_size);
884 freeaddrinfo(res);
885 return siz;
886 }
887 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
888 struct sockaddr_in *sin;
889 if (af != AF_INET && af != AF_UNSPEC) {
890 PyErr_SetString(socket_error,
891 "address family mismatched");
892 return -1;
893 }
894 sin = (struct sockaddr_in *)addr_ret;
895 memset((void *) sin, '\0', sizeof(*sin));
896 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000897#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000898 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000900 sin->sin_addr.s_addr = INADDR_BROADCAST;
901 return sizeof(sin->sin_addr);
902 }
903 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
904 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
905 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
906 struct sockaddr_in *sin;
907 sin = (struct sockaddr_in *)addr_ret;
908 sin->sin_addr.s_addr = htonl(
909 ((long) d1 << 24) | ((long) d2 << 16) |
910 ((long) d3 << 8) | ((long) d4 << 0));
911 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000912#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000913 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000914#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000915 return 4;
916 }
917 memset(&hints, 0, sizeof(hints));
918 hints.ai_family = af;
919 Py_BEGIN_ALLOW_THREADS
920 ACQUIRE_GETADDRINFO_LOCK
921 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000922#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000923 if (error == EAI_NONAME && af == AF_UNSPEC) {
924 /* On Tru64 V5.1, numeric-to-addr conversion fails
925 if no address family is given. Assume IPv4 for now.*/
926 hints.ai_family = AF_INET;
927 error = getaddrinfo(name, NULL, &hints, &res);
928 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000930 Py_END_ALLOW_THREADS
931 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
932 if (error) {
933 set_gaierror(error);
934 return -1;
935 }
936 if (res->ai_addrlen < addr_ret_size)
937 addr_ret_size = res->ai_addrlen;
938 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
939 freeaddrinfo(res);
940 switch (addr_ret->sa_family) {
941 case AF_INET:
942 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000943#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000944 case AF_INET6:
945 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000946#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000947 default:
948 PyErr_SetString(socket_error, "unknown address family");
949 return -1;
950 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951}
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953
Guido van Rossum30a685f1991-06-27 15:51:29 +0000954/* Create a string object representing an IP address.
955 This is always a string of the form 'dd.dd.dd.dd' (with variable
956 size numbers). */
957
Guido van Rossum73624e91994-10-10 17:59:00 +0000958static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000959makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000960{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000961 char buf[NI_MAXHOST];
962 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000963
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000964 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
965 NI_NUMERICHOST);
966 if (error) {
967 set_gaierror(error);
968 return NULL;
969 }
970 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000971}
972
973
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000974#ifdef USE_BLUETOOTH
975/* Convert a string representation of a Bluetooth address into a numeric
976 address. Returns the length (6), or raises an exception and returns -1 if
977 an error occurred. */
978
979static int
980setbdaddr(char *name, bdaddr_t *bdaddr)
981{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000982 unsigned int b0, b1, b2, b3, b4, b5;
983 char ch;
984 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000985
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000986 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
987 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
988 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
989 bdaddr->b[0] = b0;
990 bdaddr->b[1] = b1;
991 bdaddr->b[2] = b2;
992 bdaddr->b[3] = b3;
993 bdaddr->b[4] = b4;
994 bdaddr->b[5] = b5;
995 return 6;
996 } else {
997 PyErr_SetString(socket_error, "bad bluetooth address");
998 return -1;
999 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000}
1001
1002/* Create a string representation of the Bluetooth address. This is always a
1003 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1004 value (zero padded if necessary). */
1005
1006static PyObject *
1007makebdaddr(bdaddr_t *bdaddr)
1008{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001009 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001010
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001011 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1012 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1013 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1014 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001015}
1016#endif
1017
1018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019/* Create an object representing the given socket address,
1020 suitable for passing it back to bind(), connect() etc.
1021 The family field of the sockaddr structure is inspected
1022 to determine what kind of address it really is. */
1023
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001024/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001025static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001026makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001027{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001028 if (addrlen == 0) {
1029 /* No address -- may be recvfrom() from known socket */
1030 Py_INCREF(Py_None);
1031 return Py_None;
1032 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001033
Guido van Rossumbcc20741998-08-04 22:53:56 +00001034#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001035 /* XXX: BeOS version of accept() doesn't set family correctly */
1036 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001037#endif
1038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001039 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001041 case AF_INET:
1042 {
1043 struct sockaddr_in *a;
1044 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1045 PyObject *ret = NULL;
1046 if (addrobj) {
1047 a = (struct sockaddr_in *)addr;
1048 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1049 Py_DECREF(addrobj);
1050 }
1051 return ret;
1052 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001054#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001055 case AF_UNIX:
1056 {
1057 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001058#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001059 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1060 addrlen -= offsetof(struct sockaddr_un, sun_path);
1061 return PyString_FromStringAndSize(a->sun_path,
1062 addrlen);
1063 }
1064 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001065#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001066 {
1067 /* regular NULL-terminated string */
1068 return PyString_FromString(a->sun_path);
1069 }
1070 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001071#endif /* AF_UNIX */
1072
Martin v. Löwis11017b12006-01-14 18:12:57 +00001073#if defined(AF_NETLINK)
1074 case AF_NETLINK:
1075 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001076 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1077 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001078 }
1079#endif /* AF_NETLINK */
1080
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001081#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001082 case AF_INET6:
1083 {
1084 struct sockaddr_in6 *a;
1085 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1086 PyObject *ret = NULL;
1087 if (addrobj) {
1088 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001089 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001090 addrobj,
1091 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001092 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001093 a->sin6_scope_id);
1094 Py_DECREF(addrobj);
1095 }
1096 return ret;
1097 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001098#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001101 case AF_BLUETOOTH:
1102 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001104 case BTPROTO_L2CAP:
1105 {
1106 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1107 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1108 PyObject *ret = NULL;
1109 if (addrobj) {
1110 ret = Py_BuildValue("Oi",
1111 addrobj,
1112 _BT_L2_MEMB(a, psm));
1113 Py_DECREF(addrobj);
1114 }
1115 return ret;
1116 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001118 case BTPROTO_RFCOMM:
1119 {
1120 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1121 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1122 PyObject *ret = NULL;
1123 if (addrobj) {
1124 ret = Py_BuildValue("Oi",
1125 addrobj,
1126 _BT_RC_MEMB(a, channel));
1127 Py_DECREF(addrobj);
1128 }
1129 return ret;
1130 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001131
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001132 case BTPROTO_HCI:
1133 {
1134 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001135#if defined(__NetBSD__) || defined(__DragonFly__)
1136 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1137#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001138 PyObject *ret = NULL;
1139 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1140 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001141#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001142 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001143
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001145 case BTPROTO_SCO:
1146 {
1147 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1148 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1149 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001150#endif
1151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001152 default:
1153 PyErr_SetString(PyExc_ValueError,
1154 "Unknown Bluetooth protocol");
1155 return NULL;
1156 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001157#endif
1158
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001159#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001160 case AF_PACKET:
1161 {
1162 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1163 char *ifname = "";
1164 struct ifreq ifr;
1165 /* need to look up interface name give index */
1166 if (a->sll_ifindex) {
1167 ifr.ifr_ifindex = a->sll_ifindex;
1168 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1169 ifname = ifr.ifr_name;
1170 }
1171 return Py_BuildValue("shbhs#",
1172 ifname,
1173 ntohs(a->sll_protocol),
1174 a->sll_pkttype,
1175 a->sll_hatype,
1176 a->sll_addr,
1177 a->sll_halen);
1178 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001179#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001180
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001181#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001182 case AF_TIPC:
1183 {
1184 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1185 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1186 return Py_BuildValue("IIIII",
1187 a->addrtype,
1188 a->addr.nameseq.type,
1189 a->addr.nameseq.lower,
1190 a->addr.nameseq.upper,
1191 a->scope);
1192 } else if (a->addrtype == TIPC_ADDR_NAME) {
1193 return Py_BuildValue("IIIII",
1194 a->addrtype,
1195 a->addr.name.name.type,
1196 a->addr.name.name.instance,
1197 a->addr.name.name.instance,
1198 a->scope);
1199 } else if (a->addrtype == TIPC_ADDR_ID) {
1200 return Py_BuildValue("IIIII",
1201 a->addrtype,
1202 a->addr.id.node,
1203 a->addr.id.ref,
1204 0,
1205 a->scope);
1206 } else {
1207 PyErr_SetString(PyExc_ValueError,
1208 "Invalid address type");
1209 return NULL;
1210 }
1211 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001212#endif
1213
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001214 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 default:
1217 /* If we don't know the address family, don't raise an
1218 exception -- return it as a tuple. */
1219 return Py_BuildValue("is#",
1220 addr->sa_family,
1221 addr->sa_data,
1222 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001223
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001224 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225}
1226
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227
1228/* Parse a socket address argument according to the socket object's
1229 address family. Return 1 if the address was in the proper format,
1230 0 of not. The address is returned through addr_ret, its length
1231 through len_ret. */
1232
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001233static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001234getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001235 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001236{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001237 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001239#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001240 case AF_UNIX:
1241 {
1242 struct sockaddr_un* addr;
1243 char *path;
1244 int len;
1245 if (!PyArg_Parse(args, "t#", &path, &len))
1246 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001247
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001248 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001249#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 if (len > 0 && path[0] == 0) {
1251 /* Linux abstract namespace extension */
1252 if (len > sizeof addr->sun_path) {
1253 PyErr_SetString(socket_error,
1254 "AF_UNIX path too long");
1255 return 0;
1256 }
1257 }
1258 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001259#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001260 {
1261 /* regular NULL-terminated string */
1262 if (len >= sizeof addr->sun_path) {
1263 PyErr_SetString(socket_error,
1264 "AF_UNIX path too long");
1265 return 0;
1266 }
1267 addr->sun_path[len] = 0;
1268 }
1269 addr->sun_family = s->sock_family;
1270 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001271#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001272 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001273#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001274 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001275#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001276 return 1;
1277 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001278#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279
Martin v. Löwis11017b12006-01-14 18:12:57 +00001280#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001281 case AF_NETLINK:
1282 {
1283 struct sockaddr_nl* addr;
1284 int pid, groups;
1285 addr = (struct sockaddr_nl *)addr_ret;
1286 if (!PyTuple_Check(args)) {
1287 PyErr_Format(
1288 PyExc_TypeError,
1289 "getsockaddrarg: "
1290 "AF_NETLINK address must be tuple, not %.500s",
1291 Py_TYPE(args)->tp_name);
1292 return 0;
1293 }
1294 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1295 return 0;
1296 addr->nl_family = AF_NETLINK;
1297 addr->nl_pid = pid;
1298 addr->nl_groups = groups;
1299 *len_ret = sizeof(*addr);
1300 return 1;
1301 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001302#endif
1303
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001304 case AF_INET:
1305 {
1306 struct sockaddr_in* addr;
1307 char *host;
1308 int port, result;
1309 if (!PyTuple_Check(args)) {
1310 PyErr_Format(
1311 PyExc_TypeError,
1312 "getsockaddrarg: "
1313 "AF_INET address must be tuple, not %.500s",
1314 Py_TYPE(args)->tp_name);
1315 return 0;
1316 }
1317 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1318 "idna", &host, &port))
1319 return 0;
1320 addr=(struct sockaddr_in*)addr_ret;
1321 result = setipaddr(host, (struct sockaddr *)addr,
1322 sizeof(*addr), AF_INET);
1323 PyMem_Free(host);
1324 if (result < 0)
1325 return 0;
1326 if (port < 0 || port > 0xffff) {
1327 PyErr_SetString(
1328 PyExc_OverflowError,
1329 "getsockaddrarg: port must be 0-65535.");
1330 return 0;
1331 }
1332 addr->sin_family = AF_INET;
1333 addr->sin_port = htons((short)port);
1334 *len_ret = sizeof *addr;
1335 return 1;
1336 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001337
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001338#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001339 case AF_INET6:
1340 {
1341 struct sockaddr_in6* addr;
1342 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001343 int port, result;
1344 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001345 flowinfo = scope_id = 0;
1346 if (!PyTuple_Check(args)) {
1347 PyErr_Format(
1348 PyExc_TypeError,
1349 "getsockaddrarg: "
1350 "AF_INET6 address must be tuple, not %.500s",
1351 Py_TYPE(args)->tp_name);
1352 return 0;
1353 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001354 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001355 "idna", &host, &port, &flowinfo,
1356 &scope_id)) {
1357 return 0;
1358 }
1359 addr = (struct sockaddr_in6*)addr_ret;
1360 result = setipaddr(host, (struct sockaddr *)addr,
1361 sizeof(*addr), AF_INET6);
1362 PyMem_Free(host);
1363 if (result < 0)
1364 return 0;
1365 if (port < 0 || port > 0xffff) {
1366 PyErr_SetString(
1367 PyExc_OverflowError,
1368 "getsockaddrarg: port must be 0-65535.");
1369 return 0;
1370 }
Charles-François Natali65dd7452012-06-23 10:06:56 +02001371 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001372 PyErr_SetString(
1373 PyExc_OverflowError,
1374 "getsockaddrarg: flowinfo must be 0-1048575.");
1375 return 0;
1376 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001377 addr->sin6_family = s->sock_family;
1378 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001379 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001380 addr->sin6_scope_id = scope_id;
1381 *len_ret = sizeof *addr;
1382 return 1;
1383 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001384#endif
1385
Hye-Shik Chang81268602004-02-02 06:05:24 +00001386#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001387 case AF_BLUETOOTH:
1388 {
1389 switch (s->sock_proto) {
1390 case BTPROTO_L2CAP:
1391 {
1392 struct sockaddr_l2 *addr;
1393 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001395 addr = (struct sockaddr_l2 *)addr_ret;
1396 memset(addr, 0, sizeof(struct sockaddr_l2));
1397 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1398 if (!PyArg_ParseTuple(args, "si", &straddr,
1399 &_BT_L2_MEMB(addr, psm))) {
1400 PyErr_SetString(socket_error, "getsockaddrarg: "
1401 "wrong format");
1402 return 0;
1403 }
1404 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1405 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001407 *len_ret = sizeof *addr;
1408 return 1;
1409 }
1410 case BTPROTO_RFCOMM:
1411 {
1412 struct sockaddr_rc *addr;
1413 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001415 addr = (struct sockaddr_rc *)addr_ret;
1416 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1417 if (!PyArg_ParseTuple(args, "si", &straddr,
1418 &_BT_RC_MEMB(addr, channel))) {
1419 PyErr_SetString(socket_error, "getsockaddrarg: "
1420 "wrong format");
1421 return 0;
1422 }
1423 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1424 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001425
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001426 *len_ret = sizeof *addr;
1427 return 1;
1428 }
1429 case BTPROTO_HCI:
1430 {
1431 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001432#if defined(__NetBSD__) || defined(__DragonFly__)
1433 char *straddr = PyBytes_AS_STRING(args);
1434
1435 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1436 if (straddr == NULL) {
1437 PyErr_SetString(socket_error, "getsockaddrarg: "
1438 "wrong format");
1439 return 0;
1440 }
1441 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1442 return 0;
1443#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001444 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1445 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1446 PyErr_SetString(socket_error, "getsockaddrarg: "
1447 "wrong format");
1448 return 0;
1449 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001450#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001451 *len_ret = sizeof *addr;
1452 return 1;
1453 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001454#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 case BTPROTO_SCO:
1456 {
1457 struct sockaddr_sco *addr;
1458 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001459
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001460 addr = (struct sockaddr_sco *)addr_ret;
1461 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1462 straddr = PyString_AsString(args);
1463 if (straddr == NULL) {
1464 PyErr_SetString(socket_error, "getsockaddrarg: "
1465 "wrong format");
1466 return 0;
1467 }
1468 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1469 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001470
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001471 *len_ret = sizeof *addr;
1472 return 1;
1473 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001475 default:
1476 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1477 return 0;
1478 }
1479 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001480#endif
1481
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001482#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001483 case AF_PACKET:
1484 {
1485 struct sockaddr_ll* addr;
1486 struct ifreq ifr;
1487 char *interfaceName;
1488 int protoNumber;
1489 int hatype = 0;
1490 int pkttype = 0;
1491 char *haddr = NULL;
1492 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001493
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001494 if (!PyTuple_Check(args)) {
1495 PyErr_Format(
1496 PyExc_TypeError,
1497 "getsockaddrarg: "
1498 "AF_PACKET address must be tuple, not %.500s",
1499 Py_TYPE(args)->tp_name);
1500 return 0;
1501 }
1502 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1503 &protoNumber, &pkttype, &hatype,
1504 &haddr, &halen))
1505 return 0;
1506 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1507 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1508 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1509 s->errorhandler();
1510 return 0;
1511 }
1512 if (halen > 8) {
1513 PyErr_SetString(PyExc_ValueError,
1514 "Hardware address must be 8 bytes or less");
1515 return 0;
1516 }
1517 if (protoNumber < 0 || protoNumber > 0xffff) {
1518 PyErr_SetString(
1519 PyExc_OverflowError,
1520 "getsockaddrarg: protoNumber must be 0-65535.");
1521 return 0;
1522 }
1523 addr = (struct sockaddr_ll*)addr_ret;
1524 addr->sll_family = AF_PACKET;
1525 addr->sll_protocol = htons((short)protoNumber);
1526 addr->sll_ifindex = ifr.ifr_ifindex;
1527 addr->sll_pkttype = pkttype;
1528 addr->sll_hatype = hatype;
1529 if (halen != 0) {
1530 memcpy(&addr->sll_addr, haddr, halen);
1531 }
1532 addr->sll_halen = halen;
1533 *len_ret = sizeof *addr;
1534 return 1;
1535 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001536#endif
1537
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001538#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001539 case AF_TIPC:
1540 {
1541 unsigned int atype, v1, v2, v3;
1542 unsigned int scope = TIPC_CLUSTER_SCOPE;
1543 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001544
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001545 if (!PyTuple_Check(args)) {
1546 PyErr_Format(
1547 PyExc_TypeError,
1548 "getsockaddrarg: "
1549 "AF_TIPC address must be tuple, not %.500s",
1550 Py_TYPE(args)->tp_name);
1551 return 0;
1552 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001553
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001554 if (!PyArg_ParseTuple(args,
1555 "IIII|I;Invalid TIPC address format",
1556 &atype, &v1, &v2, &v3, &scope))
1557 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001559 addr = (struct sockaddr_tipc *) addr_ret;
1560 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001561
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001562 addr->family = AF_TIPC;
1563 addr->scope = scope;
1564 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001566 if (atype == TIPC_ADDR_NAMESEQ) {
1567 addr->addr.nameseq.type = v1;
1568 addr->addr.nameseq.lower = v2;
1569 addr->addr.nameseq.upper = v3;
1570 } else if (atype == TIPC_ADDR_NAME) {
1571 addr->addr.name.name.type = v1;
1572 addr->addr.name.name.instance = v2;
1573 } else if (atype == TIPC_ADDR_ID) {
1574 addr->addr.id.node = v1;
1575 addr->addr.id.ref = v2;
1576 } else {
1577 /* Shouldn't happen */
1578 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1579 return 0;
1580 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001582 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001584 return 1;
1585 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001586#endif
1587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001589
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001590 default:
1591 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1592 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001595}
1596
Guido van Rossum30a685f1991-06-27 15:51:29 +00001597
Guido van Rossum48a680c2001-03-02 06:34:14 +00001598/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001599 Return 1 if the family is known, 0 otherwise. The length is returned
1600 through len_ret. */
1601
1602static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001603getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001604{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001605 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001606
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001607#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001608 case AF_UNIX:
1609 {
1610 *len_ret = sizeof (struct sockaddr_un);
1611 return 1;
1612 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001613#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001614#if defined(AF_NETLINK)
1615 case AF_NETLINK:
1616 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001617 *len_ret = sizeof (struct sockaddr_nl);
1618 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001619 }
1620#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001622 case AF_INET:
1623 {
1624 *len_ret = sizeof (struct sockaddr_in);
1625 return 1;
1626 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001627
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001628#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001629 case AF_INET6:
1630 {
1631 *len_ret = sizeof (struct sockaddr_in6);
1632 return 1;
1633 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001634#endif
1635
Hye-Shik Chang81268602004-02-02 06:05:24 +00001636#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001637 case AF_BLUETOOTH:
1638 {
1639 switch(s->sock_proto)
1640 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001641
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001642 case BTPROTO_L2CAP:
1643 *len_ret = sizeof (struct sockaddr_l2);
1644 return 1;
1645 case BTPROTO_RFCOMM:
1646 *len_ret = sizeof (struct sockaddr_rc);
1647 return 1;
1648 case BTPROTO_HCI:
1649 *len_ret = sizeof (struct sockaddr_hci);
1650 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001651#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001652 case BTPROTO_SCO:
1653 *len_ret = sizeof (struct sockaddr_sco);
1654 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001655#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 default:
1657 PyErr_SetString(socket_error, "getsockaddrlen: "
1658 "unknown BT protocol");
1659 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001660
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001661 }
1662 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001663#endif
1664
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001665#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001666 case AF_PACKET:
1667 {
1668 *len_ret = sizeof (struct sockaddr_ll);
1669 return 1;
1670 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001671#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001672
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001673#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001674 case AF_TIPC:
1675 {
1676 *len_ret = sizeof (struct sockaddr_tipc);
1677 return 1;
1678 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001679#endif
1680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001682
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001683 default:
1684 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1685 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001686
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001687 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001688}
1689
1690
Guido van Rossum30a685f1991-06-27 15:51:29 +00001691/* s.accept() method */
1692
Guido van Rossum73624e91994-10-10 17:59:00 +00001693static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001694sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001696 sock_addr_t addrbuf;
1697 SOCKET_T newfd;
1698 socklen_t addrlen;
1699 PyObject *sock = NULL;
1700 PyObject *addr = NULL;
1701 PyObject *res = NULL;
1702 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001703
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001704 if (!getsockaddrlen(s, &addrlen))
1705 return NULL;
1706 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001707
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001708#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001709 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001710#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001711 newfd = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001712#endif
1713
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 if (!IS_SELECTABLE(s))
1715 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001716
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001717 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001718 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001719 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001720 if (!timeout)
1721 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1722 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001723
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001724 if (timeout == 1) {
1725 PyErr_SetString(socket_timeout, "timed out");
1726 return NULL;
1727 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001728 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001729
Fred Drakea04eaad2000-06-30 02:46:07 +00001730#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001731 if (newfd == INVALID_SOCKET)
Fred Drakea04eaad2000-06-30 02:46:07 +00001732#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001734#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001735 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001737 /* Create the new object with unspecified family,
1738 to avoid calls to bind() etc. on it. */
1739 sock = (PyObject *) new_sockobject(newfd,
1740 s->sock_family,
1741 s->sock_type,
1742 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001743
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001744 if (sock == NULL) {
1745 SOCKETCLOSE(newfd);
1746 goto finally;
1747 }
1748 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1749 addrlen, s->sock_proto);
1750 if (addr == NULL)
1751 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001753 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001754
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 Py_XDECREF(sock);
1757 Py_XDECREF(addr);
1758 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759}
1760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001761PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001762"accept() -> (socket object, address info)\n\
1763\n\
1764Wait for an incoming connection. Return a new socket representing the\n\
1765connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001766info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001767
Guido van Rossum11ba0942002-06-13 15:07:44 +00001768/* s.setblocking(flag) method. Argument:
1769 False -- non-blocking mode; same as settimeout(0)
1770 True -- blocking mode; same as settimeout(None)
1771*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001772
Guido van Rossum73624e91994-10-10 17:59:00 +00001773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001774sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001775{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001776 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001778 block = PyInt_AsLong(arg);
1779 if (block == -1 && PyErr_Occurred())
1780 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001781
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001782 s->sock_timeout = block ? -1.0 : 0.0;
1783 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001784
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001785 Py_INCREF(Py_None);
1786 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001787}
Guido van Rossume4485b01994-09-07 14:32:49 +00001788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001789PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001790"setblocking(flag)\n\
1791\n\
1792Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001793setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001794setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001795
Guido van Rossum11ba0942002-06-13 15:07:44 +00001796/* s.settimeout(timeout) method. Argument:
1797 None -- no timeout, blocking mode; same as setblocking(True)
1798 0.0 -- non-blocking mode; same as setblocking(False)
1799 > 0 -- timeout mode; operations time out after timeout seconds
1800 < 0 -- illegal; raises an exception
1801*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001802static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001803sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001804{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001805 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001806
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001807 if (arg == Py_None)
1808 timeout = -1.0;
1809 else {
1810 timeout = PyFloat_AsDouble(arg);
1811 if (timeout < 0.0) {
1812 if (!PyErr_Occurred())
1813 PyErr_SetString(PyExc_ValueError,
1814 "Timeout value out of range");
1815 return NULL;
1816 }
1817 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001818
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001819 s->sock_timeout = timeout;
1820 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001821
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001822 Py_INCREF(Py_None);
1823 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001824}
1825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001826PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001827"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001828\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001829Set a timeout on socket operations. 'timeout' can be a float,\n\
1830giving in seconds, or None. Setting a timeout of None disables\n\
1831the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001833
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001834/* s.gettimeout() method.
1835 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001837sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001838{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001839 if (s->sock_timeout < 0.0) {
1840 Py_INCREF(Py_None);
1841 return Py_None;
1842 }
1843 else
1844 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001845}
1846
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001847PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001848"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001849\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001850Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001851operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001852operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001853
Guido van Rossum48a680c2001-03-02 06:34:14 +00001854#ifdef RISCOS
1855/* s.sleeptaskw(1 | 0) method */
1856
1857static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001858sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001859{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001860 int block;
1861 block = PyInt_AsLong(arg);
1862 if (block == -1 && PyErr_Occurred())
1863 return NULL;
1864 Py_BEGIN_ALLOW_THREADS
1865 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1866 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001867
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001868 Py_INCREF(Py_None);
1869 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001870}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001871PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001872"sleeptaskw(flag)\n\
1873\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001874Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001875#endif
1876
1877
Guido van Rossumaee08791992-09-08 09:05:33 +00001878/* s.setsockopt() method.
1879 With an integer third argument, sets an integer option.
1880 With a string third argument, sets an option from a buffer;
1881 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001882
Guido van Rossum73624e91994-10-10 17:59:00 +00001883static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001884sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001885{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001886 int level;
1887 int optname;
1888 int res;
1889 char *buf;
1890 int buflen;
1891 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001892
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001893 if (PyArg_ParseTuple(args, "iii:setsockopt",
1894 &level, &optname, &flag)) {
1895 buf = (char *) &flag;
1896 buflen = sizeof flag;
1897 }
1898 else {
1899 PyErr_Clear();
1900 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1901 &level, &optname, &buf, &buflen))
1902 return NULL;
1903 }
1904 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1905 if (res < 0)
1906 return s->errorhandler();
1907 Py_INCREF(Py_None);
1908 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001909}
1910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001911PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001912"setsockopt(level, option, value)\n\
1913\n\
1914Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001915The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001916
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001917
Guido van Rossumaee08791992-09-08 09:05:33 +00001918/* s.getsockopt() method.
1919 With two arguments, retrieves an integer option.
1920 With a third integer argument, retrieves a string buffer of that size;
1921 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001922
Guido van Rossum73624e91994-10-10 17:59:00 +00001923static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001924sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001926 int level;
1927 int optname;
1928 int res;
1929 PyObject *buf;
1930 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001931
Guido van Rossumbcc20741998-08-04 22:53:56 +00001932#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001933 /* We have incomplete socket support. */
1934 PyErr_SetString(socket_error, "getsockopt not supported");
1935 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001936#else
1937
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001938 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1939 &level, &optname, &buflen))
1940 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001941
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001942 if (buflen == 0) {
1943 int flag = 0;
1944 socklen_t flagsize = sizeof flag;
1945 res = getsockopt(s->sock_fd, level, optname,
1946 (void *)&flag, &flagsize);
1947 if (res < 0)
1948 return s->errorhandler();
1949 return PyInt_FromLong(flag);
1950 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001951#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001952 /* socklen_t is unsigned so no negative test is needed,
1953 test buflen == 0 is previously done */
1954 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001955#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001956 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001957#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001958 PyErr_SetString(socket_error,
1959 "getsockopt buflen out of range");
1960 return NULL;
1961 }
1962 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1963 if (buf == NULL)
1964 return NULL;
1965 res = getsockopt(s->sock_fd, level, optname,
1966 (void *)PyString_AS_STRING(buf), &buflen);
1967 if (res < 0) {
1968 Py_DECREF(buf);
1969 return s->errorhandler();
1970 }
1971 _PyString_Resize(&buf, buflen);
1972 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001973#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001974}
1975
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001976PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001977"getsockopt(level, option[, buffersize]) -> value\n\
1978\n\
1979Get a socket option. See the Unix manual for level and option.\n\
1980If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001981string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001983
Fred Drake728819a2000-07-01 03:40:12 +00001984/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001985
Guido van Rossum73624e91994-10-10 17:59:00 +00001986static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001987sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001988{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001989 sock_addr_t addrbuf;
1990 int addrlen;
1991 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001992
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001993 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1994 return NULL;
1995 Py_BEGIN_ALLOW_THREADS
1996 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1997 Py_END_ALLOW_THREADS
1998 if (res < 0)
1999 return s->errorhandler();
2000 Py_INCREF(Py_None);
2001 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002002}
2003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002004PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002005"bind(address)\n\
2006\n\
2007Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002008pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002009sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002010
Guido van Rossum30a685f1991-06-27 15:51:29 +00002011
2012/* s.close() method.
2013 Set the file descriptor to -1 so operations tried subsequently
2014 will surely fail. */
2015
Guido van Rossum73624e91994-10-10 17:59:00 +00002016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002018{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002019 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002020
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002021 if ((fd = s->sock_fd) != -1) {
2022 s->sock_fd = -1;
2023 Py_BEGIN_ALLOW_THREADS
2024 (void) SOCKETCLOSE(fd);
2025 Py_END_ALLOW_THREADS
2026 }
2027 Py_INCREF(Py_None);
2028 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002029}
2030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002031PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002032"close()\n\
2033\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002034Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002035
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002036static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002037internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002038 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002039{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002040 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002041
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002042 timeout = 0;
2043 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002044
2045#ifdef MS_WINDOWS
2046
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002047 if (s->sock_timeout > 0.0) {
2048 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2049 IS_SELECTABLE(s)) {
2050 /* This is a mess. Best solution: trust select */
2051 fd_set fds;
2052 fd_set fds_exc;
2053 struct timeval tv;
2054 tv.tv_sec = (int)s->sock_timeout;
2055 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2056 FD_ZERO(&fds);
2057 FD_SET(s->sock_fd, &fds);
2058 FD_ZERO(&fds_exc);
2059 FD_SET(s->sock_fd, &fds_exc);
2060 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2061 if (res == 0) {
2062 res = WSAEWOULDBLOCK;
2063 timeout = 1;
2064 } else if (res > 0) {
2065 if (FD_ISSET(s->sock_fd, &fds))
2066 /* The socket is in the writeable set - this
2067 means connected */
2068 res = 0;
2069 else {
2070 /* As per MS docs, we need to call getsockopt()
2071 to get the underlying error */
2072 int res_size = sizeof res;
2073 /* It must be in the exception set */
2074 assert(FD_ISSET(s->sock_fd, &fds_exc));
2075 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2076 (char *)&res, &res_size))
2077 /* getsockopt also clears WSAGetLastError,
2078 so reset it back. */
2079 WSASetLastError(res);
2080 else
2081 res = WSAGetLastError();
2082 }
2083 }
2084 /* else if (res < 0) an error occurred */
2085 }
2086 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002087
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002088 if (res < 0)
2089 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002090
2091#else
2092
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002093 if (s->sock_timeout > 0.0) {
2094 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2095 timeout = internal_select(s, 1);
2096 if (timeout == 0) {
2097 /* Bug #1019808: in case of an EINPROGRESS,
2098 use getsockopt(SO_ERROR) to get the real
2099 error. */
2100 socklen_t res_size = sizeof res;
2101 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2102 SO_ERROR, &res, &res_size);
2103 if (res == EISCONN)
2104 res = 0;
2105 errno = res;
2106 }
2107 else if (timeout == -1) {
2108 res = errno; /* had error */
2109 }
2110 else
2111 res = EWOULDBLOCK; /* timed out */
2112 }
2113 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002114
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 if (res < 0)
2116 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002117
2118#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002119 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002120
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002121 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002122}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002123
Fred Drake728819a2000-07-01 03:40:12 +00002124/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002125
Guido van Rossum73624e91994-10-10 17:59:00 +00002126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002127sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002128{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002129 sock_addr_t addrbuf;
2130 int addrlen;
2131 int res;
2132 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002134 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2135 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002137 Py_BEGIN_ALLOW_THREADS
2138 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2139 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002140
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002141 if (timeout == 1) {
2142 PyErr_SetString(socket_timeout, "timed out");
2143 return NULL;
2144 }
2145 if (res != 0)
2146 return s->errorhandler();
2147 Py_INCREF(Py_None);
2148 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002149}
2150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002151PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002152"connect(address)\n\
2153\n\
2154Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002155is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002156
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157
Fred Drake728819a2000-07-01 03:40:12 +00002158/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002159
2160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002161sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002162{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002163 sock_addr_t addrbuf;
2164 int addrlen;
2165 int res;
2166 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002167
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002168 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2169 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002171 Py_BEGIN_ALLOW_THREADS
2172 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2173 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002174
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002175 /* Signals are not errors (though they may raise exceptions). Adapted
2176 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002177#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002178 if (res == EINTR && PyErr_CheckSignals())
2179 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002180#endif
2181
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002182 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002183}
2184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002185PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002186"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002187\n\
2188This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002191
Guido van Rossumed233a51992-06-23 09:07:03 +00002192/* s.fileno() method */
2193
Guido van Rossum73624e91994-10-10 17:59:00 +00002194static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002195sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002196{
Fred Drakea04eaad2000-06-30 02:46:07 +00002197#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002198 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002199#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002200 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002201#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002202}
2203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002204PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002205"fileno() -> integer\n\
2206\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002207Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002208
Guido van Rossumed233a51992-06-23 09:07:03 +00002209
Guido van Rossumbe32c891996-06-20 16:25:29 +00002210#ifndef NO_DUP
2211/* s.dup() method */
2212
2213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002214sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002215{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002216 SOCKET_T newfd;
2217 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002218
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002219 newfd = dup(s->sock_fd);
2220 if (newfd < 0)
2221 return s->errorhandler();
2222 sock = (PyObject *) new_sockobject(newfd,
2223 s->sock_family,
2224 s->sock_type,
2225 s->sock_proto);
2226 if (sock == NULL)
2227 SOCKETCLOSE(newfd);
2228 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002229}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002230
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002231PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002232"dup() -> socket object\n\
2233\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002234Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002235
Guido van Rossumbe32c891996-06-20 16:25:29 +00002236#endif
2237
2238
Guido van Rossumc89705d1992-11-26 08:54:07 +00002239/* s.getsockname() method */
2240
Guido van Rossum73624e91994-10-10 17:59:00 +00002241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002243{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002244 sock_addr_t addrbuf;
2245 int res;
2246 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002247
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002248 if (!getsockaddrlen(s, &addrlen))
2249 return NULL;
2250 memset(&addrbuf, 0, addrlen);
2251 Py_BEGIN_ALLOW_THREADS
2252 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2253 Py_END_ALLOW_THREADS
2254 if (res < 0)
2255 return s->errorhandler();
2256 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2257 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002258}
2259
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002260PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002261"getsockname() -> address info\n\
2262\n\
2263Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002264info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002265
Guido van Rossumc89705d1992-11-26 08:54:07 +00002266
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002267#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002268/* s.getpeername() method */
2269
Guido van Rossum73624e91994-10-10 17:59:00 +00002270static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002271sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002272{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002273 sock_addr_t addrbuf;
2274 int res;
2275 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002276
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002277 if (!getsockaddrlen(s, &addrlen))
2278 return NULL;
2279 memset(&addrbuf, 0, addrlen);
2280 Py_BEGIN_ALLOW_THREADS
2281 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2282 Py_END_ALLOW_THREADS
2283 if (res < 0)
2284 return s->errorhandler();
2285 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2286 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002287}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002289PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002290"getpeername() -> address info\n\
2291\n\
2292Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002293info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002294
Guido van Rossumb6775db1994-08-01 11:34:53 +00002295#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002296
2297
Guido van Rossum30a685f1991-06-27 15:51:29 +00002298/* s.listen(n) method */
2299
Guido van Rossum73624e91994-10-10 17:59:00 +00002300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002301sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002303 int backlog;
2304 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002305
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002306 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002307 if (backlog == -1 && PyErr_Occurred())
2308 return NULL;
2309 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002310 /* To avoid problems on systems that don't allow a negative backlog
2311 * (which doesn't make sense anyway) we force a minimum value of 0. */
2312 if (backlog < 0)
2313 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002314 res = listen(s->sock_fd, backlog);
2315 Py_END_ALLOW_THREADS
2316 if (res < 0)
2317 return s->errorhandler();
2318 Py_INCREF(Py_None);
2319 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002320}
2321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002322PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002323"listen(backlog)\n\
2324\n\
2325Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002326least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2327unaccepted connections that the system will allow before refusing new\n\
2328connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002329
2330
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002331#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002332/* s.makefile(mode) method.
2333 Create a new open file object referring to a dupped version of
2334 the socket's file descriptor. (The dup() call is necessary so
2335 that the open file and socket objects may be closed independent
2336 of each other.)
2337 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2338
Guido van Rossum73624e91994-10-10 17:59:00 +00002339static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002340sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002341{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002342 extern int fclose(FILE *);
2343 char *mode = "r";
2344 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002345#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002346 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002347#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002348 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002349#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002350 FILE *fp;
2351 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002352#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002353 char *mode_r = "r";
2354 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002355#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002357 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2358 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002359#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 if (strcmp(mode,"rb") == 0) {
2361 mode = mode_r;
2362 }
2363 else {
2364 if (strcmp(mode,"wb") == 0) {
2365 mode = mode_w;
2366 }
2367 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002368#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002369#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002370 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2371 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002372#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002373 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002374#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 {
2376 if (fd >= 0)
2377 SOCKETCLOSE(fd);
2378 return s->errorhandler();
2379 }
2380 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2381 if (f != NULL)
2382 PyFile_SetBufSize(f, bufsize);
2383 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002384}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002385
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002386PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002387"makefile([mode[, buffersize]]) -> file object\n\
2388\n\
2389Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002390The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002391
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002392#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002393
Martin Blais2856e5f2006-05-26 12:03:27 +00002394/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002395 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002396 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002397 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002398 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002399 * also possible that we return a number of bytes smaller than the request
2400 * bytes.
2401 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002402static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002403sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2404{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002405 ssize_t outlen = -1;
2406 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002407#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002408 int remaining;
2409 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002410#endif
2411
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002412 if (!IS_SELECTABLE(s)) {
2413 select_error();
2414 return -1;
2415 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002416
2417#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002418 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002419 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002420 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002421 if (!timeout)
2422 outlen = recv(s->sock_fd, cbuf, len, flags);
2423 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002424
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002425 if (timeout == 1) {
2426 PyErr_SetString(socket_timeout, "timed out");
2427 return -1;
2428 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002429 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 if (outlen < 0) {
2431 /* Note: the call to errorhandler() ALWAYS indirectly returned
2432 NULL, so ignore its return value */
2433 s->errorhandler();
2434 return -1;
2435 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002436#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002437 read_buf = cbuf;
2438 remaining = len;
2439 while (remaining != 0) {
2440 unsigned int segment;
2441 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002442
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002443 segment = remaining /SEGMENT_SIZE;
2444 if (segment != 0) {
2445 segment = SEGMENT_SIZE;
2446 }
2447 else {
2448 segment = remaining;
2449 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002450
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002451 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002452 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002453 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002454 if (!timeout)
2455 nread = recv(s->sock_fd, read_buf, segment, flags);
2456 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002457
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002458 if (timeout == 1) {
2459 PyErr_SetString(socket_timeout, "timed out");
2460 return -1;
2461 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002462 END_SELECT_LOOP(s)
2463
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002464 if (nread < 0) {
2465 s->errorhandler();
2466 return -1;
2467 }
2468 if (nread != remaining) {
2469 read_buf += nread;
2470 break;
2471 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002472
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002473 remaining -= segment;
2474 read_buf += segment;
2475 }
2476 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002477#endif /* !__VMS */
2478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002479 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002480}
2481
Guido van Rossum48a680c2001-03-02 06:34:14 +00002482
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002483/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002484
Guido van Rossum73624e91994-10-10 17:59:00 +00002485static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002486sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002487{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002488 int recvlen, flags = 0;
2489 ssize_t outlen;
2490 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002491
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002492 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2493 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002494
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002495 if (recvlen < 0) {
2496 PyErr_SetString(PyExc_ValueError,
2497 "negative buffersize in recv");
2498 return NULL;
2499 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002500
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002501 /* Allocate a new string. */
2502 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2503 if (buf == NULL)
2504 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002506 /* Call the guts */
2507 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2508 if (outlen < 0) {
2509 /* An error occurred, release the string and return an
2510 error. */
2511 Py_DECREF(buf);
2512 return NULL;
2513 }
2514 if (outlen != recvlen) {
2515 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002516 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002517 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002518 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002519 return NULL;
2520 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002521
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002522 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002523}
2524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526"recv(buffersize[, flags]) -> data\n\
2527\n\
2528Receive up to buffersize bytes from the socket. For the optional flags\n\
2529argument, see the Unix manual. When no data is available, block until\n\
2530at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002531the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002532
Guido van Rossum30a685f1991-06-27 15:51:29 +00002533
Martin Blaisaf2ae722006-06-04 13:49:49 +00002534/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535
Martin Blais2856e5f2006-05-26 12:03:27 +00002536static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002537sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002538{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002539 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002540
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002541 int recvlen = 0, flags = 0;
2542 ssize_t readlen;
2543 Py_buffer buf;
2544 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002545
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002546 /* Get the buffer's memory */
2547 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2548 &buf, &recvlen, &flags))
2549 return NULL;
2550 buflen = buf.len;
2551 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002552
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002553 if (recvlen < 0) {
2554 PyErr_SetString(PyExc_ValueError,
2555 "negative buffersize in recv_into");
2556 goto error;
2557 }
2558 if (recvlen == 0) {
2559 /* If nbytes was not specified, use the buffer's length */
2560 recvlen = buflen;
2561 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002562
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002563 /* Check if the buffer is large enough */
2564 if (buflen < recvlen) {
2565 PyErr_SetString(PyExc_ValueError,
2566 "buffer too small for requested bytes");
2567 goto error;
2568 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002569
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002570 /* Call the guts */
2571 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2572 if (readlen < 0) {
2573 /* Return an error. */
2574 goto error;
2575 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002576
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002577 PyBuffer_Release(&buf);
2578 /* Return the number of bytes read. Note that we do not do anything
2579 special here in the case that readlen < recvlen. */
2580 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002581
2582error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002583 PyBuffer_Release(&buf);
2584 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002585}
2586
Martin Blaisaf2ae722006-06-04 13:49:49 +00002587PyDoc_STRVAR(recv_into_doc,
2588"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002589\n\
2590A version of recv() that stores its data into a buffer rather than creating \n\
2591a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2592is not specified (or 0), receive up to the size available in the given buffer.\n\
2593\n\
2594See recv() for documentation about the flags.");
2595
2596
2597/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002598 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2599 * into a char buffer. If you have any inc/def ref to do to the objects that
2600 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002601 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002602 * that it is also possible that we return a number of bytes smaller than the
2603 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002604 *
2605 * 'addr' is a return value for the address object. Note that you must decref
2606 * it yourself.
2607 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002608static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002609sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002610 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002611{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002612 sock_addr_t addrbuf;
2613 int timeout;
2614 ssize_t n = -1;
2615 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002616
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002617 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002618
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002619 if (!getsockaddrlen(s, &addrlen))
2620 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002622 if (!IS_SELECTABLE(s)) {
2623 select_error();
2624 return -1;
2625 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002626
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002627 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002628 Py_BEGIN_ALLOW_THREADS
2629 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002630 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002631 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002632#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002633#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002634 n = recvfrom(s->sock_fd, cbuf, len, flags,
2635 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002636#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002637 n = recvfrom(s->sock_fd, cbuf, len, flags,
2638 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002639#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002640#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002641 n = recvfrom(s->sock_fd, cbuf, len, flags,
2642 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002643#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002644 }
2645 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002646
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002647 if (timeout == 1) {
2648 PyErr_SetString(socket_timeout, "timed out");
2649 return -1;
2650 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002651 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002652 if (n < 0) {
2653 s->errorhandler();
2654 return -1;
2655 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002656
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002657 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2658 addrlen, s->sock_proto)))
2659 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002660
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002661 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002662}
2663
2664/* s.recvfrom(nbytes [,flags]) method */
2665
2666static PyObject *
2667sock_recvfrom(PySocketSockObject *s, PyObject *args)
2668{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002669 PyObject *buf = NULL;
2670 PyObject *addr = NULL;
2671 PyObject *ret = NULL;
2672 int recvlen, flags = 0;
2673 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002674
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002675 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2676 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002677
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002678 if (recvlen < 0) {
2679 PyErr_SetString(PyExc_ValueError,
2680 "negative buffersize in recvfrom");
2681 return NULL;
2682 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002683
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002684 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2685 if (buf == NULL)
2686 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002687
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002688 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2689 recvlen, flags, &addr);
2690 if (outlen < 0) {
2691 goto finally;
2692 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002693
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002694 if (outlen != recvlen) {
2695 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002696 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002697 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002698 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002699 goto finally;
2700 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002701
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002702 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
2704finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002705 Py_XDECREF(buf);
2706 Py_XDECREF(addr);
2707 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002708}
2709
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002711"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2712\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002713Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002714
Martin Blais2856e5f2006-05-26 12:03:27 +00002715
Martin Blaisaf2ae722006-06-04 13:49:49 +00002716/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002717
2718static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002719sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002720{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002721 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002722
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002723 int recvlen = 0, flags = 0;
2724 ssize_t readlen;
2725 Py_buffer buf;
2726 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002728 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002730 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2731 kwlist, &buf,
2732 &recvlen, &flags))
2733 return NULL;
2734 buflen = buf.len;
2735 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002737 if (recvlen < 0) {
2738 PyErr_SetString(PyExc_ValueError,
2739 "negative buffersize in recvfrom_into");
2740 goto error;
2741 }
2742 if (recvlen == 0) {
2743 /* If nbytes was not specified, use the buffer's length */
2744 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002745 } else if (recvlen > buflen) {
2746 PyErr_SetString(PyExc_ValueError,
2747 "nbytes is greater than the length of the buffer");
2748 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002749 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002750
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002751 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2752 if (readlen < 0) {
2753 /* Return an error */
2754 goto error;
2755 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002756
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002757 PyBuffer_Release(&buf);
2758 /* Return the number of bytes read and the address. Note that we do
2759 not do anything special here in the case that readlen < recvlen. */
2760 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002761
2762error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002763 Py_XDECREF(addr);
2764 PyBuffer_Release(&buf);
2765 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002766}
2767
Martin Blaisaf2ae722006-06-04 13:49:49 +00002768PyDoc_STRVAR(recvfrom_into_doc,
2769"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002770\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002771Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002772
2773
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002774/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002775
Guido van Rossum73624e91994-10-10 17:59:00 +00002776static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002777sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002778{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002779 char *buf;
2780 int len, n = -1, flags = 0, timeout;
2781 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002782
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002783 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2784 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002785
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002786 if (!IS_SELECTABLE(s)) {
2787 PyBuffer_Release(&pbuf);
2788 return select_error();
2789 }
2790 buf = pbuf.buf;
2791 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002792
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002793 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002794 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002795 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002797#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002798 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002799#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002800 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002801#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002803 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002804 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002805 PyErr_SetString(socket_timeout, "timed out");
2806 return NULL;
2807 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002808 END_SELECT_LOOP(s)
2809
2810 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002811 if (n < 0)
2812 return s->errorhandler();
2813 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002814}
2815
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002816PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002817"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002818\n\
2819Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002820argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002821sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002822
2823
2824/* s.sendall(data [,flags]) method */
2825
2826static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002827sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002828{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002829 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002830 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002831 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002832
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002833 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2834 return NULL;
2835 buf = pbuf.buf;
2836 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002837
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002838 if (!IS_SELECTABLE(s)) {
2839 PyBuffer_Release(&pbuf);
2840 return select_error();
2841 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002842
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002843 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002844 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002845 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002846 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002847 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002848 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002849#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002850 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002851#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002852 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002853#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002854 }
2855 Py_END_ALLOW_THREADS
2856 if (timeout == 1) {
2857 PyBuffer_Release(&pbuf);
2858 PyErr_SetString(socket_timeout, "timed out");
2859 return NULL;
2860 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002861 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002862 /* PyErr_CheckSignals() might change errno */
2863 saved_errno = errno;
2864 /* We must run our signal handlers before looping again.
2865 send() can return a successful partial write when it is
2866 interrupted, so we can't restrict ourselves to EINTR. */
2867 if (PyErr_CheckSignals()) {
2868 PyBuffer_Release(&pbuf);
2869 return NULL;
2870 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002871 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002872 /* If interrupted, try again */
2873 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002874 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002875 else
2876 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002877 }
2878 buf += n;
2879 len -= n;
2880 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002881 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002882
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002883 if (n < 0)
2884 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002885
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002886 Py_INCREF(Py_None);
2887 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002888}
2889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002890PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002891"sendall(data[, flags])\n\
2892\n\
2893Send a data string to the socket. For the optional flags\n\
2894argument, see the Unix manual. This calls send() repeatedly\n\
2895until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002896to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002897
Guido van Rossum30a685f1991-06-27 15:51:29 +00002898
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002899/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002900
Guido van Rossum73624e91994-10-10 17:59:00 +00002901static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002902sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002903{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002904 Py_buffer pbuf;
2905 PyObject *addro;
2906 char *buf;
2907 Py_ssize_t len;
2908 sock_addr_t addrbuf;
2909 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002910 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002911
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002912 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002913 arglen = PyTuple_Size(args);
2914 switch(arglen) {
2915 case 2:
2916 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2917 break;
2918 case 3:
2919 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2920 break;
2921 default:
2922 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2923 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002924 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002925 if (PyErr_Occurred())
2926 return NULL;
2927
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002928 buf = pbuf.buf;
2929 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002931 if (!IS_SELECTABLE(s)) {
2932 PyBuffer_Release(&pbuf);
2933 return select_error();
2934 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002935
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002936 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2937 PyBuffer_Release(&pbuf);
2938 return NULL;
2939 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002940
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002941 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002942 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002943 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002944 if (!timeout)
2945 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2946 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002947
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002948 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002949 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002950 PyErr_SetString(socket_timeout, "timed out");
2951 return NULL;
2952 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002953 END_SELECT_LOOP(s)
2954 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002955 if (n < 0)
2956 return s->errorhandler();
2957 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002958}
2959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002960PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002961"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002962\n\
2963Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965
Guido van Rossum30a685f1991-06-27 15:51:29 +00002966
2967/* s.shutdown(how) method */
2968
Guido van Rossum73624e91994-10-10 17:59:00 +00002969static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002970sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002971{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002972 int how;
2973 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002974
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002975 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002976 if (how == -1 && PyErr_Occurred())
2977 return NULL;
2978 Py_BEGIN_ALLOW_THREADS
2979 res = shutdown(s->sock_fd, how);
2980 Py_END_ALLOW_THREADS
2981 if (res < 0)
2982 return s->errorhandler();
2983 Py_INCREF(Py_None);
2984 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002985}
2986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002987PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002988"shutdown(flag)\n\
2989\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002990Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2991of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002992
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002993#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002994static PyObject*
2995sock_ioctl(PySocketSockObject *s, PyObject *arg)
2996{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002997 unsigned long cmd = SIO_RCVALL;
2998 PyObject *argO;
2999 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00003000
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003001 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3002 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00003003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003004 switch (cmd) {
3005 case SIO_RCVALL: {
3006 unsigned int option = RCVALL_ON;
3007 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3008 return NULL;
3009 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3010 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3011 return set_error();
3012 }
3013 return PyLong_FromUnsignedLong(recv); }
3014 case SIO_KEEPALIVE_VALS: {
3015 struct tcp_keepalive ka;
3016 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3017 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3018 return NULL;
3019 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3020 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3021 return set_error();
3022 }
3023 return PyLong_FromUnsignedLong(recv); }
3024 default:
3025 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3026 return NULL;
3027 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003028}
3029PyDoc_STRVAR(sock_ioctl_doc,
3030"ioctl(cmd, option) -> long\n\
3031\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003032Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3033SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3034SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003035
3036#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003037
3038/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003039
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003040static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003041 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3042 accept_doc},
3043 {"bind", (PyCFunction)sock_bind, METH_O,
3044 bind_doc},
3045 {"close", (PyCFunction)sock_close, METH_NOARGS,
3046 close_doc},
3047 {"connect", (PyCFunction)sock_connect, METH_O,
3048 connect_doc},
3049 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3050 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003051#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003052 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3053 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003054#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003055 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3056 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003057#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003058 {"getpeername", (PyCFunction)sock_getpeername,
3059 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003060#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003061 {"getsockname", (PyCFunction)sock_getsockname,
3062 METH_NOARGS, getsockname_doc},
3063 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3064 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003065#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003066 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3067 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003068#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003069 {"listen", (PyCFunction)sock_listen, METH_O,
3070 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003071#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003072 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3073 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003075 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3076 recv_doc},
3077 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3078 recv_into_doc},
3079 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3080 recvfrom_doc},
3081 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3082 recvfrom_into_doc},
3083 {"send", (PyCFunction)sock_send, METH_VARARGS,
3084 send_doc},
3085 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3086 sendall_doc},
3087 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3088 sendto_doc},
3089 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3090 setblocking_doc},
3091 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3092 settimeout_doc},
3093 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3094 gettimeout_doc},
3095 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3096 setsockopt_doc},
3097 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3098 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003099#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003100 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3101 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003102#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003103 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003104};
3105
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003106/* SockObject members */
3107static PyMemberDef sock_memberlist[] = {
3108 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3109 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3110 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3111 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3112 {0},
3113};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003114
Guido van Rossum73624e91994-10-10 17:59:00 +00003115/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003116 First close the file description. */
3117
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003118static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003119sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003120{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003121 if (s->sock_fd != -1)
3122 (void) SOCKETCLOSE(s->sock_fd);
3123 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003124}
3125
Guido van Rossum30a685f1991-06-27 15:51:29 +00003126
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003127static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003128sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003129{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003130 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003131#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003132 if (s->sock_fd > LONG_MAX) {
3133 /* this can occur on Win64, and actually there is a special
3134 ugly printf formatter for decimal pointer length integer
3135 printing, only bother if necessary*/
3136 PyErr_SetString(PyExc_OverflowError,
3137 "no printf formatter to display "
3138 "the socket descriptor in decimal");
3139 return NULL;
3140 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003141#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003142 PyOS_snprintf(
3143 buf, sizeof(buf),
3144 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3145 (long)s->sock_fd, s->sock_family,
3146 s->sock_type,
3147 s->sock_proto);
3148 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003149}
3150
3151
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003152/* Create a new, uninitialized socket object. */
3153
3154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003155sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003156{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003157 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003158
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003159 new = type->tp_alloc(type, 0);
3160 if (new != NULL) {
3161 ((PySocketSockObject *)new)->sock_fd = -1;
3162 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3163 ((PySocketSockObject *)new)->errorhandler = &set_error;
3164 }
3165 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003166}
3167
3168
3169/* Initialize a new socket object. */
3170
3171/*ARGSUSED*/
3172static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003173sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003174{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003175 PySocketSockObject *s = (PySocketSockObject *)self;
3176 SOCKET_T fd;
3177 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3178 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003179
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003180 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3181 "|iii:socket", keywords,
3182 &family, &type, &proto))
3183 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003184
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003185 Py_BEGIN_ALLOW_THREADS
3186 fd = socket(family, type, proto);
3187 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003188
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003189#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003190 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003191#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003192 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003193#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003194 {
3195 set_error();
3196 return -1;
3197 }
3198 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003199
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003200 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003201
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003202}
3203
3204
Guido van Rossumb6775db1994-08-01 11:34:53 +00003205/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003206
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003207static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003208 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3209 "_socket.socket", /* tp_name */
3210 sizeof(PySocketSockObject), /* tp_basicsize */
3211 0, /* tp_itemsize */
3212 (destructor)sock_dealloc, /* tp_dealloc */
3213 0, /* tp_print */
3214 0, /* tp_getattr */
3215 0, /* tp_setattr */
3216 0, /* tp_compare */
3217 (reprfunc)sock_repr, /* tp_repr */
3218 0, /* tp_as_number */
3219 0, /* tp_as_sequence */
3220 0, /* tp_as_mapping */
3221 0, /* tp_hash */
3222 0, /* tp_call */
3223 0, /* tp_str */
3224 PyObject_GenericGetAttr, /* tp_getattro */
3225 0, /* tp_setattro */
3226 0, /* tp_as_buffer */
3227 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3228 sock_doc, /* tp_doc */
3229 0, /* tp_traverse */
3230 0, /* tp_clear */
3231 0, /* tp_richcompare */
3232 0, /* tp_weaklistoffset */
3233 0, /* tp_iter */
3234 0, /* tp_iternext */
3235 sock_methods, /* tp_methods */
3236 sock_memberlist, /* tp_members */
3237 0, /* tp_getset */
3238 0, /* tp_base */
3239 0, /* tp_dict */
3240 0, /* tp_descr_get */
3241 0, /* tp_descr_set */
3242 0, /* tp_dictoffset */
3243 sock_initobj, /* tp_init */
3244 PyType_GenericAlloc, /* tp_alloc */
3245 sock_new, /* tp_new */
3246 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003247};
3248
Guido van Rossum30a685f1991-06-27 15:51:29 +00003249
Guido van Rossum81194471991-07-27 21:42:02 +00003250/* Python interface to gethostname(). */
3251
3252/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003253static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003254socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003255{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003256 char buf[1024];
3257 int res;
3258 Py_BEGIN_ALLOW_THREADS
3259 res = gethostname(buf, (int) sizeof buf - 1);
3260 Py_END_ALLOW_THREADS
3261 if (res < 0)
3262 return set_error();
3263 buf[sizeof buf - 1] = '\0';
3264 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003265}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003267PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003268"gethostname() -> string\n\
3269\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003270Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003271
Guido van Rossumff4949e1992-08-05 19:58:53 +00003272
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273/* Python interface to gethostbyname(name). */
3274
3275/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003277socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003278{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003279 char *name;
3280 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003281
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003282 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3283 return NULL;
3284 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3285 return NULL;
3286 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003287}
3288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003289PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003290"gethostbyname(host) -> address\n\
3291\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003293
3294
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003295/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3296
3297static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003298gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003299{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003300 char **pch;
3301 PyObject *rtn_tuple = (PyObject *)NULL;
3302 PyObject *name_list = (PyObject *)NULL;
3303 PyObject *addr_list = (PyObject *)NULL;
3304 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003306 if (h == NULL) {
3307 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003308#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003309 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003310#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003311 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003312#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003313 return NULL;
3314 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003316 if (h->h_addrtype != af) {
3317 /* Let's get real error message to return */
3318 PyErr_SetString(socket_error,
3319 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003320
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003321 return NULL;
3322 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003325
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003326 case AF_INET:
3327 if (alen < sizeof(struct sockaddr_in))
3328 return NULL;
3329 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003330
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003331#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003332 case AF_INET6:
3333 if (alen < sizeof(struct sockaddr_in6))
3334 return NULL;
3335 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003336#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003337
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003338 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003339
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 if ((name_list = PyList_New(0)) == NULL)
3341 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003342
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003343 if ((addr_list = PyList_New(0)) == NULL)
3344 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003346 /* SF #1511317: h_aliases can be NULL */
3347 if (h->h_aliases) {
3348 for (pch = h->h_aliases; *pch != NULL; pch++) {
3349 int status;
3350 tmp = PyString_FromString(*pch);
3351 if (tmp == NULL)
3352 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003353
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003354 status = PyList_Append(name_list, tmp);
3355 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003357 if (status)
3358 goto err;
3359 }
3360 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3363 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003364
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003365 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003366
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003367 case AF_INET:
3368 {
3369 struct sockaddr_in sin;
3370 memset(&sin, 0, sizeof(sin));
3371 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003372#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003373 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003374#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003375 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3376 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003378 if (pch == h->h_addr_list && alen >= sizeof(sin))
3379 memcpy((char *) addr, &sin, sizeof(sin));
3380 break;
3381 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003382
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003383#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003384 case AF_INET6:
3385 {
3386 struct sockaddr_in6 sin6;
3387 memset(&sin6, 0, sizeof(sin6));
3388 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003389#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003390 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003391#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003392 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3393 tmp = makeipaddr((struct sockaddr *)&sin6,
3394 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003395
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003396 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3397 memcpy((char *) addr, &sin6, sizeof(sin6));
3398 break;
3399 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003400#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003402 default: /* can't happen */
3403 PyErr_SetString(socket_error,
3404 "unsupported address family");
3405 return NULL;
3406 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003408 if (tmp == NULL)
3409 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003410
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003411 status = PyList_Append(addr_list, tmp);
3412 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003414 if (status)
3415 goto err;
3416 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003417
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003418 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003419
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003420 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003421 Py_XDECREF(name_list);
3422 Py_XDECREF(addr_list);
3423 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003424}
3425
3426
3427/* Python interface to gethostbyname_ex(name). */
3428
3429/*ARGSUSED*/
3430static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003431socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003432{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003433 char *name;
3434 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003435#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003436 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003437#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003438 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003439#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003440 struct sockaddr *sa;
3441 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003442#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003443 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003444#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003445 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003446#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003447 char buf[16384];
3448 int buf_len = (sizeof buf) - 1;
3449 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003450#endif
3451#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003452 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003453#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003454#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003455
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003456 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3457 return NULL;
3458 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3459 return NULL;
3460 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003461#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003462#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003463 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3464 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003465#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003466 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003467#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003468 memset((void *) &data, '\0', sizeof(data));
3469 result = gethostbyname_r(name, &hp_allocated, &data);
3470 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003471#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003472#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003473#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003474 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003475#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003476 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003477#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003478 Py_END_ALLOW_THREADS
3479 /* Some C libraries would require addr.__ss_family instead of
3480 addr.ss_family.
3481 Therefore, we cast the sockaddr_storage into sockaddr to
3482 access sa_family. */
3483 sa = (struct sockaddr*)&addr;
3484 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3485 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003486#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003487 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003488#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003489 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003490}
3491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003492PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003493"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3494\n\
3495Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003496for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003497
3498
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003499/* Python interface to gethostbyaddr(IP). */
3500
3501/*ARGSUSED*/
3502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003503socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003504{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003505#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003506 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003507#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003508 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003509#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003510 struct sockaddr *sa = (struct sockaddr *)&addr;
3511 char *ip_num;
3512 struct hostent *h;
3513 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003514#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003515 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003516#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003517 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003518#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003519 /* glibcs up to 2.10 assume that the buf argument to
3520 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3521 does not ensure. The attribute below instructs the compiler
3522 to maintain this alignment. */
3523 char buf[16384] Py_ALIGNED(8);
3524 int buf_len = (sizeof buf) - 1;
3525 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003526#endif
3527#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003528 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003529#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003530#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003531 char *ap;
3532 int al;
3533 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003534
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003535 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3536 return NULL;
3537 af = AF_UNSPEC;
3538 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3539 return NULL;
3540 af = sa->sa_family;
3541 ap = NULL;
3542 switch (af) {
3543 case AF_INET:
3544 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3545 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3546 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003547#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003548 case AF_INET6:
3549 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3550 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3551 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003552#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003553 default:
3554 PyErr_SetString(socket_error, "unsupported address family");
3555 return NULL;
3556 }
3557 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003558#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003559#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003560 result = gethostbyaddr_r(ap, al, af,
3561 &hp_allocated, buf, buf_len,
3562 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003563#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003564 h = gethostbyaddr_r(ap, al, af,
3565 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003566#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003567 memset((void *) &data, '\0', sizeof(data));
3568 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3569 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003570#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003571#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003572#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003573 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003574#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003575 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003576#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003577 Py_END_ALLOW_THREADS
3578 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003579#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003580 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003581#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003582 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003583}
3584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003585PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003586"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3587\n\
3588Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003589for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003590
Guido van Rossum30a685f1991-06-27 15:51:29 +00003591
3592/* Python interface to getservbyname(name).
3593 This only returns the port number, since the other info is already
3594 known or not useful (like the list of aliases). */
3595
3596/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003597static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003598socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003599{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003600 char *name, *proto=NULL;
3601 struct servent *sp;
3602 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3603 return NULL;
3604 Py_BEGIN_ALLOW_THREADS
3605 sp = getservbyname(name, proto);
3606 Py_END_ALLOW_THREADS
3607 if (sp == NULL) {
3608 PyErr_SetString(socket_error, "service/proto not found");
3609 return NULL;
3610 }
3611 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003612}
3613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003614PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003615"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003616\n\
3617Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003618The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3619otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003620
Guido van Rossum30a685f1991-06-27 15:51:29 +00003621
Barry Warsaw11b91a02004-06-28 00:50:43 +00003622/* Python interface to getservbyport(port).
3623 This only returns the service name, since the other info is already
3624 known or not useful (like the list of aliases). */
3625
3626/*ARGSUSED*/
3627static PyObject *
3628socket_getservbyport(PyObject *self, PyObject *args)
3629{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003630 int port;
3631 char *proto=NULL;
3632 struct servent *sp;
3633 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3634 return NULL;
3635 if (port < 0 || port > 0xffff) {
3636 PyErr_SetString(
3637 PyExc_OverflowError,
3638 "getservbyport: port must be 0-65535.");
3639 return NULL;
3640 }
3641 Py_BEGIN_ALLOW_THREADS
3642 sp = getservbyport(htons((short)port), proto);
3643 Py_END_ALLOW_THREADS
3644 if (sp == NULL) {
3645 PyErr_SetString(socket_error, "port/proto not found");
3646 return NULL;
3647 }
3648 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003649}
3650
3651PyDoc_STRVAR(getservbyport_doc,
3652"getservbyport(port[, protocolname]) -> string\n\
3653\n\
3654Return the service name from a port number and protocol name.\n\
3655The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3656otherwise any protocol will match.");
3657
Guido van Rossum3901d851996-12-19 16:35:04 +00003658/* Python interface to getprotobyname(name).
3659 This only returns the protocol number, since the other info is
3660 already known or not useful (like the list of aliases). */
3661
3662/*ARGSUSED*/
3663static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003664socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003665{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003666 char *name;
3667 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003668#ifdef __BEOS__
3669/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003670 PyErr_SetString(socket_error, "getprotobyname not supported");
3671 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003672#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003673 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3674 return NULL;
3675 Py_BEGIN_ALLOW_THREADS
3676 sp = getprotobyname(name);
3677 Py_END_ALLOW_THREADS
3678 if (sp == NULL) {
3679 PyErr_SetString(socket_error, "protocol not found");
3680 return NULL;
3681 }
3682 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003683#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003684}
3685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003686PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003687"getprotobyname(name) -> integer\n\
3688\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003689Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003690
Guido van Rossum3901d851996-12-19 16:35:04 +00003691
Dave Cole331708b2004-08-09 04:51:41 +00003692#ifdef HAVE_SOCKETPAIR
3693/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003694 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003695 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003696
3697/*ARGSUSED*/
3698static PyObject *
3699socket_socketpair(PyObject *self, PyObject *args)
3700{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003701 PySocketSockObject *s0 = NULL, *s1 = NULL;
3702 SOCKET_T sv[2];
3703 int family, type = SOCK_STREAM, proto = 0;
3704 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003705
3706#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003707 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003708#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003709 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003710#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003711 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3712 &family, &type, &proto))
3713 return NULL;
3714 /* Create a pair of socket fds */
3715 if (socketpair(family, type, proto, sv) < 0)
3716 return set_error();
3717 s0 = new_sockobject(sv[0], family, type, proto);
3718 if (s0 == NULL)
3719 goto finally;
3720 s1 = new_sockobject(sv[1], family, type, proto);
3721 if (s1 == NULL)
3722 goto finally;
3723 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003724
3725finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003726 if (res == NULL) {
3727 if (s0 == NULL)
3728 SOCKETCLOSE(sv[0]);
3729 if (s1 == NULL)
3730 SOCKETCLOSE(sv[1]);
3731 }
3732 Py_XDECREF(s0);
3733 Py_XDECREF(s1);
3734 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003735}
3736
3737PyDoc_STRVAR(socketpair_doc,
3738"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3739\n\
3740Create a pair of socket objects from the sockets returned by the platform\n\
3741socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003742The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003743AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003744
3745#endif /* HAVE_SOCKETPAIR */
3746
3747
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003748#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003749/* Create a socket object from a numeric file description.
3750 Useful e.g. if stdin is a socket.
3751 Additional arguments as for socket(). */
3752
3753/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003754static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003755socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003756{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003757 PySocketSockObject *s;
3758 SOCKET_T fd;
3759 int family, type, proto = 0;
3760 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3761 &fd, &family, &type, &proto))
3762 return NULL;
3763 /* Dup the fd so it and the socket can be closed independently */
3764 fd = dup(fd);
3765 if (fd < 0)
3766 return set_error();
3767 s = new_sockobject(fd, family, type, proto);
3768 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003769}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003771PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003772"fromfd(fd, family, type[, proto]) -> socket object\n\
3773\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003774Create a socket object from a duplicate of the given\n\
3775file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003776The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003777
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003778#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003779
Guido van Rossum82a5c661998-07-07 20:45:43 +00003780
Guido van Rossum006bf911996-06-12 04:04:55 +00003781static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003782socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003783{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003784 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003785
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003786 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3787 return NULL;
3788 }
3789 if (x1 < 0) {
3790 PyErr_SetString(PyExc_OverflowError,
3791 "can't convert negative number to unsigned long");
3792 return NULL;
3793 }
3794 x2 = (unsigned int)ntohs((unsigned short)x1);
3795 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003796}
3797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003798PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003799"ntohs(integer) -> integer\n\
3800\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003801Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003802
3803
Guido van Rossum006bf911996-06-12 04:04:55 +00003804static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003805socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003806{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003807 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003808
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003809 if (PyInt_Check(arg)) {
3810 x = PyInt_AS_LONG(arg);
3811 if (x == (unsigned long) -1 && PyErr_Occurred())
3812 return NULL;
3813 if ((long)x < 0) {
3814 PyErr_SetString(PyExc_OverflowError,
3815 "can't convert negative number to unsigned long");
3816 return NULL;
3817 }
3818 }
3819 else if (PyLong_Check(arg)) {
3820 x = PyLong_AsUnsignedLong(arg);
3821 if (x == (unsigned long) -1 && PyErr_Occurred())
3822 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003823#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003824 {
3825 unsigned long y;
3826 /* only want the trailing 32 bits */
3827 y = x & 0xFFFFFFFFUL;
3828 if (y ^ x)
3829 return PyErr_Format(PyExc_OverflowError,
3830 "long int larger than 32 bits");
3831 x = y;
3832 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003833#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003834 }
3835 else
3836 return PyErr_Format(PyExc_TypeError,
3837 "expected int/long, %s found",
3838 Py_TYPE(arg)->tp_name);
3839 if (x == (unsigned long) -1 && PyErr_Occurred())
3840 return NULL;
3841 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003842}
3843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003844PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003845"ntohl(integer) -> integer\n\
3846\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003847Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003848
3849
Guido van Rossum006bf911996-06-12 04:04:55 +00003850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003851socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003852{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003853 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003854
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003855 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3856 return NULL;
3857 }
3858 if (x1 < 0) {
3859 PyErr_SetString(PyExc_OverflowError,
3860 "can't convert negative number to unsigned long");
3861 return NULL;
3862 }
3863 x2 = (unsigned int)htons((unsigned short)x1);
3864 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003865}
3866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003867PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003868"htons(integer) -> integer\n\
3869\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003870Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003871
3872
Guido van Rossum006bf911996-06-12 04:04:55 +00003873static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003874socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003875{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003876 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003878 if (PyInt_Check(arg)) {
3879 x = PyInt_AS_LONG(arg);
3880 if (x == (unsigned long) -1 && PyErr_Occurred())
3881 return NULL;
3882 if ((long)x < 0) {
3883 PyErr_SetString(PyExc_OverflowError,
3884 "can't convert negative number to unsigned long");
3885 return NULL;
3886 }
3887 }
3888 else if (PyLong_Check(arg)) {
3889 x = PyLong_AsUnsignedLong(arg);
3890 if (x == (unsigned long) -1 && PyErr_Occurred())
3891 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003892#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003893 {
3894 unsigned long y;
3895 /* only want the trailing 32 bits */
3896 y = x & 0xFFFFFFFFUL;
3897 if (y ^ x)
3898 return PyErr_Format(PyExc_OverflowError,
3899 "long int larger than 32 bits");
3900 x = y;
3901 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003902#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003903 }
3904 else
3905 return PyErr_Format(PyExc_TypeError,
3906 "expected int/long, %s found",
3907 Py_TYPE(arg)->tp_name);
3908 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003909}
3910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003911PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003912"htonl(integer) -> integer\n\
3913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003914Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003915
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003916/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003917
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003918PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003919"inet_aton(string) -> packed 32-bit IP representation\n\
3920\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003921Convert 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 +00003922binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003923
3924static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003925socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003926{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003927#ifndef INADDR_NONE
3928#define INADDR_NONE (-1)
3929#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003930#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003931 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003932#endif
3933
3934#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003935#if (SIZEOF_INT != 4)
3936#error "Not sure if in_addr_t exists and int is not 32-bits."
3937#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003938 /* Have to use inet_addr() instead */
3939 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003940#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003941 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003943 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3944 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003945
Tim Peters1df9fdd2003-02-13 03:13:40 +00003946
3947#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003948
3949#ifdef USE_INET_ATON_WEAKLINK
3950 if (inet_aton != NULL) {
3951#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 if (inet_aton(ip_addr, &buf))
3953 return PyString_FromStringAndSize((char *)(&buf),
3954 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003955
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003956 PyErr_SetString(socket_error,
3957 "illegal IP address string passed to inet_aton");
3958 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003959
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003960#ifdef USE_INET_ATON_WEAKLINK
3961 } else {
3962#endif
3963
3964#endif
3965
3966#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3967
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003968 /* special-case this address as inet_addr might return INADDR_NONE
3969 * for this */
3970 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3971 packed_addr = 0xFFFFFFFF;
3972 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003973
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003974 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003975
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003976 if (packed_addr == INADDR_NONE) { /* invalid address */
3977 PyErr_SetString(socket_error,
3978 "illegal IP address string passed to inet_aton");
3979 return NULL;
3980 }
3981 }
3982 return PyString_FromStringAndSize((char *) &packed_addr,
3983 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003984
3985#ifdef USE_INET_ATON_WEAKLINK
3986 }
3987#endif
3988
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003989#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003990}
3991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003992PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003993"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003994\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003995Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003996
3997static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003998socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003999{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004000 char *packed_str;
4001 int addr_len;
4002 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004004 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4005 return NULL;
4006 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004008 if (addr_len != sizeof(packed_addr)) {
4009 PyErr_SetString(socket_error,
4010 "packed IP wrong length for inet_ntoa");
4011 return NULL;
4012 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004013
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004014 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004015
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004016 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004017}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004018
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004019#ifdef HAVE_INET_PTON
4020
4021PyDoc_STRVAR(inet_pton_doc,
4022"inet_pton(af, ip) -> packed IP address string\n\
4023\n\
4024Convert an IP address from string format to a packed string suitable\n\
4025for use with low-level network functions.");
4026
4027static PyObject *
4028socket_inet_pton(PyObject *self, PyObject *args)
4029{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004030 int af;
4031 char* ip;
4032 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004033#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004034 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004035#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004036 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004037#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004038 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4039 return NULL;
4040 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004041
Martin v. Löwis04697e82004-06-02 12:35:29 +00004042#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004043 if(af == AF_INET6) {
4044 PyErr_SetString(socket_error,
4045 "can't use AF_INET6, IPv6 is disabled");
4046 return NULL;
4047 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004048#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004049
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004050 retval = inet_pton(af, ip, packed);
4051 if (retval < 0) {
4052 PyErr_SetFromErrno(socket_error);
4053 return NULL;
4054 } else if (retval == 0) {
4055 PyErr_SetString(socket_error,
4056 "illegal IP address string passed to inet_pton");
4057 return NULL;
4058 } else if (af == AF_INET) {
4059 return PyString_FromStringAndSize(packed,
4060 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004061#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004062 } else if (af == AF_INET6) {
4063 return PyString_FromStringAndSize(packed,
4064 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004065#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004066 } else {
4067 PyErr_SetString(socket_error, "unknown address family");
4068 return NULL;
4069 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004070}
Martin Blais2856e5f2006-05-26 12:03:27 +00004071
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004072PyDoc_STRVAR(inet_ntop_doc,
4073"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4074\n\
4075Convert a packed IP address of the given family to string format.");
4076
4077static PyObject *
4078socket_inet_ntop(PyObject *self, PyObject *args)
4079{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004080 int af;
4081 char* packed;
4082 int len;
4083 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004084#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004085 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004086#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004087 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004088#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004089
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004090 /* Guarantee NUL-termination for PyString_FromString() below */
4091 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004092
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004093 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4094 return NULL;
4095 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004096
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004097 if (af == AF_INET) {
4098 if (len != sizeof(struct in_addr)) {
4099 PyErr_SetString(PyExc_ValueError,
4100 "invalid length of packed IP address string");
4101 return NULL;
4102 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004103#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004104 } else if (af == AF_INET6) {
4105 if (len != sizeof(struct in6_addr)) {
4106 PyErr_SetString(PyExc_ValueError,
4107 "invalid length of packed IP address string");
4108 return NULL;
4109 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004111 } else {
4112 PyErr_Format(PyExc_ValueError,
4113 "unknown address family %d", af);
4114 return NULL;
4115 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004116
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004117 retval = inet_ntop(af, packed, ip, sizeof(ip));
4118 if (!retval) {
4119 PyErr_SetFromErrno(socket_error);
4120 return NULL;
4121 } else {
4122 return PyString_FromString(retval);
4123 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004124
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004125 /* NOTREACHED */
4126 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4127 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004128}
4129
4130#endif /* HAVE_INET_PTON */
4131
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004132/* Python interface to getaddrinfo(host, port). */
4133
4134/*ARGSUSED*/
4135static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004136socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004137{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004138 struct addrinfo hints, *res;
4139 struct addrinfo *res0 = NULL;
4140 PyObject *hobj = NULL;
4141 PyObject *pobj = (PyObject *)NULL;
4142 char pbuf[30];
4143 char *hptr, *pptr;
4144 int family, socktype, protocol, flags;
4145 int error;
4146 PyObject *all = (PyObject *)NULL;
4147 PyObject *single = (PyObject *)NULL;
4148 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004149
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004150 family = socktype = protocol = flags = 0;
4151 family = AF_UNSPEC;
4152 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4153 &hobj, &pobj, &family, &socktype,
4154 &protocol, &flags)) {
4155 return NULL;
4156 }
4157 if (hobj == Py_None) {
4158 hptr = NULL;
4159 } else if (PyUnicode_Check(hobj)) {
4160 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4161 if (!idna)
4162 return NULL;
4163 hptr = PyString_AsString(idna);
4164 } else if (PyString_Check(hobj)) {
4165 hptr = PyString_AsString(hobj);
4166 } else {
4167 PyErr_SetString(PyExc_TypeError,
4168 "getaddrinfo() argument 1 must be string or None");
4169 return NULL;
4170 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004171 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4172 long value = PyLong_AsLong(pobj);
4173 if (value == -1 && PyErr_Occurred())
4174 return NULL;
4175 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004176 pptr = pbuf;
4177 } else if (PyString_Check(pobj)) {
4178 pptr = PyString_AsString(pobj);
4179 } else if (pobj == Py_None) {
4180 pptr = (char *)NULL;
4181 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004182 PyErr_SetString(socket_error,
4183 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004184 goto err;
4185 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004186#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004187 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4188 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4189 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4190 * This workaround avoids a segfault in libsystem.
4191 */
4192 pptr = "00";
4193 }
4194#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004195 memset(&hints, 0, sizeof(hints));
4196 hints.ai_family = family;
4197 hints.ai_socktype = socktype;
4198 hints.ai_protocol = protocol;
4199 hints.ai_flags = flags;
4200 Py_BEGIN_ALLOW_THREADS
4201 ACQUIRE_GETADDRINFO_LOCK
4202 error = getaddrinfo(hptr, pptr, &hints, &res0);
4203 Py_END_ALLOW_THREADS
4204 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4205 if (error) {
4206 set_gaierror(error);
4207 goto err;
4208 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004209
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004210 if ((all = PyList_New(0)) == NULL)
4211 goto err;
4212 for (res = res0; res; res = res->ai_next) {
4213 PyObject *addr =
4214 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4215 if (addr == NULL)
4216 goto err;
4217 single = Py_BuildValue("iiisO", res->ai_family,
4218 res->ai_socktype, res->ai_protocol,
4219 res->ai_canonname ? res->ai_canonname : "",
4220 addr);
4221 Py_DECREF(addr);
4222 if (single == NULL)
4223 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004224
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004225 if (PyList_Append(all, single))
4226 goto err;
4227 Py_XDECREF(single);
4228 }
4229 Py_XDECREF(idna);
4230 if (res0)
4231 freeaddrinfo(res0);
4232 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004233 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004234 Py_XDECREF(single);
4235 Py_XDECREF(all);
4236 Py_XDECREF(idna);
4237 if (res0)
4238 freeaddrinfo(res0);
4239 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004240}
4241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004242PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004243"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4244 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004246Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004247
4248/* Python interface to getnameinfo(sa, flags). */
4249
4250/*ARGSUSED*/
4251static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004252socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004253{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004254 PyObject *sa = (PyObject *)NULL;
4255 int flags;
4256 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004257 int port;
4258 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004259 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4260 struct addrinfo hints, *res = NULL;
4261 int error;
4262 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004263
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004264 flags = flowinfo = scope_id = 0;
4265 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4266 return NULL;
4267 if (!PyTuple_Check(sa)) {
4268 PyErr_SetString(PyExc_TypeError,
4269 "getnameinfo() argument 1 must be a tuple");
4270 return NULL;
4271 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004272 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004273 &hostp, &port, &flowinfo, &scope_id))
4274 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004275 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004276 PyErr_SetString(PyExc_OverflowError,
4277 "getsockaddrarg: flowinfo must be 0-1048575.");
4278 return NULL;
4279 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004280 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4281 memset(&hints, 0, sizeof(hints));
4282 hints.ai_family = AF_UNSPEC;
4283 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4284 Py_BEGIN_ALLOW_THREADS
4285 ACQUIRE_GETADDRINFO_LOCK
4286 error = getaddrinfo(hostp, pbuf, &hints, &res);
4287 Py_END_ALLOW_THREADS
4288 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4289 if (error) {
4290 set_gaierror(error);
4291 goto fail;
4292 }
4293 if (res->ai_next) {
4294 PyErr_SetString(socket_error,
4295 "sockaddr resolved to multiple addresses");
4296 goto fail;
4297 }
4298 switch (res->ai_family) {
4299 case AF_INET:
4300 {
4301 if (PyTuple_GET_SIZE(sa) != 2) {
4302 PyErr_SetString(socket_error,
4303 "IPv4 sockaddr must be 2 tuple");
4304 goto fail;
4305 }
4306 break;
4307 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004308#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004309 case AF_INET6:
4310 {
4311 struct sockaddr_in6 *sin6;
4312 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004313 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004314 sin6->sin6_scope_id = scope_id;
4315 break;
4316 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004317#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004318 }
4319 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4320 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4321 if (error) {
4322 set_gaierror(error);
4323 goto fail;
4324 }
4325 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004326
4327fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004328 if (res)
4329 freeaddrinfo(res);
4330 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004331}
4332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004333PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004334"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004335\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004336Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004337
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004338
4339/* Python API to getting and setting the default timeout value. */
4340
4341static PyObject *
4342socket_getdefaulttimeout(PyObject *self)
4343{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004344 if (defaulttimeout < 0.0) {
4345 Py_INCREF(Py_None);
4346 return Py_None;
4347 }
4348 else
4349 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004350}
4351
4352PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004353"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004354\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004355Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004356A value of None indicates that new socket objects have no timeout.\n\
4357When the socket module is first imported, the default is None.");
4358
4359static PyObject *
4360socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004362 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004364 if (arg == Py_None)
4365 timeout = -1.0;
4366 else {
4367 timeout = PyFloat_AsDouble(arg);
4368 if (timeout < 0.0) {
4369 if (!PyErr_Occurred())
4370 PyErr_SetString(PyExc_ValueError,
4371 "Timeout value out of range");
4372 return NULL;
4373 }
4374 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004375
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004376 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004378 Py_INCREF(Py_None);
4379 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004380}
4381
4382PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004383"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004384\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004385Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004386A value of None indicates that new socket objects have no timeout.\n\
4387When the socket module is first imported, the default is None.");
4388
4389
Guido van Rossum30a685f1991-06-27 15:51:29 +00004390/* List of functions exported by this module. */
4391
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004392static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004393 {"gethostbyname", socket_gethostbyname,
4394 METH_VARARGS, gethostbyname_doc},
4395 {"gethostbyname_ex", socket_gethostbyname_ex,
4396 METH_VARARGS, ghbn_ex_doc},
4397 {"gethostbyaddr", socket_gethostbyaddr,
4398 METH_VARARGS, gethostbyaddr_doc},
4399 {"gethostname", socket_gethostname,
4400 METH_NOARGS, gethostname_doc},
4401 {"getservbyname", socket_getservbyname,
4402 METH_VARARGS, getservbyname_doc},
4403 {"getservbyport", socket_getservbyport,
4404 METH_VARARGS, getservbyport_doc},
4405 {"getprotobyname", socket_getprotobyname,
4406 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004407#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004408 {"fromfd", socket_fromfd,
4409 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004410#endif
Dave Cole331708b2004-08-09 04:51:41 +00004411#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004412 {"socketpair", socket_socketpair,
4413 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004414#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004415 {"ntohs", socket_ntohs,
4416 METH_VARARGS, ntohs_doc},
4417 {"ntohl", socket_ntohl,
4418 METH_O, ntohl_doc},
4419 {"htons", socket_htons,
4420 METH_VARARGS, htons_doc},
4421 {"htonl", socket_htonl,
4422 METH_O, htonl_doc},
4423 {"inet_aton", socket_inet_aton,
4424 METH_VARARGS, inet_aton_doc},
4425 {"inet_ntoa", socket_inet_ntoa,
4426 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004427#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004428 {"inet_pton", socket_inet_pton,
4429 METH_VARARGS, inet_pton_doc},
4430 {"inet_ntop", socket_inet_ntop,
4431 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004432#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004433 {"getaddrinfo", socket_getaddrinfo,
4434 METH_VARARGS, getaddrinfo_doc},
4435 {"getnameinfo", socket_getnameinfo,
4436 METH_VARARGS, getnameinfo_doc},
4437 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4438 METH_NOARGS, getdefaulttimeout_doc},
4439 {"setdefaulttimeout", socket_setdefaulttimeout,
4440 METH_O, setdefaulttimeout_doc},
4441 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004442};
4443
Guido van Rossum30a685f1991-06-27 15:51:29 +00004444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004445#ifdef RISCOS
4446#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004447
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004448static int
4449os_init(void)
4450{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004451 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004452
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004453 r.r[0] = 0;
4454 _kernel_swi(0x43380, &r, &r);
4455 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004456
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004457 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004458}
4459
4460#endif /* RISCOS */
4461
4462
4463#ifdef MS_WINDOWS
4464#define OS_INIT_DEFINED
4465
4466/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004467
4468static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004469os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004470{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004471 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004472}
4473
4474static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004475os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004477 WSADATA WSAData;
4478 int ret;
4479 char buf[100];
4480 ret = WSAStartup(0x0101, &WSAData);
4481 switch (ret) {
4482 case 0: /* No error */
4483 Py_AtExit(os_cleanup);
4484 return 1; /* Success */
4485 case WSASYSNOTREADY:
4486 PyErr_SetString(PyExc_ImportError,
4487 "WSAStartup failed: network not ready");
4488 break;
4489 case WSAVERNOTSUPPORTED:
4490 case WSAEINVAL:
4491 PyErr_SetString(
4492 PyExc_ImportError,
4493 "WSAStartup failed: requested version not supported");
4494 break;
4495 default:
4496 PyOS_snprintf(buf, sizeof(buf),
4497 "WSAStartup failed: error code %d", ret);
4498 PyErr_SetString(PyExc_ImportError, buf);
4499 break;
4500 }
4501 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004502}
4503
Guido van Rossum8d665e61996-06-26 18:22:49 +00004504#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004505
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004506
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004507#ifdef PYOS_OS2
4508#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004509
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004510/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004511
4512static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004513os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004514{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004515#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004516 char reason[64];
4517 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004519 if (rc == 0) {
4520 return 1; /* Success */
4521 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004522
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004523 PyOS_snprintf(reason, sizeof(reason),
4524 "OS/2 TCP/IP Error# %d", sock_errno());
4525 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004527 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004528#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004529 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004530 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004531#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004532}
4533
4534#endif /* PYOS_OS2 */
4535
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004536
4537#ifndef OS_INIT_DEFINED
4538static int
4539os_init(void)
4540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004541 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004542}
4543#endif
4544
4545
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004546/* C API table - always add new things to the end for binary
4547 compatibility. */
4548static
4549PySocketModule_APIObject PySocketModuleAPI =
4550{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004551 &sock_type,
4552 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004553};
4554
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004555
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004556/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004557
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004558 This module is actually called "_socket", and there's a wrapper
4559 "socket.py" which implements some additional functionality. On some
4560 platforms (e.g. Windows and OS/2), socket.py also implements a
4561 wrapper for the socket type that provides missing functionality such
4562 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4563 with an ImportError exception if os-specific initialization fails.
4564 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004565 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004566 made at exit time.
4567*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004569PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004570"Implementation module for socket operations.\n\
4571\n\
4572See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004573
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004574PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004575init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004576{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004577 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004578
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004579 if (!os_init())
4580 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004582 Py_TYPE(&sock_type) = &PyType_Type;
4583 m = Py_InitModule3(PySocket_MODULE_NAME,
4584 socket_methods,
4585 socket_doc);
4586 if (m == NULL)
4587 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004588
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004589 socket_error = PyErr_NewException("socket.error",
4590 PyExc_IOError, NULL);
4591 if (socket_error == NULL)
4592 return;
4593 PySocketModuleAPI.error = socket_error;
4594 Py_INCREF(socket_error);
4595 PyModule_AddObject(m, "error", socket_error);
4596 socket_herror = PyErr_NewException("socket.herror",
4597 socket_error, NULL);
4598 if (socket_herror == NULL)
4599 return;
4600 Py_INCREF(socket_herror);
4601 PyModule_AddObject(m, "herror", socket_herror);
4602 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4603 NULL);
4604 if (socket_gaierror == NULL)
4605 return;
4606 Py_INCREF(socket_gaierror);
4607 PyModule_AddObject(m, "gaierror", socket_gaierror);
4608 socket_timeout = PyErr_NewException("socket.timeout",
4609 socket_error, NULL);
4610 if (socket_timeout == NULL)
4611 return;
4612 Py_INCREF(socket_timeout);
4613 PyModule_AddObject(m, "timeout", socket_timeout);
4614 Py_INCREF((PyObject *)&sock_type);
4615 if (PyModule_AddObject(m, "SocketType",
4616 (PyObject *)&sock_type) != 0)
4617 return;
4618 Py_INCREF((PyObject *)&sock_type);
4619 if (PyModule_AddObject(m, "socket",
4620 (PyObject *)&sock_type) != 0)
4621 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004622
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004623#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004624 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004625#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004626 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004627#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004628 Py_INCREF(has_ipv6);
4629 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004630
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004631 /* Export C API */
4632 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4633 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4634 ) != 0)
4635 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004636
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004637 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004638#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004639 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004640#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004641 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004642#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004643 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004644#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004645#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004646 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004647#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004648#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004649 /* Amateur Radio AX.25 */
4650 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004651#endif
4652#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004653 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004654#endif
4655#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004656 /* Appletalk DDP */
4657 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004658#endif
4659#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004660 /* Amateur radio NetROM */
4661 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004662#endif
4663#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004664 /* Multiprotocol bridge */
4665 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004666#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004667#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004668 /* ATM PVCs */
4669 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004670#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004671#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004672 /* Reserved for Werner's ATM */
4673 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004674#endif
4675#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004676 /* Reserved for X.25 project */
4677 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004678#endif
4679#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004680 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004681#endif
4682#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004683 /* Amateur Radio X.25 PLP */
4684 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004685#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004686#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004687 /* Reserved for DECnet project */
4688 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004689#endif
4690#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004691 /* Reserved for 802.2LLC project */
4692 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004693#endif
4694#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004695 /* Security callback pseudo AF */
4696 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004697#endif
4698#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004699 /* PF_KEY key management API */
4700 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004701#endif
4702#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004703 /* */
4704 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4705 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004706#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004707 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004708#endif
4709#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004710 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004711#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004712 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4713 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004714#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004715 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004716#endif
4717#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004718 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004719#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004720#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004721 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004722#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004723#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004724 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004725#endif
4726#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004727 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004728#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004729 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004730#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004731 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4732#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004733#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004734 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004735#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004736#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004737#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004738 /* Alias to emulate 4.4BSD */
4739 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004740#endif
4741#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 /* Ash */
4743 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004744#endif
4745#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004746 /* Acorn Econet */
4747 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004748#endif
4749#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004750 /* ATM SVCs */
4751 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004752#endif
4753#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004754 /* Linux SNA Project (nutters!) */
4755 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004756#endif
4757#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004758 /* IRDA sockets */
4759 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004760#endif
4761#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004762 /* PPPoX sockets */
4763 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004764#endif
4765#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004766 /* Wanpipe API Sockets */
4767 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004768#endif
4769#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004770 /* Linux LLC */
4771 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004772#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004773
Hye-Shik Chang81268602004-02-02 06:05:24 +00004774#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004775 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4776 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4777 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4778 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004779#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004780 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004781#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004782#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004783#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004784 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004785#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004786 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4787 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004788#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004789 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4790 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4791 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004792#endif
4793
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004794#ifdef AF_PACKET
4795 PyModule_AddIntMacro(m, AF_PACKET);
4796#endif
4797#ifdef PF_PACKET
4798 PyModule_AddIntMacro(m, PF_PACKET);
4799#endif
4800#ifdef PACKET_HOST
4801 PyModule_AddIntMacro(m, PACKET_HOST);
4802#endif
4803#ifdef PACKET_BROADCAST
4804 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4805#endif
4806#ifdef PACKET_MULTICAST
4807 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4808#endif
4809#ifdef PACKET_OTHERHOST
4810 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4811#endif
4812#ifdef PACKET_OUTGOING
4813 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4814#endif
4815#ifdef PACKET_LOOPBACK
4816 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4817#endif
4818#ifdef PACKET_FASTROUTE
4819 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004820#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004821
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004822#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004823 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004824
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004825 /* for addresses */
4826 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4827 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4828 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004830 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4831 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4832 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004834 /* for setsockopt() */
4835 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4836 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4837 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4838 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4839 TIPC_DEST_DROPPABLE);
4840 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004841
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004842 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4843 TIPC_LOW_IMPORTANCE);
4844 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4845 TIPC_MEDIUM_IMPORTANCE);
4846 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4847 TIPC_HIGH_IMPORTANCE);
4848 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4849 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004850
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004851 /* for subscriptions */
4852 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4853 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004854#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004855 /* doesn't seem to be available everywhere */
4856 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004857#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004858 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4859 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4860 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4861 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4862 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4863 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004864#endif
4865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866 /* Socket types */
4867 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4868 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004869#ifndef __BEOS__
4870/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004871 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4872 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004873#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004874 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004875#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004876#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004878#ifdef SO_DEBUG
4879 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004880#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004881#ifdef SO_ACCEPTCONN
4882 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004883#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884#ifdef SO_REUSEADDR
4885 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004886#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004887#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004888 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004889#endif
4890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004891#ifdef SO_KEEPALIVE
4892 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004893#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004894#ifdef SO_DONTROUTE
4895 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004897#ifdef SO_BROADCAST
4898 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004900#ifdef SO_USELOOPBACK
4901 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004902#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903#ifdef SO_LINGER
4904 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004905#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004906#ifdef SO_OOBINLINE
4907 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004908#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004909#ifdef SO_REUSEPORT
4910 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004911#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912#ifdef SO_SNDBUF
4913 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004914#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915#ifdef SO_RCVBUF
4916 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004917#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef SO_SNDLOWAT
4919 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004920#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921#ifdef SO_RCVLOWAT
4922 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004923#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004924#ifdef SO_SNDTIMEO
4925 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927#ifdef SO_RCVTIMEO
4928 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004930#ifdef SO_ERROR
4931 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933#ifdef SO_TYPE
4934 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004936#ifdef SO_SETFIB
4937 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4938#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004939
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004940 /* Maximum number of connections for "listen" */
4941#ifdef SOMAXCONN
4942 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004943#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004944 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004945#endif
4946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004947 /* Flags for send, recv */
4948#ifdef MSG_OOB
4949 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004951#ifdef MSG_PEEK
4952 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004954#ifdef MSG_DONTROUTE
4955 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004957#ifdef MSG_DONTWAIT
4958 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004959#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004960#ifdef MSG_EOR
4961 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004962#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004963#ifdef MSG_TRUNC
4964 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004965#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004966#ifdef MSG_CTRUNC
4967 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969#ifdef MSG_WAITALL
4970 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972#ifdef MSG_BTAG
4973 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef MSG_ETAG
4976 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004977#endif
4978
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004979 /* Protocol level and numbers, usable for [gs]etsockopt */
4980#ifdef SOL_SOCKET
4981 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004982#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004983#ifdef SOL_IP
4984 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004985#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004986 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004987#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004988#ifdef SOL_IPX
4989 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004990#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004991#ifdef SOL_AX25
4992 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004993#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004994#ifdef SOL_ATALK
4995 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004996#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004997#ifdef SOL_NETROM
4998 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004999#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005000#ifdef SOL_ROSE
5001 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005002#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005003#ifdef SOL_TCP
5004 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005005#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005006 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef SOL_UDP
5009 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005010#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005012#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013#ifdef IPPROTO_IP
5014 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005015#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005016 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005017#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005018#ifdef IPPROTO_HOPOPTS
5019 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005020#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021#ifdef IPPROTO_ICMP
5022 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005023#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005024 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005025#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026#ifdef IPPROTO_IGMP
5027 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005028#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005029#ifdef IPPROTO_GGP
5030 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005031#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005032#ifdef IPPROTO_IPV4
5033 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005034#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035#ifdef IPPROTO_IPV6
5036 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005037#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005038#ifdef IPPROTO_IPIP
5039 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005040#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005041#ifdef IPPROTO_TCP
5042 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005043#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005044 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005045#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005046#ifdef IPPROTO_EGP
5047 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005048#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005049#ifdef IPPROTO_PUP
5050 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005051#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005052#ifdef IPPROTO_UDP
5053 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005054#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005055 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005056#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005057#ifdef IPPROTO_IDP
5058 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005059#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005060#ifdef IPPROTO_HELLO
5061 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005062#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005063#ifdef IPPROTO_ND
5064 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005065#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005066#ifdef IPPROTO_TP
5067 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005068#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005069#ifdef IPPROTO_IPV6
5070 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005071#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005072#ifdef IPPROTO_ROUTING
5073 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005075#ifdef IPPROTO_FRAGMENT
5076 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005077#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078#ifdef IPPROTO_RSVP
5079 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081#ifdef IPPROTO_GRE
5082 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IPPROTO_ESP
5085 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IPPROTO_AH
5088 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IPPROTO_MOBILE
5091 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IPPROTO_ICMPV6
5094 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IPPROTO_NONE
5097 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IPPROTO_DSTOPTS
5100 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IPPROTO_XTP
5103 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IPPROTO_EON
5106 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IPPROTO_PIM
5109 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111#ifdef IPPROTO_IPCOMP
5112 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005113#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005114#ifdef IPPROTO_VRRP
5115 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005116#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117#ifdef IPPROTO_BIP
5118 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005119#endif
5120/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121#ifdef IPPROTO_RAW
5122 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005123#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005124 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005125#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126#ifdef IPPROTO_MAX
5127 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005128#endif
5129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130 /* Some port configuration */
5131#ifdef IPPORT_RESERVED
5132 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005133#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005134 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005135#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005136#ifdef IPPORT_USERRESERVED
5137 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005138#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005140#endif
5141
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005142 /* Some reserved IP v.4 addresses */
5143#ifdef INADDR_ANY
5144 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005145#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005146 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005147#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148#ifdef INADDR_BROADCAST
5149 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005150#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005151 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005152#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005153#ifdef INADDR_LOOPBACK
5154 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005155#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005156 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005157#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005158#ifdef INADDR_UNSPEC_GROUP
5159 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005160#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005162#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163#ifdef INADDR_ALLHOSTS_GROUP
5164 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5165 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005166#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005167 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005168#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005169#ifdef INADDR_MAX_LOCAL_GROUP
5170 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5171 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005172#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005174#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175#ifdef INADDR_NONE
5176 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005177#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005179#endif
5180
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181 /* IPv4 [gs]etsockopt options */
5182#ifdef IP_OPTIONS
5183 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005184#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185#ifdef IP_HDRINCL
5186 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005187#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188#ifdef IP_TOS
5189 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005190#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191#ifdef IP_TTL
5192 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005193#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194#ifdef IP_RECVOPTS
5195 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005196#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005197#ifdef IP_RECVRETOPTS
5198 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005199#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200#ifdef IP_RECVDSTADDR
5201 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005202#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203#ifdef IP_RETOPTS
5204 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005205#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206#ifdef IP_MULTICAST_IF
5207 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005208#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209#ifdef IP_MULTICAST_TTL
5210 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef IP_MULTICAST_LOOP
5213 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215#ifdef IP_ADD_MEMBERSHIP
5216 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef IP_DROP_MEMBERSHIP
5219 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef IP_DEFAULT_MULTICAST_TTL
5222 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5223 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005224#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005225#ifdef IP_DEFAULT_MULTICAST_LOOP
5226 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5227 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005228#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005229#ifdef IP_MAX_MEMBERSHIPS
5230 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005231#endif
5232
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5234#ifdef IPV6_JOIN_GROUP
5235 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005236#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005237#ifdef IPV6_LEAVE_GROUP
5238 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005239#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005240#ifdef IPV6_MULTICAST_HOPS
5241 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef IPV6_MULTICAST_IF
5244 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005245#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005246#ifdef IPV6_MULTICAST_LOOP
5247 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005248#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249#ifdef IPV6_UNICAST_HOPS
5250 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005251#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005252 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005253#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005254 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005255#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005256 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005257#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005258 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005259#endif
5260#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005261 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005262#endif
5263#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005265#endif
5266#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005268#endif
5269#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005271#endif
5272#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005274#endif
5275#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005277#endif
5278#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005280#endif
5281#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005283#endif
5284#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
5287#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
5290#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005292#endif
5293#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005295#endif
5296#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
5299#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005301#endif
5302#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#endif
5305#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005307#endif
5308#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005310#endif
5311#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005313#endif
5314#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005316#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 /* TCP options */
5319#ifdef TCP_NODELAY
5320 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005321#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005322#ifdef TCP_MAXSEG
5323 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005324#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005325#ifdef TCP_CORK
5326 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005327#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005328#ifdef TCP_KEEPIDLE
5329 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005330#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005331#ifdef TCP_KEEPINTVL
5332 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005333#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005334#ifdef TCP_KEEPCNT
5335 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005336#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005337#ifdef TCP_SYNCNT
5338 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005339#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005340#ifdef TCP_LINGER2
5341 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005342#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005343#ifdef TCP_DEFER_ACCEPT
5344 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005345#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005346#ifdef TCP_WINDOW_CLAMP
5347 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005348#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349#ifdef TCP_INFO
5350 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005351#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005352#ifdef TCP_QUICKACK
5353 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005354#endif
5355
Guido van Rossum09be4091999-08-09 14:40:40 +00005356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005357 /* IPX options */
5358#ifdef IPX_TYPE
5359 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005360#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005362 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005363#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005364 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005365#endif
5366#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005368#endif
5369#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005370 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005371#endif
5372#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005374#endif
5375#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005376 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005377#endif
5378#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005379 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005380#endif
5381#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005382 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005383#endif
5384#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005385 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005386#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005387#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005388 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005389#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005390#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005391 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392#endif
5393#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005394 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005395#endif
5396#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005397 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398#endif
5399#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005401#endif
5402#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005404#endif
5405#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005406 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005407#endif
5408#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005410#endif
5411#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005412 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413#endif
5414#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005415 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005416#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005417#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005418 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005419#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005420#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005421 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005422#endif
5423#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005424 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005425#endif
5426#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005427 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428#endif
5429#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005430 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431#endif
5432#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005433 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005434#endif
5435#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005436 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005437#endif
5438#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005439 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
5441#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005442 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005443#endif
5444#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005445 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005446#endif
5447#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005448 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
5450#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005451 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005452#endif
5453#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005454 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#endif
5456#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005457 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#endif
5459
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005460 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005461#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005462 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005463#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005464 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005465#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005466 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005467#endif
5468#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005469 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005470#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005471 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005472#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005473 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005474#endif
5475#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005476 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005477#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005478 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005479#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005480 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005481#endif
5482
Christian Heimes04ae9162008-01-04 15:23:30 +00005483#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005484 {
5485 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5486 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5487 int i;
5488 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5489 PyObject *tmp;
5490 tmp = PyLong_FromUnsignedLong(codes[i]);
5491 if (tmp == NULL)
5492 return;
5493 PyModule_AddObject(m, names[i], tmp);
5494 }
5495 }
5496 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5497 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5498 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005499#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005500 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005501#endif
5502#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005503 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005504#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005505#endif /* _MSTCPIP_ */
5506
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005507 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005508#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005509 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005510#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005511}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005512
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005513
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005514#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005515#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005516
5517/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005518/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005519
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005520int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005521inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005522{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005523 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005524#if (SIZEOF_INT != 4)
5525#error "Not sure if in_addr_t exists and int is not 32-bits."
5526#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005527 unsigned int packed_addr;
5528 packed_addr = inet_addr(src);
5529 if (packed_addr == INADDR_NONE)
5530 return 0;
5531 memcpy(dst, &packed_addr, 4);
5532 return 1;
5533 }
5534 /* Should set errno to EAFNOSUPPORT */
5535 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005536}
5537
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005538const char *
5539inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005541 if (af == AF_INET) {
5542 struct in_addr packed_addr;
5543 if (size < 16)
5544 /* Should set errno to ENOSPC. */
5545 return NULL;
5546 memcpy(&packed_addr, src, sizeof(packed_addr));
5547 return strncpy(dst, inet_ntoa(packed_addr), size);
5548 }
5549 /* Should set errno to EAFNOSUPPORT */
5550 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005551}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005552
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005553#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005554#endif