blob: 880f31165a9bc5acf12709e33a5e79b332a901c9 [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;
Martin Blais2856e5f2006-05-26 12:03:27 +00002735
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002736 if (recvlen < 0) {
2737 PyErr_SetString(PyExc_ValueError,
2738 "negative buffersize in recvfrom_into");
2739 goto error;
2740 }
2741 if (recvlen == 0) {
2742 /* If nbytes was not specified, use the buffer's length */
2743 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002744 } else if (recvlen > buflen) {
2745 PyErr_SetString(PyExc_ValueError,
2746 "nbytes is greater than the length of the buffer");
2747 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002748 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002749
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002750 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2751 if (readlen < 0) {
2752 /* Return an error */
2753 goto error;
2754 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002755
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002756 PyBuffer_Release(&buf);
2757 /* Return the number of bytes read and the address. Note that we do
2758 not do anything special here in the case that readlen < recvlen. */
2759 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002760
2761error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002762 Py_XDECREF(addr);
2763 PyBuffer_Release(&buf);
2764 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002765}
2766
Martin Blaisaf2ae722006-06-04 13:49:49 +00002767PyDoc_STRVAR(recvfrom_into_doc,
2768"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002769\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002770Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002771
2772
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002773/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002774
Guido van Rossum73624e91994-10-10 17:59:00 +00002775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002776sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002777{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002778 char *buf;
2779 int len, n = -1, flags = 0, timeout;
2780 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002781
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002782 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2783 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002784
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002785 if (!IS_SELECTABLE(s)) {
2786 PyBuffer_Release(&pbuf);
2787 return select_error();
2788 }
2789 buf = pbuf.buf;
2790 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002791
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002792 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002793 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002794 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002795 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002796#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002797 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002798#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002800#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002801 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002803 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002804 PyErr_SetString(socket_timeout, "timed out");
2805 return NULL;
2806 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002807 END_SELECT_LOOP(s)
2808
2809 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002810 if (n < 0)
2811 return s->errorhandler();
2812 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002813}
2814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002815PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002816"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002817\n\
2818Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002819argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002820sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002821
2822
2823/* s.sendall(data [,flags]) method */
2824
2825static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002826sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002827{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002828 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002829 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002830 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002831
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002832 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2833 return NULL;
2834 buf = pbuf.buf;
2835 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002836
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002837 if (!IS_SELECTABLE(s)) {
2838 PyBuffer_Release(&pbuf);
2839 return select_error();
2840 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002841
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002842 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002843 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002844 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002845 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002846 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002847 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002848#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002849 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002850#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002851 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002852#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002853 }
2854 Py_END_ALLOW_THREADS
2855 if (timeout == 1) {
2856 PyBuffer_Release(&pbuf);
2857 PyErr_SetString(socket_timeout, "timed out");
2858 return NULL;
2859 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002860 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002861 /* PyErr_CheckSignals() might change errno */
2862 saved_errno = errno;
2863 /* We must run our signal handlers before looping again.
2864 send() can return a successful partial write when it is
2865 interrupted, so we can't restrict ourselves to EINTR. */
2866 if (PyErr_CheckSignals()) {
2867 PyBuffer_Release(&pbuf);
2868 return NULL;
2869 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002870 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002871 /* If interrupted, try again */
2872 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002873 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002874 else
2875 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002876 }
2877 buf += n;
2878 len -= n;
2879 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002880 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002881
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002882 if (n < 0)
2883 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002884
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002885 Py_INCREF(Py_None);
2886 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002887}
2888
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002889PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002890"sendall(data[, flags])\n\
2891\n\
2892Send a data string to the socket. For the optional flags\n\
2893argument, see the Unix manual. This calls send() repeatedly\n\
2894until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002895to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002896
Guido van Rossum30a685f1991-06-27 15:51:29 +00002897
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002898/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002899
Guido van Rossum73624e91994-10-10 17:59:00 +00002900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002902{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002903 Py_buffer pbuf;
2904 PyObject *addro;
2905 char *buf;
2906 Py_ssize_t len;
2907 sock_addr_t addrbuf;
2908 int addrlen, n = -1, flags, timeout;
Ezio Melotti0639be62011-05-07 19:21:22 +03002909 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002910
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002911 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002912 arglen = PyTuple_Size(args);
2913 switch(arglen) {
2914 case 2:
2915 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2916 break;
2917 case 3:
2918 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2919 break;
2920 default:
2921 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2922 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002923 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002924 if (PyErr_Occurred())
2925 return NULL;
2926
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002927 buf = pbuf.buf;
2928 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002929
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002930 if (!IS_SELECTABLE(s)) {
2931 PyBuffer_Release(&pbuf);
2932 return select_error();
2933 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002934
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002935 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2936 PyBuffer_Release(&pbuf);
2937 return NULL;
2938 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002939
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002940 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002941 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002942 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002943 if (!timeout)
2944 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2945 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002947 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002948 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002949 PyErr_SetString(socket_timeout, "timed out");
2950 return NULL;
2951 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002952 END_SELECT_LOOP(s)
2953 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002954 if (n < 0)
2955 return s->errorhandler();
2956 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002957}
2958
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002959PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002960"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002961\n\
2962Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002963For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002964
Guido van Rossum30a685f1991-06-27 15:51:29 +00002965
2966/* s.shutdown(how) method */
2967
Guido van Rossum73624e91994-10-10 17:59:00 +00002968static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002969sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002970{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002971 int how;
2972 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002973
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002974 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002975 if (how == -1 && PyErr_Occurred())
2976 return NULL;
2977 Py_BEGIN_ALLOW_THREADS
2978 res = shutdown(s->sock_fd, how);
2979 Py_END_ALLOW_THREADS
2980 if (res < 0)
2981 return s->errorhandler();
2982 Py_INCREF(Py_None);
2983 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002984}
2985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002986PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002987"shutdown(flag)\n\
2988\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002989Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2990of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002991
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002992#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002993static PyObject*
2994sock_ioctl(PySocketSockObject *s, PyObject *arg)
2995{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002996 unsigned long cmd = SIO_RCVALL;
2997 PyObject *argO;
2998 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003000 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3001 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00003002
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003003 switch (cmd) {
3004 case SIO_RCVALL: {
3005 unsigned int option = RCVALL_ON;
3006 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3007 return NULL;
3008 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3009 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3010 return set_error();
3011 }
3012 return PyLong_FromUnsignedLong(recv); }
3013 case SIO_KEEPALIVE_VALS: {
3014 struct tcp_keepalive ka;
3015 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3016 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3017 return NULL;
3018 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3019 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3020 return set_error();
3021 }
3022 return PyLong_FromUnsignedLong(recv); }
3023 default:
3024 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3025 return NULL;
3026 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003027}
3028PyDoc_STRVAR(sock_ioctl_doc,
3029"ioctl(cmd, option) -> long\n\
3030\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003031Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3032SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3033SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003034
3035#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003036
3037/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003038
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003039static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003040 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3041 accept_doc},
3042 {"bind", (PyCFunction)sock_bind, METH_O,
3043 bind_doc},
3044 {"close", (PyCFunction)sock_close, METH_NOARGS,
3045 close_doc},
3046 {"connect", (PyCFunction)sock_connect, METH_O,
3047 connect_doc},
3048 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3049 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003050#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003051 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3052 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003053#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003054 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3055 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003056#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003057 {"getpeername", (PyCFunction)sock_getpeername,
3058 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003059#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003060 {"getsockname", (PyCFunction)sock_getsockname,
3061 METH_NOARGS, getsockname_doc},
3062 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3063 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003064#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003065 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3066 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003067#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003068 {"listen", (PyCFunction)sock_listen, METH_O,
3069 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003070#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003071 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3072 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003073#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003074 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3075 recv_doc},
3076 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3077 recv_into_doc},
3078 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3079 recvfrom_doc},
3080 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3081 recvfrom_into_doc},
3082 {"send", (PyCFunction)sock_send, METH_VARARGS,
3083 send_doc},
3084 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3085 sendall_doc},
3086 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3087 sendto_doc},
3088 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3089 setblocking_doc},
3090 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3091 settimeout_doc},
3092 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3093 gettimeout_doc},
3094 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3095 setsockopt_doc},
3096 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3097 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003098#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003099 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3100 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003102 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003103};
3104
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003105/* SockObject members */
3106static PyMemberDef sock_memberlist[] = {
3107 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3108 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3109 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3110 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3111 {0},
3112};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003113
Guido van Rossum73624e91994-10-10 17:59:00 +00003114/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003115 First close the file description. */
3116
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003117static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003118sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003119{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003120 if (s->sock_fd != -1)
3121 (void) SOCKETCLOSE(s->sock_fd);
3122 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003123}
3124
Guido van Rossum30a685f1991-06-27 15:51:29 +00003125
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003127sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003128{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003129 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003130#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003131 if (s->sock_fd > LONG_MAX) {
3132 /* this can occur on Win64, and actually there is a special
3133 ugly printf formatter for decimal pointer length integer
3134 printing, only bother if necessary*/
3135 PyErr_SetString(PyExc_OverflowError,
3136 "no printf formatter to display "
3137 "the socket descriptor in decimal");
3138 return NULL;
3139 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003140#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003141 PyOS_snprintf(
3142 buf, sizeof(buf),
3143 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3144 (long)s->sock_fd, s->sock_family,
3145 s->sock_type,
3146 s->sock_proto);
3147 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003148}
3149
3150
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003151/* Create a new, uninitialized socket object. */
3152
3153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003154sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003155{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003156 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003157
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003158 new = type->tp_alloc(type, 0);
3159 if (new != NULL) {
3160 ((PySocketSockObject *)new)->sock_fd = -1;
3161 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3162 ((PySocketSockObject *)new)->errorhandler = &set_error;
3163 }
3164 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003165}
3166
3167
3168/* Initialize a new socket object. */
3169
3170/*ARGSUSED*/
3171static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003172sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003173{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003174 PySocketSockObject *s = (PySocketSockObject *)self;
3175 SOCKET_T fd;
3176 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3177 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003178
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003179 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3180 "|iii:socket", keywords,
3181 &family, &type, &proto))
3182 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003183
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003184 Py_BEGIN_ALLOW_THREADS
3185 fd = socket(family, type, proto);
3186 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003187
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003188#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003189 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003190#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003191 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003192#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003193 {
3194 set_error();
3195 return -1;
3196 }
3197 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003198
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003199 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003200
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003201}
3202
3203
Guido van Rossumb6775db1994-08-01 11:34:53 +00003204/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003205
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003206static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003207 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3208 "_socket.socket", /* tp_name */
3209 sizeof(PySocketSockObject), /* tp_basicsize */
3210 0, /* tp_itemsize */
3211 (destructor)sock_dealloc, /* tp_dealloc */
3212 0, /* tp_print */
3213 0, /* tp_getattr */
3214 0, /* tp_setattr */
3215 0, /* tp_compare */
3216 (reprfunc)sock_repr, /* tp_repr */
3217 0, /* tp_as_number */
3218 0, /* tp_as_sequence */
3219 0, /* tp_as_mapping */
3220 0, /* tp_hash */
3221 0, /* tp_call */
3222 0, /* tp_str */
3223 PyObject_GenericGetAttr, /* tp_getattro */
3224 0, /* tp_setattro */
3225 0, /* tp_as_buffer */
3226 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3227 sock_doc, /* tp_doc */
3228 0, /* tp_traverse */
3229 0, /* tp_clear */
3230 0, /* tp_richcompare */
3231 0, /* tp_weaklistoffset */
3232 0, /* tp_iter */
3233 0, /* tp_iternext */
3234 sock_methods, /* tp_methods */
3235 sock_memberlist, /* tp_members */
3236 0, /* tp_getset */
3237 0, /* tp_base */
3238 0, /* tp_dict */
3239 0, /* tp_descr_get */
3240 0, /* tp_descr_set */
3241 0, /* tp_dictoffset */
3242 sock_initobj, /* tp_init */
3243 PyType_GenericAlloc, /* tp_alloc */
3244 sock_new, /* tp_new */
3245 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003246};
3247
Guido van Rossum30a685f1991-06-27 15:51:29 +00003248
Guido van Rossum81194471991-07-27 21:42:02 +00003249/* Python interface to gethostname(). */
3250
3251/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003252static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003253socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003254{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003255 char buf[1024];
3256 int res;
3257 Py_BEGIN_ALLOW_THREADS
3258 res = gethostname(buf, (int) sizeof buf - 1);
3259 Py_END_ALLOW_THREADS
3260 if (res < 0)
3261 return set_error();
3262 buf[sizeof buf - 1] = '\0';
3263 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003264}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003265
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003266PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003267"gethostname() -> string\n\
3268\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003270
Guido van Rossumff4949e1992-08-05 19:58:53 +00003271
Guido van Rossum30a685f1991-06-27 15:51:29 +00003272/* Python interface to gethostbyname(name). */
3273
3274/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003275static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003276socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003277{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003278 char *name;
3279 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003280
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003281 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3282 return NULL;
3283 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3284 return NULL;
3285 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003286}
3287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003289"gethostbyname(host) -> address\n\
3290\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003291Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003292
3293
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003294/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3295
3296static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003297gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003298{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003299 char **pch;
3300 PyObject *rtn_tuple = (PyObject *)NULL;
3301 PyObject *name_list = (PyObject *)NULL;
3302 PyObject *addr_list = (PyObject *)NULL;
3303 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003304
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003305 if (h == NULL) {
3306 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003307#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003308 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003309#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003310 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003311#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003312 return NULL;
3313 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003314
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003315 if (h->h_addrtype != af) {
3316 /* Let's get real error message to return */
3317 PyErr_SetString(socket_error,
3318 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003319
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003320 return NULL;
3321 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003322
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003323 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003324
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003325 case AF_INET:
3326 if (alen < sizeof(struct sockaddr_in))
3327 return NULL;
3328 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003329
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003330#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003331 case AF_INET6:
3332 if (alen < sizeof(struct sockaddr_in6))
3333 return NULL;
3334 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003335#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003336
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003337 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003338
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003339 if ((name_list = PyList_New(0)) == NULL)
3340 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003341
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003342 if ((addr_list = PyList_New(0)) == NULL)
3343 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003344
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003345 /* SF #1511317: h_aliases can be NULL */
3346 if (h->h_aliases) {
3347 for (pch = h->h_aliases; *pch != NULL; pch++) {
3348 int status;
3349 tmp = PyString_FromString(*pch);
3350 if (tmp == NULL)
3351 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003352
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003353 status = PyList_Append(name_list, tmp);
3354 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003355
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003356 if (status)
3357 goto err;
3358 }
3359 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003361 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3362 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003364 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003365
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003366 case AF_INET:
3367 {
3368 struct sockaddr_in sin;
3369 memset(&sin, 0, sizeof(sin));
3370 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003371#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003372 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003373#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003374 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3375 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003376
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003377 if (pch == h->h_addr_list && alen >= sizeof(sin))
3378 memcpy((char *) addr, &sin, sizeof(sin));
3379 break;
3380 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003381
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003382#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003383 case AF_INET6:
3384 {
3385 struct sockaddr_in6 sin6;
3386 memset(&sin6, 0, sizeof(sin6));
3387 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003388#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003389 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003390#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003391 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3392 tmp = makeipaddr((struct sockaddr *)&sin6,
3393 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003395 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3396 memcpy((char *) addr, &sin6, sizeof(sin6));
3397 break;
3398 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003399#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003400
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003401 default: /* can't happen */
3402 PyErr_SetString(socket_error,
3403 "unsupported address family");
3404 return NULL;
3405 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003406
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003407 if (tmp == NULL)
3408 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003410 status = PyList_Append(addr_list, tmp);
3411 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003412
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003413 if (status)
3414 goto err;
3415 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003416
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003417 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003418
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003419 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003420 Py_XDECREF(name_list);
3421 Py_XDECREF(addr_list);
3422 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003423}
3424
3425
3426/* Python interface to gethostbyname_ex(name). */
3427
3428/*ARGSUSED*/
3429static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003430socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003431{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003432 char *name;
3433 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003434#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003435 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003436#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003437 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003438#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003439 struct sockaddr *sa;
3440 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003441#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003442 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003443#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003444 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003445#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003446 char buf[16384];
3447 int buf_len = (sizeof buf) - 1;
3448 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003449#endif
3450#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003451 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003452#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003453#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003454
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003455 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3456 return NULL;
3457 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3458 return NULL;
3459 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003460#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003461#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003462 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3463 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003464#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003465 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003466#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003467 memset((void *) &data, '\0', sizeof(data));
3468 result = gethostbyname_r(name, &hp_allocated, &data);
3469 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003470#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003471#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003472#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003473 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003474#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003475 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003476#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003477 Py_END_ALLOW_THREADS
3478 /* Some C libraries would require addr.__ss_family instead of
3479 addr.ss_family.
3480 Therefore, we cast the sockaddr_storage into sockaddr to
3481 access sa_family. */
3482 sa = (struct sockaddr*)&addr;
3483 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3484 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003485#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003486 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003487#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003488 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003489}
3490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003491PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003492"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3493\n\
3494Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003495for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003496
3497
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003498/* Python interface to gethostbyaddr(IP). */
3499
3500/*ARGSUSED*/
3501static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003502socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003503{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003504#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003505 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003506#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003507 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003508#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003509 struct sockaddr *sa = (struct sockaddr *)&addr;
3510 char *ip_num;
3511 struct hostent *h;
3512 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003513#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003514 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003515#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003516 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003517#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003518 /* glibcs up to 2.10 assume that the buf argument to
3519 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3520 does not ensure. The attribute below instructs the compiler
3521 to maintain this alignment. */
3522 char buf[16384] Py_ALIGNED(8);
3523 int buf_len = (sizeof buf) - 1;
3524 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003525#endif
3526#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003527 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003528#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003529#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003530 char *ap;
3531 int al;
3532 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003533
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003534 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3535 return NULL;
3536 af = AF_UNSPEC;
3537 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3538 return NULL;
3539 af = sa->sa_family;
3540 ap = NULL;
3541 switch (af) {
3542 case AF_INET:
3543 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3544 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3545 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003546#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003547 case AF_INET6:
3548 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3549 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3550 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003551#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003552 default:
3553 PyErr_SetString(socket_error, "unsupported address family");
3554 return NULL;
3555 }
3556 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003557#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003558#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003559 result = gethostbyaddr_r(ap, al, af,
3560 &hp_allocated, buf, buf_len,
3561 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003562#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003563 h = gethostbyaddr_r(ap, al, af,
3564 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003565#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003566 memset((void *) &data, '\0', sizeof(data));
3567 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3568 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003569#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003570#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003571#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003572 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003573#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003574 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003575#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003576 Py_END_ALLOW_THREADS
3577 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003578#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003579 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003580#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003581 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003582}
3583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003584PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003585"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3586\n\
3587Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003588for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003589
Guido van Rossum30a685f1991-06-27 15:51:29 +00003590
3591/* Python interface to getservbyname(name).
3592 This only returns the port number, since the other info is already
3593 known or not useful (like the list of aliases). */
3594
3595/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003597socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003598{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003599 char *name, *proto=NULL;
3600 struct servent *sp;
3601 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3602 return NULL;
3603 Py_BEGIN_ALLOW_THREADS
3604 sp = getservbyname(name, proto);
3605 Py_END_ALLOW_THREADS
3606 if (sp == NULL) {
3607 PyErr_SetString(socket_error, "service/proto not found");
3608 return NULL;
3609 }
3610 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003611}
3612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003613PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003614"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003615\n\
3616Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003617The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3618otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003619
Guido van Rossum30a685f1991-06-27 15:51:29 +00003620
Barry Warsaw11b91a02004-06-28 00:50:43 +00003621/* Python interface to getservbyport(port).
3622 This only returns the service name, since the other info is already
3623 known or not useful (like the list of aliases). */
3624
3625/*ARGSUSED*/
3626static PyObject *
3627socket_getservbyport(PyObject *self, PyObject *args)
3628{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003629 int port;
3630 char *proto=NULL;
3631 struct servent *sp;
3632 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3633 return NULL;
3634 if (port < 0 || port > 0xffff) {
3635 PyErr_SetString(
3636 PyExc_OverflowError,
3637 "getservbyport: port must be 0-65535.");
3638 return NULL;
3639 }
3640 Py_BEGIN_ALLOW_THREADS
3641 sp = getservbyport(htons((short)port), proto);
3642 Py_END_ALLOW_THREADS
3643 if (sp == NULL) {
3644 PyErr_SetString(socket_error, "port/proto not found");
3645 return NULL;
3646 }
3647 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003648}
3649
3650PyDoc_STRVAR(getservbyport_doc,
3651"getservbyport(port[, protocolname]) -> string\n\
3652\n\
3653Return the service name from a port number and protocol name.\n\
3654The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3655otherwise any protocol will match.");
3656
Guido van Rossum3901d851996-12-19 16:35:04 +00003657/* Python interface to getprotobyname(name).
3658 This only returns the protocol number, since the other info is
3659 already known or not useful (like the list of aliases). */
3660
3661/*ARGSUSED*/
3662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003663socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003664{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003665 char *name;
3666 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003667#ifdef __BEOS__
3668/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003669 PyErr_SetString(socket_error, "getprotobyname not supported");
3670 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003671#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003672 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3673 return NULL;
3674 Py_BEGIN_ALLOW_THREADS
3675 sp = getprotobyname(name);
3676 Py_END_ALLOW_THREADS
3677 if (sp == NULL) {
3678 PyErr_SetString(socket_error, "protocol not found");
3679 return NULL;
3680 }
3681 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003682#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003683}
3684
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003685PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003686"getprotobyname(name) -> integer\n\
3687\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003688Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003689
Guido van Rossum3901d851996-12-19 16:35:04 +00003690
Dave Cole331708b2004-08-09 04:51:41 +00003691#ifdef HAVE_SOCKETPAIR
3692/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003693 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003694 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003695
3696/*ARGSUSED*/
3697static PyObject *
3698socket_socketpair(PyObject *self, PyObject *args)
3699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003700 PySocketSockObject *s0 = NULL, *s1 = NULL;
3701 SOCKET_T sv[2];
3702 int family, type = SOCK_STREAM, proto = 0;
3703 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003704
3705#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003706 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003707#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003708 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003709#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003710 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3711 &family, &type, &proto))
3712 return NULL;
3713 /* Create a pair of socket fds */
3714 if (socketpair(family, type, proto, sv) < 0)
3715 return set_error();
3716 s0 = new_sockobject(sv[0], family, type, proto);
3717 if (s0 == NULL)
3718 goto finally;
3719 s1 = new_sockobject(sv[1], family, type, proto);
3720 if (s1 == NULL)
3721 goto finally;
3722 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003723
3724finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003725 if (res == NULL) {
3726 if (s0 == NULL)
3727 SOCKETCLOSE(sv[0]);
3728 if (s1 == NULL)
3729 SOCKETCLOSE(sv[1]);
3730 }
3731 Py_XDECREF(s0);
3732 Py_XDECREF(s1);
3733 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003734}
3735
3736PyDoc_STRVAR(socketpair_doc,
3737"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3738\n\
3739Create a pair of socket objects from the sockets returned by the platform\n\
3740socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003741The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003742AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003743
3744#endif /* HAVE_SOCKETPAIR */
3745
3746
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003747#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003748/* Create a socket object from a numeric file description.
3749 Useful e.g. if stdin is a socket.
3750 Additional arguments as for socket(). */
3751
3752/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003753static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003754socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003755{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003756 PySocketSockObject *s;
3757 SOCKET_T fd;
3758 int family, type, proto = 0;
3759 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3760 &fd, &family, &type, &proto))
3761 return NULL;
3762 /* Dup the fd so it and the socket can be closed independently */
3763 fd = dup(fd);
3764 if (fd < 0)
3765 return set_error();
3766 s = new_sockobject(fd, family, type, proto);
3767 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003768}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003769
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003770PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003771"fromfd(fd, family, type[, proto]) -> socket object\n\
3772\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003773Create a socket object from a duplicate of the given\n\
3774file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003775The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003776
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003777#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003778
Guido van Rossum82a5c661998-07-07 20:45:43 +00003779
Guido van Rossum006bf911996-06-12 04:04:55 +00003780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003781socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003782{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003783 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003784
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003785 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3786 return NULL;
3787 }
3788 if (x1 < 0) {
3789 PyErr_SetString(PyExc_OverflowError,
3790 "can't convert negative number to unsigned long");
3791 return NULL;
3792 }
3793 x2 = (unsigned int)ntohs((unsigned short)x1);
3794 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003795}
3796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003797PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003798"ntohs(integer) -> integer\n\
3799\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003800Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003801
3802
Guido van Rossum006bf911996-06-12 04:04:55 +00003803static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003804socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003805{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003806 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003808 if (PyInt_Check(arg)) {
3809 x = PyInt_AS_LONG(arg);
3810 if (x == (unsigned long) -1 && PyErr_Occurred())
3811 return NULL;
3812 if ((long)x < 0) {
3813 PyErr_SetString(PyExc_OverflowError,
3814 "can't convert negative number to unsigned long");
3815 return NULL;
3816 }
3817 }
3818 else if (PyLong_Check(arg)) {
3819 x = PyLong_AsUnsignedLong(arg);
3820 if (x == (unsigned long) -1 && PyErr_Occurred())
3821 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003822#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003823 {
3824 unsigned long y;
3825 /* only want the trailing 32 bits */
3826 y = x & 0xFFFFFFFFUL;
3827 if (y ^ x)
3828 return PyErr_Format(PyExc_OverflowError,
3829 "long int larger than 32 bits");
3830 x = y;
3831 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003832#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003833 }
3834 else
3835 return PyErr_Format(PyExc_TypeError,
3836 "expected int/long, %s found",
3837 Py_TYPE(arg)->tp_name);
3838 if (x == (unsigned long) -1 && PyErr_Occurred())
3839 return NULL;
3840 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003841}
3842
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003843PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003844"ntohl(integer) -> integer\n\
3845\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003846Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003847
3848
Guido van Rossum006bf911996-06-12 04:04:55 +00003849static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003850socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003851{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003852 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003854 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3855 return NULL;
3856 }
3857 if (x1 < 0) {
3858 PyErr_SetString(PyExc_OverflowError,
3859 "can't convert negative number to unsigned long");
3860 return NULL;
3861 }
3862 x2 = (unsigned int)htons((unsigned short)x1);
3863 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003864}
3865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003866PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003867"htons(integer) -> integer\n\
3868\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003869Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003870
3871
Guido van Rossum006bf911996-06-12 04:04:55 +00003872static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003873socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003874{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003875 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003876
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003877 if (PyInt_Check(arg)) {
3878 x = PyInt_AS_LONG(arg);
3879 if (x == (unsigned long) -1 && PyErr_Occurred())
3880 return NULL;
3881 if ((long)x < 0) {
3882 PyErr_SetString(PyExc_OverflowError,
3883 "can't convert negative number to unsigned long");
3884 return NULL;
3885 }
3886 }
3887 else if (PyLong_Check(arg)) {
3888 x = PyLong_AsUnsignedLong(arg);
3889 if (x == (unsigned long) -1 && PyErr_Occurred())
3890 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003891#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003892 {
3893 unsigned long y;
3894 /* only want the trailing 32 bits */
3895 y = x & 0xFFFFFFFFUL;
3896 if (y ^ x)
3897 return PyErr_Format(PyExc_OverflowError,
3898 "long int larger than 32 bits");
3899 x = y;
3900 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003901#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003902 }
3903 else
3904 return PyErr_Format(PyExc_TypeError,
3905 "expected int/long, %s found",
3906 Py_TYPE(arg)->tp_name);
3907 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003908}
3909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003910PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003911"htonl(integer) -> integer\n\
3912\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003913Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003914
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003915/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003917PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003918"inet_aton(string) -> packed 32-bit IP representation\n\
3919\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003920Convert 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 +00003921binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003922
3923static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003924socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003925{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003926#ifndef INADDR_NONE
3927#define INADDR_NONE (-1)
3928#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003929#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003930 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003931#endif
3932
3933#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003934#if (SIZEOF_INT != 4)
3935#error "Not sure if in_addr_t exists and int is not 32-bits."
3936#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003937 /* Have to use inet_addr() instead */
3938 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003939#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003940 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003941
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003942 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3943 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003944
Tim Peters1df9fdd2003-02-13 03:13:40 +00003945
3946#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003947
3948#ifdef USE_INET_ATON_WEAKLINK
3949 if (inet_aton != NULL) {
3950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003951 if (inet_aton(ip_addr, &buf))
3952 return PyString_FromStringAndSize((char *)(&buf),
3953 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003954
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003955 PyErr_SetString(socket_error,
3956 "illegal IP address string passed to inet_aton");
3957 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003958
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003959#ifdef USE_INET_ATON_WEAKLINK
3960 } else {
3961#endif
3962
3963#endif
3964
3965#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003967 /* special-case this address as inet_addr might return INADDR_NONE
3968 * for this */
3969 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3970 packed_addr = 0xFFFFFFFF;
3971 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003973 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003974
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003975 if (packed_addr == INADDR_NONE) { /* invalid address */
3976 PyErr_SetString(socket_error,
3977 "illegal IP address string passed to inet_aton");
3978 return NULL;
3979 }
3980 }
3981 return PyString_FromStringAndSize((char *) &packed_addr,
3982 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003983
3984#ifdef USE_INET_ATON_WEAKLINK
3985 }
3986#endif
3987
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003988#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003989}
3990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003991PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003992"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003993\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003994Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003995
3996static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003997socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003998{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003999 char *packed_str;
4000 int addr_len;
4001 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004002
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004003 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4004 return NULL;
4005 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004006
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004007 if (addr_len != sizeof(packed_addr)) {
4008 PyErr_SetString(socket_error,
4009 "packed IP wrong length for inet_ntoa");
4010 return NULL;
4011 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004012
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004013 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004014
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004015 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004016}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004017
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004018#ifdef HAVE_INET_PTON
4019
4020PyDoc_STRVAR(inet_pton_doc,
4021"inet_pton(af, ip) -> packed IP address string\n\
4022\n\
4023Convert an IP address from string format to a packed string suitable\n\
4024for use with low-level network functions.");
4025
4026static PyObject *
4027socket_inet_pton(PyObject *self, PyObject *args)
4028{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004029 int af;
4030 char* ip;
4031 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004032#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004033 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004034#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004035 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004036#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004037 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4038 return NULL;
4039 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004040
Martin v. Löwis04697e82004-06-02 12:35:29 +00004041#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004042 if(af == AF_INET6) {
4043 PyErr_SetString(socket_error,
4044 "can't use AF_INET6, IPv6 is disabled");
4045 return NULL;
4046 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004047#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004048
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004049 retval = inet_pton(af, ip, packed);
4050 if (retval < 0) {
4051 PyErr_SetFromErrno(socket_error);
4052 return NULL;
4053 } else if (retval == 0) {
4054 PyErr_SetString(socket_error,
4055 "illegal IP address string passed to inet_pton");
4056 return NULL;
4057 } else if (af == AF_INET) {
4058 return PyString_FromStringAndSize(packed,
4059 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004060#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004061 } else if (af == AF_INET6) {
4062 return PyString_FromStringAndSize(packed,
4063 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004065 } else {
4066 PyErr_SetString(socket_error, "unknown address family");
4067 return NULL;
4068 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004069}
Martin Blais2856e5f2006-05-26 12:03:27 +00004070
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004071PyDoc_STRVAR(inet_ntop_doc,
4072"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4073\n\
4074Convert a packed IP address of the given family to string format.");
4075
4076static PyObject *
4077socket_inet_ntop(PyObject *self, PyObject *args)
4078{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004079 int af;
4080 char* packed;
4081 int len;
4082 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004083#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004084 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004085#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004086 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004087#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004088
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004089 /* Guarantee NUL-termination for PyString_FromString() below */
4090 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004091
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004092 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4093 return NULL;
4094 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004095
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004096 if (af == AF_INET) {
4097 if (len != sizeof(struct in_addr)) {
4098 PyErr_SetString(PyExc_ValueError,
4099 "invalid length of packed IP address string");
4100 return NULL;
4101 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004102#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004103 } else if (af == AF_INET6) {
4104 if (len != sizeof(struct in6_addr)) {
4105 PyErr_SetString(PyExc_ValueError,
4106 "invalid length of packed IP address string");
4107 return NULL;
4108 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004109#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004110 } else {
4111 PyErr_Format(PyExc_ValueError,
4112 "unknown address family %d", af);
4113 return NULL;
4114 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004116 retval = inet_ntop(af, packed, ip, sizeof(ip));
4117 if (!retval) {
4118 PyErr_SetFromErrno(socket_error);
4119 return NULL;
4120 } else {
4121 return PyString_FromString(retval);
4122 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004123
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004124 /* NOTREACHED */
4125 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4126 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004127}
4128
4129#endif /* HAVE_INET_PTON */
4130
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004131/* Python interface to getaddrinfo(host, port). */
4132
4133/*ARGSUSED*/
4134static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004135socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004136{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004137 struct addrinfo hints, *res;
4138 struct addrinfo *res0 = NULL;
4139 PyObject *hobj = NULL;
4140 PyObject *pobj = (PyObject *)NULL;
4141 char pbuf[30];
4142 char *hptr, *pptr;
4143 int family, socktype, protocol, flags;
4144 int error;
4145 PyObject *all = (PyObject *)NULL;
4146 PyObject *single = (PyObject *)NULL;
4147 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004149 family = socktype = protocol = flags = 0;
4150 family = AF_UNSPEC;
4151 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4152 &hobj, &pobj, &family, &socktype,
4153 &protocol, &flags)) {
4154 return NULL;
4155 }
4156 if (hobj == Py_None) {
4157 hptr = NULL;
4158 } else if (PyUnicode_Check(hobj)) {
4159 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4160 if (!idna)
4161 return NULL;
4162 hptr = PyString_AsString(idna);
4163 } else if (PyString_Check(hobj)) {
4164 hptr = PyString_AsString(hobj);
4165 } else {
4166 PyErr_SetString(PyExc_TypeError,
4167 "getaddrinfo() argument 1 must be string or None");
4168 return NULL;
4169 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004170 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4171 long value = PyLong_AsLong(pobj);
4172 if (value == -1 && PyErr_Occurred())
4173 return NULL;
4174 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004175 pptr = pbuf;
4176 } else if (PyString_Check(pobj)) {
4177 pptr = PyString_AsString(pobj);
4178 } else if (pobj == Py_None) {
4179 pptr = (char *)NULL;
4180 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004181 PyErr_SetString(socket_error,
4182 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004183 goto err;
4184 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004185#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004186 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4187 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4188 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4189 * This workaround avoids a segfault in libsystem.
4190 */
4191 pptr = "00";
4192 }
4193#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004194 memset(&hints, 0, sizeof(hints));
4195 hints.ai_family = family;
4196 hints.ai_socktype = socktype;
4197 hints.ai_protocol = protocol;
4198 hints.ai_flags = flags;
4199 Py_BEGIN_ALLOW_THREADS
4200 ACQUIRE_GETADDRINFO_LOCK
4201 error = getaddrinfo(hptr, pptr, &hints, &res0);
4202 Py_END_ALLOW_THREADS
4203 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4204 if (error) {
4205 set_gaierror(error);
4206 goto err;
4207 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004208
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004209 if ((all = PyList_New(0)) == NULL)
4210 goto err;
4211 for (res = res0; res; res = res->ai_next) {
4212 PyObject *addr =
4213 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4214 if (addr == NULL)
4215 goto err;
4216 single = Py_BuildValue("iiisO", res->ai_family,
4217 res->ai_socktype, res->ai_protocol,
4218 res->ai_canonname ? res->ai_canonname : "",
4219 addr);
4220 Py_DECREF(addr);
4221 if (single == NULL)
4222 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004223
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004224 if (PyList_Append(all, single))
4225 goto err;
4226 Py_XDECREF(single);
4227 }
4228 Py_XDECREF(idna);
4229 if (res0)
4230 freeaddrinfo(res0);
4231 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004233 Py_XDECREF(single);
4234 Py_XDECREF(all);
4235 Py_XDECREF(idna);
4236 if (res0)
4237 freeaddrinfo(res0);
4238 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004239}
4240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004241PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004242"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4243 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004244\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004245Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004246
4247/* Python interface to getnameinfo(sa, flags). */
4248
4249/*ARGSUSED*/
4250static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004251socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004252{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004253 PyObject *sa = (PyObject *)NULL;
4254 int flags;
4255 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004256 int port;
4257 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004258 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4259 struct addrinfo hints, *res = NULL;
4260 int error;
4261 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004262
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004263 flags = flowinfo = scope_id = 0;
4264 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4265 return NULL;
4266 if (!PyTuple_Check(sa)) {
4267 PyErr_SetString(PyExc_TypeError,
4268 "getnameinfo() argument 1 must be a tuple");
4269 return NULL;
4270 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004271 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004272 &hostp, &port, &flowinfo, &scope_id))
4273 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004274 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004275 PyErr_SetString(PyExc_OverflowError,
4276 "getsockaddrarg: flowinfo must be 0-1048575.");
4277 return NULL;
4278 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004279 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4280 memset(&hints, 0, sizeof(hints));
4281 hints.ai_family = AF_UNSPEC;
4282 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4283 Py_BEGIN_ALLOW_THREADS
4284 ACQUIRE_GETADDRINFO_LOCK
4285 error = getaddrinfo(hostp, pbuf, &hints, &res);
4286 Py_END_ALLOW_THREADS
4287 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4288 if (error) {
4289 set_gaierror(error);
4290 goto fail;
4291 }
4292 if (res->ai_next) {
4293 PyErr_SetString(socket_error,
4294 "sockaddr resolved to multiple addresses");
4295 goto fail;
4296 }
4297 switch (res->ai_family) {
4298 case AF_INET:
4299 {
4300 if (PyTuple_GET_SIZE(sa) != 2) {
4301 PyErr_SetString(socket_error,
4302 "IPv4 sockaddr must be 2 tuple");
4303 goto fail;
4304 }
4305 break;
4306 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004307#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004308 case AF_INET6:
4309 {
4310 struct sockaddr_in6 *sin6;
4311 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004312 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004313 sin6->sin6_scope_id = scope_id;
4314 break;
4315 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004316#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004317 }
4318 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4319 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4320 if (error) {
4321 set_gaierror(error);
4322 goto fail;
4323 }
4324 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004325
4326fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004327 if (res)
4328 freeaddrinfo(res);
4329 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004330}
4331
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004332PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004333"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004334\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004335Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004336
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004337
4338/* Python API to getting and setting the default timeout value. */
4339
4340static PyObject *
4341socket_getdefaulttimeout(PyObject *self)
4342{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004343 if (defaulttimeout < 0.0) {
4344 Py_INCREF(Py_None);
4345 return Py_None;
4346 }
4347 else
4348 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004349}
4350
4351PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004352"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004353\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004354Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004355A value of None indicates that new socket objects have no timeout.\n\
4356When the socket module is first imported, the default is None.");
4357
4358static PyObject *
4359socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4360{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004361 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004362
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004363 if (arg == Py_None)
4364 timeout = -1.0;
4365 else {
4366 timeout = PyFloat_AsDouble(arg);
4367 if (timeout < 0.0) {
4368 if (!PyErr_Occurred())
4369 PyErr_SetString(PyExc_ValueError,
4370 "Timeout value out of range");
4371 return NULL;
4372 }
4373 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004375 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004376
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004377 Py_INCREF(Py_None);
4378 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004379}
4380
4381PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004382"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004383\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004384Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004385A value of None indicates that new socket objects have no timeout.\n\
4386When the socket module is first imported, the default is None.");
4387
4388
Guido van Rossum30a685f1991-06-27 15:51:29 +00004389/* List of functions exported by this module. */
4390
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004391static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004392 {"gethostbyname", socket_gethostbyname,
4393 METH_VARARGS, gethostbyname_doc},
4394 {"gethostbyname_ex", socket_gethostbyname_ex,
4395 METH_VARARGS, ghbn_ex_doc},
4396 {"gethostbyaddr", socket_gethostbyaddr,
4397 METH_VARARGS, gethostbyaddr_doc},
4398 {"gethostname", socket_gethostname,
4399 METH_NOARGS, gethostname_doc},
4400 {"getservbyname", socket_getservbyname,
4401 METH_VARARGS, getservbyname_doc},
4402 {"getservbyport", socket_getservbyport,
4403 METH_VARARGS, getservbyport_doc},
4404 {"getprotobyname", socket_getprotobyname,
4405 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004406#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004407 {"fromfd", socket_fromfd,
4408 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004409#endif
Dave Cole331708b2004-08-09 04:51:41 +00004410#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004411 {"socketpair", socket_socketpair,
4412 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004413#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004414 {"ntohs", socket_ntohs,
4415 METH_VARARGS, ntohs_doc},
4416 {"ntohl", socket_ntohl,
4417 METH_O, ntohl_doc},
4418 {"htons", socket_htons,
4419 METH_VARARGS, htons_doc},
4420 {"htonl", socket_htonl,
4421 METH_O, htonl_doc},
4422 {"inet_aton", socket_inet_aton,
4423 METH_VARARGS, inet_aton_doc},
4424 {"inet_ntoa", socket_inet_ntoa,
4425 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004426#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004427 {"inet_pton", socket_inet_pton,
4428 METH_VARARGS, inet_pton_doc},
4429 {"inet_ntop", socket_inet_ntop,
4430 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004431#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004432 {"getaddrinfo", socket_getaddrinfo,
4433 METH_VARARGS, getaddrinfo_doc},
4434 {"getnameinfo", socket_getnameinfo,
4435 METH_VARARGS, getnameinfo_doc},
4436 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4437 METH_NOARGS, getdefaulttimeout_doc},
4438 {"setdefaulttimeout", socket_setdefaulttimeout,
4439 METH_O, setdefaulttimeout_doc},
4440 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004441};
4442
Guido van Rossum30a685f1991-06-27 15:51:29 +00004443
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004444#ifdef RISCOS
4445#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004447static int
4448os_init(void)
4449{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004450 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004451
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004452 r.r[0] = 0;
4453 _kernel_swi(0x43380, &r, &r);
4454 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004455
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004456 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004457}
4458
4459#endif /* RISCOS */
4460
4461
4462#ifdef MS_WINDOWS
4463#define OS_INIT_DEFINED
4464
4465/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004466
4467static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004468os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004469{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004470 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004471}
4472
4473static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004474os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004475{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004476 WSADATA WSAData;
4477 int ret;
4478 char buf[100];
4479 ret = WSAStartup(0x0101, &WSAData);
4480 switch (ret) {
4481 case 0: /* No error */
4482 Py_AtExit(os_cleanup);
4483 return 1; /* Success */
4484 case WSASYSNOTREADY:
4485 PyErr_SetString(PyExc_ImportError,
4486 "WSAStartup failed: network not ready");
4487 break;
4488 case WSAVERNOTSUPPORTED:
4489 case WSAEINVAL:
4490 PyErr_SetString(
4491 PyExc_ImportError,
4492 "WSAStartup failed: requested version not supported");
4493 break;
4494 default:
4495 PyOS_snprintf(buf, sizeof(buf),
4496 "WSAStartup failed: error code %d", ret);
4497 PyErr_SetString(PyExc_ImportError, buf);
4498 break;
4499 }
4500 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004501}
4502
Guido van Rossum8d665e61996-06-26 18:22:49 +00004503#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004504
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004505
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004506#ifdef PYOS_OS2
4507#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004508
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004509/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004510
4511static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004512os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004513{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004514#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004515 char reason[64];
4516 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004517
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004518 if (rc == 0) {
4519 return 1; /* Success */
4520 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004521
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004522 PyOS_snprintf(reason, sizeof(reason),
4523 "OS/2 TCP/IP Error# %d", sock_errno());
4524 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004525
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004526 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004527#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004528 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004529 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004530#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004531}
4532
4533#endif /* PYOS_OS2 */
4534
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004535
4536#ifndef OS_INIT_DEFINED
4537static int
4538os_init(void)
4539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004540 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004541}
4542#endif
4543
4544
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004545/* C API table - always add new things to the end for binary
4546 compatibility. */
4547static
4548PySocketModule_APIObject PySocketModuleAPI =
4549{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004550 &sock_type,
4551 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004552};
4553
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004554
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004555/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004556
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004557 This module is actually called "_socket", and there's a wrapper
4558 "socket.py" which implements some additional functionality. On some
4559 platforms (e.g. Windows and OS/2), socket.py also implements a
4560 wrapper for the socket type that provides missing functionality such
4561 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4562 with an ImportError exception if os-specific initialization fails.
4563 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004564 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004565 made at exit time.
4566*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004567
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004568PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004569"Implementation module for socket operations.\n\
4570\n\
4571See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004572
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004573PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004574init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004575{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004576 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004577
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004578 if (!os_init())
4579 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004580
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004581 Py_TYPE(&sock_type) = &PyType_Type;
4582 m = Py_InitModule3(PySocket_MODULE_NAME,
4583 socket_methods,
4584 socket_doc);
4585 if (m == NULL)
4586 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004588 socket_error = PyErr_NewException("socket.error",
4589 PyExc_IOError, NULL);
4590 if (socket_error == NULL)
4591 return;
4592 PySocketModuleAPI.error = socket_error;
4593 Py_INCREF(socket_error);
4594 PyModule_AddObject(m, "error", socket_error);
4595 socket_herror = PyErr_NewException("socket.herror",
4596 socket_error, NULL);
4597 if (socket_herror == NULL)
4598 return;
4599 Py_INCREF(socket_herror);
4600 PyModule_AddObject(m, "herror", socket_herror);
4601 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4602 NULL);
4603 if (socket_gaierror == NULL)
4604 return;
4605 Py_INCREF(socket_gaierror);
4606 PyModule_AddObject(m, "gaierror", socket_gaierror);
4607 socket_timeout = PyErr_NewException("socket.timeout",
4608 socket_error, NULL);
4609 if (socket_timeout == NULL)
4610 return;
4611 Py_INCREF(socket_timeout);
4612 PyModule_AddObject(m, "timeout", socket_timeout);
4613 Py_INCREF((PyObject *)&sock_type);
4614 if (PyModule_AddObject(m, "SocketType",
4615 (PyObject *)&sock_type) != 0)
4616 return;
4617 Py_INCREF((PyObject *)&sock_type);
4618 if (PyModule_AddObject(m, "socket",
4619 (PyObject *)&sock_type) != 0)
4620 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004621
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004622#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004623 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004624#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004625 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004626#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004627 Py_INCREF(has_ipv6);
4628 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004629
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004630 /* Export C API */
4631 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4632 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4633 ) != 0)
4634 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004635
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004636 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004637#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004638 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004639#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004640 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004641#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004642 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004643#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004644#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004645 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004646#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004647#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004648 /* Amateur Radio AX.25 */
4649 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004650#endif
4651#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004652 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004653#endif
4654#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 /* Appletalk DDP */
4656 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004657#endif
4658#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004659 /* Amateur radio NetROM */
4660 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004661#endif
4662#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004663 /* Multiprotocol bridge */
4664 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004665#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004666#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 /* ATM PVCs */
4668 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004669#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004670#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004671 /* Reserved for Werner's ATM */
4672 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004673#endif
4674#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004675 /* Reserved for X.25 project */
4676 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004677#endif
4678#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004679 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004680#endif
4681#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004682 /* Amateur Radio X.25 PLP */
4683 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004684#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004685#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004686 /* Reserved for DECnet project */
4687 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004688#endif
4689#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004690 /* Reserved for 802.2LLC project */
4691 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004692#endif
4693#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004694 /* Security callback pseudo AF */
4695 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004696#endif
4697#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004698 /* PF_KEY key management API */
4699 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004700#endif
4701#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004702 /* */
4703 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4704 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004705#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004706 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004707#endif
4708#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004709 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004710#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004711 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4712 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004713#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004714 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004715#endif
4716#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004717 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004718#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004719#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004720 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004721#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004722#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004723 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004724#endif
4725#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004726 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004727#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004728 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004729#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004730 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4731#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004732#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004733 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004734#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004735#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004736#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004737 /* Alias to emulate 4.4BSD */
4738 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004739#endif
4740#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004741 /* Ash */
4742 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004743#endif
4744#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004745 /* Acorn Econet */
4746 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004747#endif
4748#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004749 /* ATM SVCs */
4750 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004751#endif
4752#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004753 /* Linux SNA Project (nutters!) */
4754 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004755#endif
4756#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004757 /* IRDA sockets */
4758 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004759#endif
4760#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004761 /* PPPoX sockets */
4762 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004763#endif
4764#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004765 /* Wanpipe API Sockets */
4766 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004767#endif
4768#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004769 /* Linux LLC */
4770 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004771#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004772
Hye-Shik Chang81268602004-02-02 06:05:24 +00004773#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004774 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4775 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4776 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4777 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004778#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004779 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004780#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004781#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004782#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004783 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004784#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004785 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4786 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004787#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004788 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4789 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4790 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004791#endif
4792
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004793#ifdef AF_PACKET
4794 PyModule_AddIntMacro(m, AF_PACKET);
4795#endif
4796#ifdef PF_PACKET
4797 PyModule_AddIntMacro(m, PF_PACKET);
4798#endif
4799#ifdef PACKET_HOST
4800 PyModule_AddIntMacro(m, PACKET_HOST);
4801#endif
4802#ifdef PACKET_BROADCAST
4803 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4804#endif
4805#ifdef PACKET_MULTICAST
4806 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4807#endif
4808#ifdef PACKET_OTHERHOST
4809 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4810#endif
4811#ifdef PACKET_OUTGOING
4812 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4813#endif
4814#ifdef PACKET_LOOPBACK
4815 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4816#endif
4817#ifdef PACKET_FASTROUTE
4818 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004819#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004820
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004821#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004822 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004823
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004824 /* for addresses */
4825 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4826 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4827 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004828
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004829 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4830 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4831 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004832
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004833 /* for setsockopt() */
4834 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4835 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4836 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4837 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4838 TIPC_DEST_DROPPABLE);
4839 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004840
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004841 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4842 TIPC_LOW_IMPORTANCE);
4843 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4844 TIPC_MEDIUM_IMPORTANCE);
4845 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4846 TIPC_HIGH_IMPORTANCE);
4847 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4848 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004850 /* for subscriptions */
4851 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4852 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004853#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004854 /* doesn't seem to be available everywhere */
4855 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004857 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4858 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4859 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4860 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4861 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4862 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004863#endif
4864
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004865 /* Socket types */
4866 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4867 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004868#ifndef __BEOS__
4869/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004870 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4871 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004872#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004873 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004874#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004875#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004876
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004877#ifdef SO_DEBUG
4878 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004879#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004880#ifdef SO_ACCEPTCONN
4881 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004882#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004883#ifdef SO_REUSEADDR
4884 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004885#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004886#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004887 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004888#endif
4889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004890#ifdef SO_KEEPALIVE
4891 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004892#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004893#ifdef SO_DONTROUTE
4894 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004895#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004896#ifdef SO_BROADCAST
4897 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004898#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004899#ifdef SO_USELOOPBACK
4900 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004901#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004902#ifdef SO_LINGER
4903 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004905#ifdef SO_OOBINLINE
4906 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004907#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908#ifdef SO_REUSEPORT
4909 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004910#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004911#ifdef SO_SNDBUF
4912 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004913#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004914#ifdef SO_RCVBUF
4915 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004916#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004917#ifdef SO_SNDLOWAT
4918 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004919#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004920#ifdef SO_RCVLOWAT
4921 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004922#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004923#ifdef SO_SNDTIMEO
4924 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004925#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004926#ifdef SO_RCVTIMEO
4927 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004928#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004929#ifdef SO_ERROR
4930 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004931#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004932#ifdef SO_TYPE
4933 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004934#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004935#ifdef SO_SETFIB
4936 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4937#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004938
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004939 /* Maximum number of connections for "listen" */
4940#ifdef SOMAXCONN
4941 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004942#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004943 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004944#endif
4945
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004946 /* Flags for send, recv */
4947#ifdef MSG_OOB
4948 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004949#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004950#ifdef MSG_PEEK
4951 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004952#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004953#ifdef MSG_DONTROUTE
4954 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004955#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004956#ifdef MSG_DONTWAIT
4957 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004958#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004959#ifdef MSG_EOR
4960 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004961#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004962#ifdef MSG_TRUNC
4963 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004964#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004965#ifdef MSG_CTRUNC
4966 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004967#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004968#ifdef MSG_WAITALL
4969 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004970#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004971#ifdef MSG_BTAG
4972 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004973#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004974#ifdef MSG_ETAG
4975 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004976#endif
4977
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978 /* Protocol level and numbers, usable for [gs]etsockopt */
4979#ifdef SOL_SOCKET
4980 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004981#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004982#ifdef SOL_IP
4983 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004984#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004985 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef SOL_IPX
4988 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef SOL_AX25
4991 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef SOL_ATALK
4994 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004996#ifdef SOL_NETROM
4997 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004998#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004999#ifdef SOL_ROSE
5000 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005001#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005002#ifdef SOL_TCP
5003 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005004#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005005 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005006#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005007#ifdef SOL_UDP
5008 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005009#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005010 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005011#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005012#ifdef IPPROTO_IP
5013 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005014#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005015 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005016#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005017#ifdef IPPROTO_HOPOPTS
5018 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005019#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005020#ifdef IPPROTO_ICMP
5021 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005022#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005023 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005024#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005025#ifdef IPPROTO_IGMP
5026 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005027#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005028#ifdef IPPROTO_GGP
5029 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005030#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005031#ifdef IPPROTO_IPV4
5032 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005033#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005034#ifdef IPPROTO_IPV6
5035 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005036#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005037#ifdef IPPROTO_IPIP
5038 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005039#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005040#ifdef IPPROTO_TCP
5041 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005042#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005043 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005044#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005045#ifdef IPPROTO_EGP
5046 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005047#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048#ifdef IPPROTO_PUP
5049 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005050#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005051#ifdef IPPROTO_UDP
5052 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005053#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005054 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056#ifdef IPPROTO_IDP
5057 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005059#ifdef IPPROTO_HELLO
5060 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062#ifdef IPPROTO_ND
5063 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065#ifdef IPPROTO_TP
5066 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005067#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005068#ifdef IPPROTO_IPV6
5069 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005070#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005071#ifdef IPPROTO_ROUTING
5072 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005073#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005074#ifdef IPPROTO_FRAGMENT
5075 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005076#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005077#ifdef IPPROTO_RSVP
5078 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005079#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005080#ifdef IPPROTO_GRE
5081 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005082#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005083#ifdef IPPROTO_ESP
5084 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005085#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005086#ifdef IPPROTO_AH
5087 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005088#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005089#ifdef IPPROTO_MOBILE
5090 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005091#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005092#ifdef IPPROTO_ICMPV6
5093 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005094#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005095#ifdef IPPROTO_NONE
5096 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005097#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005098#ifdef IPPROTO_DSTOPTS
5099 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005100#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005101#ifdef IPPROTO_XTP
5102 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005103#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005104#ifdef IPPROTO_EON
5105 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005106#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005107#ifdef IPPROTO_PIM
5108 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005109#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005110#ifdef IPPROTO_IPCOMP
5111 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005112#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005113#ifdef IPPROTO_VRRP
5114 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005115#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005116#ifdef IPPROTO_BIP
5117 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005118#endif
5119/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005120#ifdef IPPROTO_RAW
5121 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005122#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005123 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005124#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005125#ifdef IPPROTO_MAX
5126 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005127#endif
5128
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129 /* Some port configuration */
5130#ifdef IPPORT_RESERVED
5131 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005132#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005133 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005134#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005135#ifdef IPPORT_USERRESERVED
5136 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005137#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005138 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005139#endif
5140
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005141 /* Some reserved IP v.4 addresses */
5142#ifdef INADDR_ANY
5143 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005144#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005145 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005146#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005147#ifdef INADDR_BROADCAST
5148 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005149#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005150 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005151#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005152#ifdef INADDR_LOOPBACK
5153 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005154#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005155 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005156#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005157#ifdef INADDR_UNSPEC_GROUP
5158 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005159#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005160 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005161#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005162#ifdef INADDR_ALLHOSTS_GROUP
5163 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5164 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005165#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005166 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005167#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005168#ifdef INADDR_MAX_LOCAL_GROUP
5169 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5170 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005171#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005172 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005173#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005174#ifdef INADDR_NONE
5175 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005176#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005177 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005178#endif
5179
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005180 /* IPv4 [gs]etsockopt options */
5181#ifdef IP_OPTIONS
5182 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005183#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005184#ifdef IP_HDRINCL
5185 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005186#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005187#ifdef IP_TOS
5188 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005189#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005190#ifdef IP_TTL
5191 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005192#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193#ifdef IP_RECVOPTS
5194 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005195#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005196#ifdef IP_RECVRETOPTS
5197 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005198#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005199#ifdef IP_RECVDSTADDR
5200 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005201#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005202#ifdef IP_RETOPTS
5203 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005204#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005205#ifdef IP_MULTICAST_IF
5206 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005207#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005208#ifdef IP_MULTICAST_TTL
5209 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005210#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005211#ifdef IP_MULTICAST_LOOP
5212 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005213#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005214#ifdef IP_ADD_MEMBERSHIP
5215 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005216#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005217#ifdef IP_DROP_MEMBERSHIP
5218 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005219#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005220#ifdef IP_DEFAULT_MULTICAST_TTL
5221 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5222 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef IP_DEFAULT_MULTICAST_LOOP
5225 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5226 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005227#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005228#ifdef IP_MAX_MEMBERSHIPS
5229 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005230#endif
5231
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005232 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5233#ifdef IPV6_JOIN_GROUP
5234 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef IPV6_LEAVE_GROUP
5237 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239#ifdef IPV6_MULTICAST_HOPS
5240 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005241#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005242#ifdef IPV6_MULTICAST_IF
5243 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005244#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005245#ifdef IPV6_MULTICAST_LOOP
5246 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005247#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005248#ifdef IPV6_UNICAST_HOPS
5249 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005250#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005251 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005252#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005253 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005254#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005255 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005256#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005257 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005258#endif
5259#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005260 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005261#endif
5262#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005263 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005264#endif
5265#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005266 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005267#endif
5268#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005269 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005270#endif
5271#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005272 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005273#endif
5274#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005275 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005276#endif
5277#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005278 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005279#endif
5280#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005281 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005282#endif
5283#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005284 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005285#endif
5286#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005287 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005288#endif
5289#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005290 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005291#endif
5292#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005293 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005294#endif
5295#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005296 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005297#endif
5298#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005299 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005300#endif
5301#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005302 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005303#endif
5304#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005305 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005306#endif
5307#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005308 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005309#endif
5310#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005311 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005312#endif
5313#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005314 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005315#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005316
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005317 /* TCP options */
5318#ifdef TCP_NODELAY
5319 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005320#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321#ifdef TCP_MAXSEG
5322 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005323#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324#ifdef TCP_CORK
5325 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005326#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327#ifdef TCP_KEEPIDLE
5328 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005329#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330#ifdef TCP_KEEPINTVL
5331 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005332#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333#ifdef TCP_KEEPCNT
5334 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005335#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336#ifdef TCP_SYNCNT
5337 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005338#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339#ifdef TCP_LINGER2
5340 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005341#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005342#ifdef TCP_DEFER_ACCEPT
5343 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005344#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005345#ifdef TCP_WINDOW_CLAMP
5346 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005347#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005348#ifdef TCP_INFO
5349 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005350#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005351#ifdef TCP_QUICKACK
5352 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005353#endif
5354
Guido van Rossum09be4091999-08-09 14:40:40 +00005355
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005356 /* IPX options */
5357#ifdef IPX_TYPE
5358 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005359#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005361 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005362#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005363 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005364#endif
5365#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005366 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005367#endif
5368#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005369 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370#endif
5371#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005372 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005373#endif
5374#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005375 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005376#endif
5377#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005378 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005379#endif
5380#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005381 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005382#endif
5383#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005384 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005385#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005386#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005387 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005388#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005389#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005390 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005391#endif
5392#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005393 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005394#endif
5395#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005396 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005397#endif
5398#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005399 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005400#endif
5401#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005402 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005403#endif
5404#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005405 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005406#endif
5407#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005408 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005409#endif
5410#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005411 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005412#endif
5413#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005414 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005415#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005416#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005417 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005418#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005420 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005421#endif
5422#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005423 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005424#endif
5425#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005426 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005427#endif
5428#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005429 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005430#endif
5431#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005432 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005433#endif
5434#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005435 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005436#endif
5437#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005438 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005439#endif
5440#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005441 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005442#endif
5443#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005444 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005445#endif
5446#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005447 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005448#endif
5449#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005450 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005451#endif
5452#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005453 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005454#endif
5455#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005456 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005457#endif
5458
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005459 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005460#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005461 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005462#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005463 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005464#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005465 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005466#endif
5467#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005468 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005469#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005470 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005471#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005472 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005473#endif
5474#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005475 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005476#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005477 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005478#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005479 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005480#endif
5481
Christian Heimes04ae9162008-01-04 15:23:30 +00005482#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005483 {
5484 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5485 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5486 int i;
5487 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5488 PyObject *tmp;
5489 tmp = PyLong_FromUnsignedLong(codes[i]);
5490 if (tmp == NULL)
5491 return;
5492 PyModule_AddObject(m, names[i], tmp);
5493 }
5494 }
5495 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5496 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5497 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005498#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005499 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005500#endif
5501#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005502 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005503#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005504#endif /* _MSTCPIP_ */
5505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005506 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005507#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005508 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005509#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005510}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005511
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005512
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005513#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005514#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005515
5516/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005517/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005518
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005519int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005520inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005521{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005522 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005523#if (SIZEOF_INT != 4)
5524#error "Not sure if in_addr_t exists and int is not 32-bits."
5525#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005526 unsigned int packed_addr;
5527 packed_addr = inet_addr(src);
5528 if (packed_addr == INADDR_NONE)
5529 return 0;
5530 memcpy(dst, &packed_addr, 4);
5531 return 1;
5532 }
5533 /* Should set errno to EAFNOSUPPORT */
5534 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005535}
5536
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005537const char *
5538inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005540 if (af == AF_INET) {
5541 struct in_addr packed_addr;
5542 if (size < 16)
5543 /* Should set errno to ENOSPC. */
5544 return NULL;
5545 memcpy(&packed_addr, src, sizeof(packed_addr));
5546 return strncpy(dst, inet_ntoa(packed_addr), size);
5547 }
5548 /* Should set errno to EAFNOSUPPORT */
5549 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005550}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005551
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005552#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005553#endif