blob: 3e3c05f540794943baa765210ababb80c178353e [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__
Ned Deily1c2a7b52016-02-15 16:51:24 +110085#include <AvailabilityMacros.h>
86/* for getaddrinfo thread safety test on old versions of OS X */
87#ifndef MAC_OS_X_VERSION_10_5
88#define MAC_OS_X_VERSION_10_5 1050
89#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +000090 /*
91 * inet_aton is not available on OSX 10.3, yet we want to use a binary
92 * that was build on 10.4 or later to work on that release, weak linking
93 * comes to the rescue.
94 */
95# pragma weak inet_aton
96#endif
97
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000098#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000099#include "structmember.h"
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700100#include "timefuncs.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101
Victor Stinner465db3c2014-07-26 14:47:56 +0200102#ifndef INVALID_SOCKET /* MS defines this */
103#define INVALID_SOCKET (-1)
104#endif
105
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000106#undef MAX
107#define MAX(x, y) ((x) < (y) ? (y) : (x))
108
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000109/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000110PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000111"socket([family[, type[, proto]]]) -> socket object\n\
112\n\
113Open a socket of the given type. The family argument specifies the\n\
114address family; it defaults to AF_INET. The type argument specifies\n\
115whether this is a stream (SOCK_STREAM, this is the default)\n\
116or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
117specifying the default protocol. Keyword arguments are accepted.\n\
118\n\
119A socket object represents one endpoint of a network connection.\n\
120\n\
121Methods of socket objects (keyword arguments not allowed):\n\
122\n\
123accept() -- accept a connection, returning new socket and client address\n\
124bind(addr) -- bind the socket to a local address\n\
125close() -- close the socket\n\
126connect(addr) -- connect the socket to a remote address\n\
127connect_ex(addr) -- connect, return an error code instead of an exception\n\
128dup() -- return a new socket object identical to the current one [*]\n\
129fileno() -- return underlying file descriptor\n\
130getpeername() -- return remote address [*]\n\
131getsockname() -- return local address\n\
132getsockopt(level, optname[, buflen]) -- get socket options\n\
133gettimeout() -- return timeout or None\n\
134listen(n) -- start listening for incoming connections\n\
135makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
136recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000137recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000138recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000139recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000140 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141sendall(data[, flags]) -- send all data\n\
142send(data[, flags]) -- send data, may not send all of it\n\
143sendto(data[, flags], addr) -- send data to a given address\n\
144setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
145setsockopt(level, optname, value) -- set socket options\n\
146settimeout(None | float) -- set or clear the timeout\n\
147shutdown(how) -- shut down traffic in one or both directions\n\
148\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000149 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000150
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000151/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000152 I hope some day someone can clean this up please... */
153
Guido van Rossum9376b741999-09-15 22:01:40 +0000154/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
155 script doesn't get this right, so we hardcode some platform checks below.
156 On the other hand, not all Linux versions agree, so there the settings
157 computed by the configure script are needed! */
158
159#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160# undef HAVE_GETHOSTBYNAME_R_3_ARG
161# undef HAVE_GETHOSTBYNAME_R_5_ARG
162# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000163#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000164
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000167#endif
168
Guido van Rossume7de2061999-03-24 17:24:33 +0000169#ifdef HAVE_GETHOSTBYNAME_R
Martin Panter21676662016-11-14 04:13:55 +0000170# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT) || defined(__osf__)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# define HAVE_GETHOSTBYNAME_R_3_ARG
172# elif defined(__sun) || defined(__sgi)
173# define HAVE_GETHOSTBYNAME_R_5_ARG
174# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000175/* Rely on the configure script */
Martin Panter21676662016-11-14 04:13:55 +0000176# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
177# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# else
179# undef HAVE_GETHOSTBYNAME_R
180# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000181#endif
182
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000183#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
184 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000186#endif
187
Ned Deily3058eb42016-02-23 22:03:39 +1100188/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000189#ifdef HAVE_SYS_PARAM_H
190#include <sys/param.h>
191#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily1c2a7b52016-02-15 16:51:24 +1100193 (this includes the getaddrinfo emulation) protect access with a lock.
194
195 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
196 a mix of code including an unsafe implementation from an old BSD's
197 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
198 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deily3058eb42016-02-23 22:03:39 +1100199 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily1c2a7b52016-02-15 16:51:24 +1100200
Ned Deily3058eb42016-02-23 22:03:39 +1100201 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
202 http://www.openbsd.org/plus54.html
203
204 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
205
206http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
207*/
Ned Deily1c2a7b52016-02-15 16:51:24 +1100208#if defined(WITH_THREAD) && ( \
209 (defined(__APPLE__) && \
210 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000211 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deily3058eb42016-02-23 22:03:39 +1100212 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
213 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000214 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000215#define USE_GETADDRINFO_LOCK
216#endif
217
218#ifdef USE_GETADDRINFO_LOCK
219#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
220#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
221#else
222#define ACQUIRE_GETADDRINFO_LOCK
223#define RELEASE_GETADDRINFO_LOCK
224#endif
225
226#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000228#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000230#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000231# include <types.h>
232# include <io.h>
233# include <sys/ioctl.h>
234# include <utils.h>
235# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000236#endif
237
Martin v. Löwis9e437302002-12-06 12:57:26 +0000238#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000239# include <ioctl.h>
240#endif
241
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000242#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000243# define INCL_DOS
244# define INCL_DOSERRORS
245# define INCL_NOPMAPI
246# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000247#endif
248
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000249#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000250/* make sure that the reentrant (gethostbyaddr_r etc)
251 functions are declared correctly if compiling with
252 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253
Martin Blais2856e5f2006-05-26 12:03:27 +0000254/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000256#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000257#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000258
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000259#undef _XOPEN_SOURCE
260#include <sys/socket.h>
261#include <sys/types.h>
262#include <netinet/in.h>
263#ifdef _SS_ALIGNSIZE
264#define HAVE_GETADDRINFO 1
265#define HAVE_GETNAMEINFO 1
266#endif
267
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000268#define HAVE_INET_PTON
269#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000270#endif
271
Martin Blais2856e5f2006-05-26 12:03:27 +0000272/* Irix 6.5 fails to define this variable at all. This is needed
273 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000274 are just busted. Same thing for Solaris. */
275#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000276#define INET_ADDRSTRLEN 16
277#endif
278
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000280#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000281#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000282#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000284/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000286#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287
288/* Addressing includes */
289
Guido van Rossum6f489d91996-06-28 20:15:15 +0000290#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291
292/* Non-MS WINDOWS includes */
293# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000294
Guido van Rossum9376b741999-09-15 22:01:40 +0000295/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# ifdef __BEOS__
297# include <net/netdb.h>
298# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
299# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000300typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000304
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000305# ifndef RISCOS
306# include <fcntl.h>
307# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000308# include <sys/ioctl.h>
309# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000310# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000311int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000312# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000313# endif
314
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000315#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000316
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000317/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000318# ifdef HAVE_FCNTL_H
319# include <fcntl.h>
320# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000321
Jeremy Hylton22308652001-02-02 03:23:09 +0000322#endif
323
Skip Montanaro7befb992004-02-10 16:50:21 +0000324#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000325
326#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000327# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000328#endif
329
Neal Norwitz39d22e52002-11-02 19:55:21 +0000330#ifndef O_NONBLOCK
331# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000332#endif
333
Trent Micka708d6e2004-09-07 17:48:26 +0000334/* include Python's addrinfo.h unless it causes trouble */
335#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
336 /* Do not include addinfo.h on some newer IRIX versions.
337 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
338 * for example, but not by 6.5.10.
339 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000340#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000341 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
342 * EAI_* constants are defined in (the already included) ws2tcpip.h.
343 */
344#else
345# include "addrinfo.h"
346#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000347
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000348#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000349#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000350int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000351const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000352#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000353#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000354
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000355#ifdef __APPLE__
356/* On OS X, getaddrinfo returns no error indication of lookup
357 failure, so we must use the emulation instead of the libinfo
358 implementation. Unfortunately, performing an autoconf test
359 for this bug would require DNS access for the machine performing
360 the configuration, which is not acceptable. Therefore, we
361 determine the bug just by checking for __APPLE__. If this bug
362 gets ever fixed, perhaps checking for sys/version.h would be
363 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000364#ifndef HAVE_GETNAMEINFO
365/* This bug seems to be fixed in Jaguar. Ths easiest way I could
366 Find to check for Jaguar is that it has getnameinfo(), which
367 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000368#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000369#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000370
371#ifdef HAVE_INET_ATON
372#define USE_INET_ATON_WEAKLINK
373#endif
374
Jack Jansen84262fb2002-07-02 14:40:42 +0000375#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000376
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000377/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000378#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000379/* avoid clashes with the C library definition of the symbol. */
380#define getaddrinfo fake_getaddrinfo
381#define gai_strerror fake_gai_strerror
382#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000383#include "getaddrinfo.c"
384#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000385#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000386#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000387#include "getnameinfo.c"
388#endif
389
Guido van Rossumbcc20741998-08-04 22:53:56 +0000390#if defined(MS_WINDOWS) || defined(__BEOS__)
391/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000392/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000393#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000394#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000395#endif
396
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000397#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000398#define EAFNOSUPPORT WSAEAFNOSUPPORT
399#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000400#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000401
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000402#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000403#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000404#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000405#endif
406
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000407#ifndef SOCKETCLOSE
408#define SOCKETCLOSE close
409#endif
410
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000411#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define USE_BLUETOOTH 1
413#if defined(__FreeBSD__)
414#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
415#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000416#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000417#define SOL_HCI SOL_HCI_RAW
418#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000419#define sockaddr_l2 sockaddr_l2cap
420#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000421#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000425#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000426#define sockaddr_l2 sockaddr_bt
427#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000428#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000429#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000430#define SOL_HCI BTPROTO_HCI
431#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000432#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
433#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000434#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000435#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000436#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000437#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
438#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000439#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000440#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
441#endif
442#endif
443
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000444#ifdef __VMS
445/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
446#define SEGMENT_SIZE (32 * 1024 -1)
447#endif
448
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000449#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000450
Martin v. Löwise9416172003-05-03 10:12:45 +0000451/*
452 * Constants for getnameinfo()
453 */
454#if !defined(NI_MAXHOST)
455#define NI_MAXHOST 1025
456#endif
457#if !defined(NI_MAXSERV)
458#define NI_MAXSERV 32
459#endif
460
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000461/* XXX There's a problem here: *static* functions are not supposed to have
462 a Py prefix (or use CapitalizedWords). Later... */
463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464/* Global variable holding the exception type for errors detected
465 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466static PyObject *socket_error;
467static PyObject *socket_herror;
468static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000469static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000470
Guido van Rossum48a680c2001-03-02 06:34:14 +0000471#ifdef RISCOS
472/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
473static int taskwindow;
474#endif
475
Tim Peters643a7fc2002-02-17 04:13:21 +0000476/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000477 The sock_type variable contains pointers to various functions,
478 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000479 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000480static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000481
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000482#if defined(HAVE_POLL_H)
483#include <poll.h>
484#elif defined(HAVE_SYS_POLL_H)
485#include <sys/poll.h>
486#endif
487
Charles-François Natalifda7b372011-08-28 16:22:33 +0200488#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000489/* Instead of select(), we'll use poll() since poll() works on any fd. */
490#define IS_SELECTABLE(s) 1
491/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000492#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200493/* If there's no timeout left, we don't have to call select, so it's a safe,
494 * little white lie. */
495#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000496#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000497
498static PyObject*
499select_error(void)
500{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000501 PyErr_SetString(socket_error, "unable to select on socket");
502 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503}
504
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700505#ifdef MS_WINDOWS
506#ifndef WSAEAGAIN
507#define WSAEAGAIN WSAEWOULDBLOCK
508#endif
509#define CHECK_ERRNO(expected) \
510 (WSAGetLastError() == WSA ## expected)
511#else
512#define CHECK_ERRNO(expected) \
513 (errno == expected)
514#endif
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516/* Convenience function to raise an error according to errno
517 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000522#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000523 int err_no = WSAGetLastError();
524 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
525 recognizes the error codes used by both GetLastError() and
526 WSAGetLastError */
527 if (err_no)
528 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000529#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000530
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000531#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 if (sock_errno() != NO_ERROR) {
533 APIRET rc;
534 ULONG msglen;
535 char outbuf[100];
536 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000538 /* Retrieve socket-related error message from MPTN.MSG file */
539 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
540 myerrorcode - SOCBASEERR + 26,
541 "mptn.msg",
542 &msglen);
543 if (rc == NO_ERROR) {
544 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000545
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000546 /* OS/2 doesn't guarantee a terminator */
547 outbuf[msglen] = '\0';
548 if (strlen(outbuf) > 0) {
549 /* If non-empty msg, trim CRLF */
550 char *lastc = &outbuf[ strlen(outbuf)-1 ];
551 while (lastc > outbuf &&
552 isspace(Py_CHARMASK(*lastc))) {
553 /* Trim trailing whitespace (CRLF) */
554 *lastc-- = '\0';
555 }
556 }
557 v = Py_BuildValue("(is)", myerrorcode, outbuf);
558 if (v != NULL) {
559 PyErr_SetObject(socket_error, v);
560 Py_DECREF(v);
561 }
562 return NULL;
563 }
564 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000565#endif
566
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000567#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 if (_inet_error.errnum != NULL) {
569 PyObject *v;
570 v = Py_BuildValue("(is)", errno, _inet_err());
571 if (v != NULL) {
572 PyErr_SetObject(socket_error, v);
573 Py_DECREF(v);
574 }
575 return NULL;
576 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000577#endif
578
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000579 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000580}
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000584set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587
588#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000589 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000590#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000591 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000593 if (v != NULL) {
594 PyErr_SetObject(socket_herror, v);
595 Py_DECREF(v);
596 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000597
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000598 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599}
600
601
602static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000603set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000605 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606
Martin v. Löwis272cb402002-03-01 08:31:07 +0000607#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 /* EAI_SYSTEM is not available on Windows XP. */
609 if (error == EAI_SYSTEM)
610 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000611#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000613#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000615#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000616 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000617#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 if (v != NULL) {
619 PyErr_SetObject(socket_gaierror, v);
620 Py_DECREF(v);
621 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000623 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624}
625
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000626#ifdef __VMS
627/* Function to send in segments */
628static int
629sendsegmented(int sock_fd, char *buf, int len, int flags)
630{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000631 int n = 0;
632 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000633
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 while (remaining > 0) {
635 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000636
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
638 n = send(sock_fd, buf, segment, flags);
639 if (n < 0) {
640 return n;
641 }
642 remaining -= segment;
643 buf += segment;
644 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000645
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000646 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000647}
648#endif
649
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000650/* Function to perform the setting of socket blocking mode
651 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652static int
653internal_setblocking(PySocketSockObject *s, int block)
654{
655#ifndef RISCOS
656#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000657 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#endif
659#endif
660
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000661 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000662#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000663 block = !block;
664 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
665 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666#else
667#ifndef RISCOS
668#ifndef MS_WINDOWS
669#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000670 block = !block;
671 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000672#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000673 block = !block;
674 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000675#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000676 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
677 if (block)
678 delay_flag &= (~O_NONBLOCK);
679 else
680 delay_flag |= O_NONBLOCK;
681 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682#endif /* !PYOS_OS2 */
683#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000684 block = !block;
685 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000687#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000688 block = !block;
689 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000690#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000691#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000692 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000693
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000694 /* Since these don't return anything */
695 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000696}
697
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000698/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000699 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000700 This does not raise an exception; we'll let our caller do that
701 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000702 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000703static int
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700704internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000705{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000707
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000708 /* Nothing to do unless we're in timeout mode (not non-blocking) */
709 if (s->sock_timeout <= 0.0)
710 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000712 /* Guard against closed socket */
713 if (s->sock_fd < 0)
714 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000715
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700716 /* Handling this condition here simplifies the select loops */
717 if (interval < 0.0)
718 return 1;
719
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000720 /* Prefer poll, if available, since you can poll() any fd
721 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000722#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000723 {
724 struct pollfd pollfd;
725 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 pollfd.fd = s->sock_fd;
728 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000729
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000730 /* s->sock_timeout is in seconds, timeout in ms */
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700731 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000732 n = poll(&pollfd, 1, timeout);
733 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000734#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000735 {
736 /* Construct the arguments to select */
737 fd_set fds;
738 struct timeval tv;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700739 tv.tv_sec = (int)interval;
740 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000741 FD_ZERO(&fds);
742 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000743
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000744 /* See if the socket is ready */
745 if (writing)
746 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
747 else
748 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
749 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000750#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000751
752 if (n < 0)
753 return -1;
754 if (n == 0)
755 return 1;
756 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000757}
758
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700759static int
760internal_select(PySocketSockObject *s, int writing)
761{
762 return internal_select_ex(s, writing, s->sock_timeout);
763}
764
765/*
766 Two macros for automatic retry of select() in case of false positives
767 (for example, select() could indicate a socket is ready for reading
768 but the data then discarded by the OS because of a wrong checksum).
769 Here is an example of use:
770
771 BEGIN_SELECT_LOOP(s)
772 Py_BEGIN_ALLOW_THREADS
773 timeout = internal_select_ex(s, 0, interval);
774 if (!timeout)
775 outlen = recv(s->sock_fd, cbuf, len, flags);
776 Py_END_ALLOW_THREADS
777 if (timeout == 1) {
778 PyErr_SetString(socket_timeout, "timed out");
779 return -1;
780 }
781 END_SELECT_LOOP(s)
782*/
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700783#define BEGIN_SELECT_LOOP(s) \
784 { \
Benjamin Petersone5fa8b02016-07-07 00:24:26 -0700785 double deadline = 0, interval = s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700786 int has_timeout = s->sock_timeout > 0.0; \
787 if (has_timeout) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700788 deadline = _PyTime_FloatTime() + s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700789 } \
790 while (1) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700791 errno = 0;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700792
793#define END_SELECT_LOOP(s) \
794 if (!has_timeout || \
795 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
796 break; \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700797 interval = deadline - _PyTime_FloatTime(); \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700798 } \
Kristján Valur Jónsson620e3642013-03-19 13:01:05 -0700799 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700800
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000801/* Initialize a new socket object. */
802
Tim Petersa12b4cf2002-07-18 22:38:44 +0000803static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000804
Mark Hammond62b1ab12002-07-23 06:31:15 +0000805PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000806init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000807 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000808{
809#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000810 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000811#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000812 s->sock_fd = fd;
813 s->sock_family = family;
814 s->sock_type = type;
815 s->sock_proto = proto;
816 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000817
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000818 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000819
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000820 if (defaulttimeout >= 0.0)
821 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000822
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000823#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000824 if (taskwindow)
825 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000826#endif
827}
828
829
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830/* Create a new socket object.
831 This just creates the object and initializes it.
832 If the creation fails, return NULL and set an exception (implicit
833 in NEWOBJ()). */
834
Guido van Rossum73624e91994-10-10 17:59:00 +0000835static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000836new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000838 PySocketSockObject *s;
839 s = (PySocketSockObject *)
840 PyType_GenericNew(&sock_type, NULL, NULL);
841 if (s != NULL)
842 init_sockobject(s, fd, family, type, proto);
843 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000844}
845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846
Guido van Rossum48a680c2001-03-02 06:34:14 +0000847/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000848 thread to be in gethostbyname or getaddrinfo */
849#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosec5517762012-08-14 17:24:47 +0200850static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000851#endif
852
853
Guido van Rossum30a685f1991-06-27 15:51:29 +0000854/* Convert a string specifying a host name or one of a few symbolic
855 names to a numeric IP address. This usually calls gethostbyname()
856 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000857 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858 an error occurred; then an exception is raised. */
859
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000861setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000862{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000863 struct addrinfo hints, *res;
864 int error;
865 int d1, d2, d3, d4;
866 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000868 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
869 if (name[0] == '\0') {
870 int siz;
871 memset(&hints, 0, sizeof(hints));
872 hints.ai_family = af;
873 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
874 hints.ai_flags = AI_PASSIVE;
875 Py_BEGIN_ALLOW_THREADS
876 ACQUIRE_GETADDRINFO_LOCK
877 error = getaddrinfo(NULL, "0", &hints, &res);
878 Py_END_ALLOW_THREADS
879 /* We assume that those thread-unsafe getaddrinfo() versions
880 *are* safe regarding their return value, ie. that a
881 subsequent call to getaddrinfo() does not destroy the
882 outcome of the first call. */
883 RELEASE_GETADDRINFO_LOCK
884 if (error) {
885 set_gaierror(error);
886 return -1;
887 }
888 switch (res->ai_family) {
889 case AF_INET:
890 siz = 4;
891 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000892#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000893 case AF_INET6:
894 siz = 16;
895 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000896#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000897 default:
898 freeaddrinfo(res);
899 PyErr_SetString(socket_error,
900 "unsupported address family");
901 return -1;
902 }
903 if (res->ai_next) {
904 freeaddrinfo(res);
905 PyErr_SetString(socket_error,
906 "wildcard resolved to multiple address");
907 return -1;
908 }
909 if (res->ai_addrlen < addr_ret_size)
910 addr_ret_size = res->ai_addrlen;
911 memcpy(addr_ret, res->ai_addr, addr_ret_size);
912 freeaddrinfo(res);
913 return siz;
914 }
915 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
916 struct sockaddr_in *sin;
917 if (af != AF_INET && af != AF_UNSPEC) {
918 PyErr_SetString(socket_error,
919 "address family mismatched");
920 return -1;
921 }
922 sin = (struct sockaddr_in *)addr_ret;
923 memset((void *) sin, '\0', sizeof(*sin));
924 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000925#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000926 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 sin->sin_addr.s_addr = INADDR_BROADCAST;
929 return sizeof(sin->sin_addr);
930 }
931 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
932 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
933 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
934 struct sockaddr_in *sin;
935 sin = (struct sockaddr_in *)addr_ret;
936 sin->sin_addr.s_addr = htonl(
937 ((long) d1 << 24) | ((long) d2 << 16) |
938 ((long) d3 << 8) | ((long) d4 << 0));
939 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000940#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000941 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000942#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000943 return 4;
944 }
945 memset(&hints, 0, sizeof(hints));
946 hints.ai_family = af;
947 Py_BEGIN_ALLOW_THREADS
948 ACQUIRE_GETADDRINFO_LOCK
949 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000950#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000951 if (error == EAI_NONAME && af == AF_UNSPEC) {
952 /* On Tru64 V5.1, numeric-to-addr conversion fails
953 if no address family is given. Assume IPv4 for now.*/
954 hints.ai_family = AF_INET;
955 error = getaddrinfo(name, NULL, &hints, &res);
956 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000957#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000958 Py_END_ALLOW_THREADS
959 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
960 if (error) {
961 set_gaierror(error);
962 return -1;
963 }
964 if (res->ai_addrlen < addr_ret_size)
965 addr_ret_size = res->ai_addrlen;
966 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
967 freeaddrinfo(res);
968 switch (addr_ret->sa_family) {
969 case AF_INET:
970 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000971#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000972 case AF_INET6:
973 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000975 default:
976 PyErr_SetString(socket_error, "unknown address family");
977 return -1;
978 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000979}
980
Guido van Rossum30a685f1991-06-27 15:51:29 +0000981
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982/* Create a string object representing an IP address.
983 This is always a string of the form 'dd.dd.dd.dd' (with variable
984 size numbers). */
985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000987makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000988{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000989 char buf[NI_MAXHOST];
990 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000991
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000992 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
993 NI_NUMERICHOST);
994 if (error) {
995 set_gaierror(error);
996 return NULL;
997 }
998 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999}
1000
1001
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001002#ifdef USE_BLUETOOTH
1003/* Convert a string representation of a Bluetooth address into a numeric
1004 address. Returns the length (6), or raises an exception and returns -1 if
1005 an error occurred. */
1006
1007static int
1008setbdaddr(char *name, bdaddr_t *bdaddr)
1009{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001010 unsigned int b0, b1, b2, b3, b4, b5;
1011 char ch;
1012 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001013
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001014 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1015 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1016 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1017 bdaddr->b[0] = b0;
1018 bdaddr->b[1] = b1;
1019 bdaddr->b[2] = b2;
1020 bdaddr->b[3] = b3;
1021 bdaddr->b[4] = b4;
1022 bdaddr->b[5] = b5;
1023 return 6;
1024 } else {
1025 PyErr_SetString(socket_error, "bad bluetooth address");
1026 return -1;
1027 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001028}
1029
1030/* Create a string representation of the Bluetooth address. This is always a
1031 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1032 value (zero padded if necessary). */
1033
1034static PyObject *
1035makebdaddr(bdaddr_t *bdaddr)
1036{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001037 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001039 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1040 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1041 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1042 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001043}
1044#endif
1045
1046
Guido van Rossum30a685f1991-06-27 15:51:29 +00001047/* Create an object representing the given socket address,
1048 suitable for passing it back to bind(), connect() etc.
1049 The family field of the sockaddr structure is inspected
1050 to determine what kind of address it really is. */
1051
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001052/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001053static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001054makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001055{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001056 if (addrlen == 0) {
1057 /* No address -- may be recvfrom() from known socket */
1058 Py_INCREF(Py_None);
1059 return Py_None;
1060 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001061
Guido van Rossumbcc20741998-08-04 22:53:56 +00001062#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001063 /* XXX: BeOS version of accept() doesn't set family correctly */
1064 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001065#endif
1066
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001067 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001069 case AF_INET:
1070 {
1071 struct sockaddr_in *a;
1072 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1073 PyObject *ret = NULL;
1074 if (addrobj) {
1075 a = (struct sockaddr_in *)addr;
1076 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1077 Py_DECREF(addrobj);
1078 }
1079 return ret;
1080 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001082#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001083 case AF_UNIX:
1084 {
1085 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001086#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001087 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1088 addrlen -= offsetof(struct sockaddr_un, sun_path);
1089 return PyString_FromStringAndSize(a->sun_path,
1090 addrlen);
1091 }
1092 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001093#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001094 {
1095 /* regular NULL-terminated string */
1096 return PyString_FromString(a->sun_path);
1097 }
1098 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001099#endif /* AF_UNIX */
1100
Martin v. Löwis11017b12006-01-14 18:12:57 +00001101#if defined(AF_NETLINK)
1102 case AF_NETLINK:
1103 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001104 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1105 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001106 }
1107#endif /* AF_NETLINK */
1108
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001109#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001110 case AF_INET6:
1111 {
1112 struct sockaddr_in6 *a;
1113 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1114 PyObject *ret = NULL;
1115 if (addrobj) {
1116 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001117 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001118 addrobj,
1119 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001120 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001121 a->sin6_scope_id);
1122 Py_DECREF(addrobj);
1123 }
1124 return ret;
1125 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001126#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001128#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001129 case AF_BLUETOOTH:
1130 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001131
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001132 case BTPROTO_L2CAP:
1133 {
1134 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1135 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1136 PyObject *ret = NULL;
1137 if (addrobj) {
1138 ret = Py_BuildValue("Oi",
1139 addrobj,
1140 _BT_L2_MEMB(a, psm));
1141 Py_DECREF(addrobj);
1142 }
1143 return ret;
1144 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001145
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001146 case BTPROTO_RFCOMM:
1147 {
1148 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1149 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1150 PyObject *ret = NULL;
1151 if (addrobj) {
1152 ret = Py_BuildValue("Oi",
1153 addrobj,
1154 _BT_RC_MEMB(a, channel));
1155 Py_DECREF(addrobj);
1156 }
1157 return ret;
1158 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001160 case BTPROTO_HCI:
1161 {
1162 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001163#if defined(__NetBSD__) || defined(__DragonFly__)
1164 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1165#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001166 PyObject *ret = NULL;
1167 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1168 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001169#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001170 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001171
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001172#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001173 case BTPROTO_SCO:
1174 {
1175 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1176 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1177 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001178#endif
1179
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001180 default:
1181 PyErr_SetString(PyExc_ValueError,
1182 "Unknown Bluetooth protocol");
1183 return NULL;
1184 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001185#endif
1186
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001187#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001188 case AF_PACKET:
1189 {
1190 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1191 char *ifname = "";
1192 struct ifreq ifr;
1193 /* need to look up interface name give index */
1194 if (a->sll_ifindex) {
1195 ifr.ifr_ifindex = a->sll_ifindex;
1196 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1197 ifname = ifr.ifr_name;
1198 }
1199 return Py_BuildValue("shbhs#",
1200 ifname,
1201 ntohs(a->sll_protocol),
1202 a->sll_pkttype,
1203 a->sll_hatype,
1204 a->sll_addr,
1205 a->sll_halen);
1206 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001207#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001208
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001209#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001210 case AF_TIPC:
1211 {
1212 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1213 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1214 return Py_BuildValue("IIIII",
1215 a->addrtype,
1216 a->addr.nameseq.type,
1217 a->addr.nameseq.lower,
1218 a->addr.nameseq.upper,
1219 a->scope);
1220 } else if (a->addrtype == TIPC_ADDR_NAME) {
1221 return Py_BuildValue("IIIII",
1222 a->addrtype,
1223 a->addr.name.name.type,
1224 a->addr.name.name.instance,
1225 a->addr.name.name.instance,
1226 a->scope);
1227 } else if (a->addrtype == TIPC_ADDR_ID) {
1228 return Py_BuildValue("IIIII",
1229 a->addrtype,
1230 a->addr.id.node,
1231 a->addr.id.ref,
1232 0,
1233 a->scope);
1234 } else {
1235 PyErr_SetString(PyExc_ValueError,
1236 "Invalid address type");
1237 return NULL;
1238 }
1239 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001240#endif
1241
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001242 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001244 default:
1245 /* If we don't know the address family, don't raise an
1246 exception -- return it as a tuple. */
1247 return Py_BuildValue("is#",
1248 addr->sa_family,
1249 addr->sa_data,
1250 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001251
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001252 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253}
1254
Guido van Rossum30a685f1991-06-27 15:51:29 +00001255
1256/* Parse a socket address argument according to the socket object's
1257 address family. Return 1 if the address was in the proper format,
1258 0 of not. The address is returned through addr_ret, its length
1259 through len_ret. */
1260
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001262getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001263 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001265 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001267#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001268 case AF_UNIX:
1269 {
1270 struct sockaddr_un* addr;
1271 char *path;
1272 int len;
1273 if (!PyArg_Parse(args, "t#", &path, &len))
1274 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001275
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001276 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001277#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001278 if (len > 0 && path[0] == 0) {
1279 /* Linux abstract namespace extension */
1280 if (len > sizeof addr->sun_path) {
1281 PyErr_SetString(socket_error,
1282 "AF_UNIX path too long");
1283 return 0;
1284 }
1285 }
1286 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001287#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001288 {
1289 /* regular NULL-terminated string */
1290 if (len >= sizeof addr->sun_path) {
1291 PyErr_SetString(socket_error,
1292 "AF_UNIX path too long");
1293 return 0;
1294 }
1295 addr->sun_path[len] = 0;
1296 }
1297 addr->sun_family = s->sock_family;
1298 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001299#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001300 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001301#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001302 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001303#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001304 return 1;
1305 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001306#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307
Martin v. Löwis11017b12006-01-14 18:12:57 +00001308#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001309 case AF_NETLINK:
1310 {
1311 struct sockaddr_nl* addr;
1312 int pid, groups;
1313 addr = (struct sockaddr_nl *)addr_ret;
1314 if (!PyTuple_Check(args)) {
1315 PyErr_Format(
1316 PyExc_TypeError,
1317 "getsockaddrarg: "
1318 "AF_NETLINK address must be tuple, not %.500s",
1319 Py_TYPE(args)->tp_name);
1320 return 0;
1321 }
1322 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1323 return 0;
1324 addr->nl_family = AF_NETLINK;
1325 addr->nl_pid = pid;
1326 addr->nl_groups = groups;
1327 *len_ret = sizeof(*addr);
1328 return 1;
1329 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001330#endif
1331
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001332 case AF_INET:
1333 {
1334 struct sockaddr_in* addr;
1335 char *host;
1336 int port, result;
1337 if (!PyTuple_Check(args)) {
1338 PyErr_Format(
1339 PyExc_TypeError,
1340 "getsockaddrarg: "
1341 "AF_INET address must be tuple, not %.500s",
1342 Py_TYPE(args)->tp_name);
1343 return 0;
1344 }
1345 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1346 "idna", &host, &port))
1347 return 0;
1348 addr=(struct sockaddr_in*)addr_ret;
1349 result = setipaddr(host, (struct sockaddr *)addr,
1350 sizeof(*addr), AF_INET);
1351 PyMem_Free(host);
1352 if (result < 0)
1353 return 0;
1354 if (port < 0 || port > 0xffff) {
1355 PyErr_SetString(
1356 PyExc_OverflowError,
1357 "getsockaddrarg: port must be 0-65535.");
1358 return 0;
1359 }
1360 addr->sin_family = AF_INET;
1361 addr->sin_port = htons((short)port);
1362 *len_ret = sizeof *addr;
1363 return 1;
1364 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001365
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001366#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001367 case AF_INET6:
1368 {
1369 struct sockaddr_in6* addr;
1370 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001371 int port, result;
1372 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001373 flowinfo = scope_id = 0;
1374 if (!PyTuple_Check(args)) {
1375 PyErr_Format(
1376 PyExc_TypeError,
1377 "getsockaddrarg: "
1378 "AF_INET6 address must be tuple, not %.500s",
1379 Py_TYPE(args)->tp_name);
1380 return 0;
1381 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001382 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001383 "idna", &host, &port, &flowinfo,
1384 &scope_id)) {
1385 return 0;
1386 }
1387 addr = (struct sockaddr_in6*)addr_ret;
1388 result = setipaddr(host, (struct sockaddr *)addr,
1389 sizeof(*addr), AF_INET6);
1390 PyMem_Free(host);
1391 if (result < 0)
1392 return 0;
1393 if (port < 0 || port > 0xffff) {
1394 PyErr_SetString(
1395 PyExc_OverflowError,
1396 "getsockaddrarg: port must be 0-65535.");
1397 return 0;
1398 }
Charles-François Natali65dd7452012-06-23 10:06:56 +02001399 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001400 PyErr_SetString(
1401 PyExc_OverflowError,
1402 "getsockaddrarg: flowinfo must be 0-1048575.");
1403 return 0;
1404 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001405 addr->sin6_family = s->sock_family;
1406 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001407 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001408 addr->sin6_scope_id = scope_id;
1409 *len_ret = sizeof *addr;
1410 return 1;
1411 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001412#endif
1413
Hye-Shik Chang81268602004-02-02 06:05:24 +00001414#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001415 case AF_BLUETOOTH:
1416 {
1417 switch (s->sock_proto) {
1418 case BTPROTO_L2CAP:
1419 {
1420 struct sockaddr_l2 *addr;
1421 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001422
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001423 addr = (struct sockaddr_l2 *)addr_ret;
1424 memset(addr, 0, sizeof(struct sockaddr_l2));
1425 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1426 if (!PyArg_ParseTuple(args, "si", &straddr,
1427 &_BT_L2_MEMB(addr, psm))) {
1428 PyErr_SetString(socket_error, "getsockaddrarg: "
1429 "wrong format");
1430 return 0;
1431 }
1432 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1433 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001435 *len_ret = sizeof *addr;
1436 return 1;
1437 }
1438 case BTPROTO_RFCOMM:
1439 {
1440 struct sockaddr_rc *addr;
1441 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001442
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001443 addr = (struct sockaddr_rc *)addr_ret;
1444 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1445 if (!PyArg_ParseTuple(args, "si", &straddr,
1446 &_BT_RC_MEMB(addr, channel))) {
1447 PyErr_SetString(socket_error, "getsockaddrarg: "
1448 "wrong format");
1449 return 0;
1450 }
1451 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1452 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001453
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001454 *len_ret = sizeof *addr;
1455 return 1;
1456 }
1457 case BTPROTO_HCI:
1458 {
1459 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001460#if defined(__NetBSD__) || defined(__DragonFly__)
1461 char *straddr = PyBytes_AS_STRING(args);
1462
1463 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1464 if (straddr == NULL) {
1465 PyErr_SetString(socket_error, "getsockaddrarg: "
1466 "wrong format");
1467 return 0;
1468 }
1469 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1470 return 0;
1471#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001472 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1473 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1474 PyErr_SetString(socket_error, "getsockaddrarg: "
1475 "wrong format");
1476 return 0;
1477 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001478#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001479 *len_ret = sizeof *addr;
1480 return 1;
1481 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001482#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001483 case BTPROTO_SCO:
1484 {
1485 struct sockaddr_sco *addr;
1486 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001487
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001488 addr = (struct sockaddr_sco *)addr_ret;
1489 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1490 straddr = PyString_AsString(args);
1491 if (straddr == NULL) {
1492 PyErr_SetString(socket_error, "getsockaddrarg: "
1493 "wrong format");
1494 return 0;
1495 }
1496 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1497 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001498
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001499 *len_ret = sizeof *addr;
1500 return 1;
1501 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001502#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001503 default:
1504 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1505 return 0;
1506 }
1507 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001508#endif
1509
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001510#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001511 case AF_PACKET:
1512 {
1513 struct sockaddr_ll* addr;
1514 struct ifreq ifr;
1515 char *interfaceName;
1516 int protoNumber;
1517 int hatype = 0;
1518 int pkttype = 0;
1519 char *haddr = NULL;
1520 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001521
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001522 if (!PyTuple_Check(args)) {
1523 PyErr_Format(
1524 PyExc_TypeError,
1525 "getsockaddrarg: "
1526 "AF_PACKET address must be tuple, not %.500s",
1527 Py_TYPE(args)->tp_name);
1528 return 0;
1529 }
1530 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1531 &protoNumber, &pkttype, &hatype,
1532 &haddr, &halen))
1533 return 0;
1534 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1535 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1536 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1537 s->errorhandler();
1538 return 0;
1539 }
1540 if (halen > 8) {
1541 PyErr_SetString(PyExc_ValueError,
1542 "Hardware address must be 8 bytes or less");
1543 return 0;
1544 }
1545 if (protoNumber < 0 || protoNumber > 0xffff) {
1546 PyErr_SetString(
1547 PyExc_OverflowError,
1548 "getsockaddrarg: protoNumber must be 0-65535.");
1549 return 0;
1550 }
1551 addr = (struct sockaddr_ll*)addr_ret;
1552 addr->sll_family = AF_PACKET;
1553 addr->sll_protocol = htons((short)protoNumber);
1554 addr->sll_ifindex = ifr.ifr_ifindex;
1555 addr->sll_pkttype = pkttype;
1556 addr->sll_hatype = hatype;
1557 if (halen != 0) {
1558 memcpy(&addr->sll_addr, haddr, halen);
1559 }
1560 addr->sll_halen = halen;
1561 *len_ret = sizeof *addr;
1562 return 1;
1563 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001564#endif
1565
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001566#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001567 case AF_TIPC:
1568 {
1569 unsigned int atype, v1, v2, v3;
1570 unsigned int scope = TIPC_CLUSTER_SCOPE;
1571 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001572
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001573 if (!PyTuple_Check(args)) {
1574 PyErr_Format(
1575 PyExc_TypeError,
1576 "getsockaddrarg: "
1577 "AF_TIPC address must be tuple, not %.500s",
1578 Py_TYPE(args)->tp_name);
1579 return 0;
1580 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001582 if (!PyArg_ParseTuple(args,
1583 "IIII|I;Invalid TIPC address format",
1584 &atype, &v1, &v2, &v3, &scope))
1585 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001586
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001587 addr = (struct sockaddr_tipc *) addr_ret;
1588 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001589
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001590 addr->family = AF_TIPC;
1591 addr->scope = scope;
1592 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001594 if (atype == TIPC_ADDR_NAMESEQ) {
1595 addr->addr.nameseq.type = v1;
1596 addr->addr.nameseq.lower = v2;
1597 addr->addr.nameseq.upper = v3;
1598 } else if (atype == TIPC_ADDR_NAME) {
1599 addr->addr.name.name.type = v1;
1600 addr->addr.name.name.instance = v2;
1601 } else if (atype == TIPC_ADDR_ID) {
1602 addr->addr.id.node = v1;
1603 addr->addr.id.ref = v2;
1604 } else {
1605 /* Shouldn't happen */
1606 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1607 return 0;
1608 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001609
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001610 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001611
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001612 return 1;
1613 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001614#endif
1615
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001616 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001617
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001618 default:
1619 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1620 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001622 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001623}
1624
Guido van Rossum30a685f1991-06-27 15:51:29 +00001625
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001627 Return 1 if the family is known, 0 otherwise. The length is returned
1628 through len_ret. */
1629
1630static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001631getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001632{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001633 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001634
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001635#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001636 case AF_UNIX:
1637 {
1638 *len_ret = sizeof (struct sockaddr_un);
1639 return 1;
1640 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#endif /* AF_UNIX */
Martin Panterca56dd42016-09-17 07:54:55 +00001642
Martin v. Löwis11017b12006-01-14 18:12:57 +00001643#if defined(AF_NETLINK)
Martin Panterca56dd42016-09-17 07:54:55 +00001644 case AF_NETLINK:
1645 {
1646 *len_ret = sizeof (struct sockaddr_nl);
1647 return 1;
1648 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001649#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001650
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001651 case AF_INET:
1652 {
1653 *len_ret = sizeof (struct sockaddr_in);
1654 return 1;
1655 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001656
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001657#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001658 case AF_INET6:
1659 {
1660 *len_ret = sizeof (struct sockaddr_in6);
1661 return 1;
1662 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001663#endif
1664
Hye-Shik Chang81268602004-02-02 06:05:24 +00001665#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001666 case AF_BLUETOOTH:
1667 {
1668 switch(s->sock_proto)
1669 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001670
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001671 case BTPROTO_L2CAP:
1672 *len_ret = sizeof (struct sockaddr_l2);
1673 return 1;
1674 case BTPROTO_RFCOMM:
1675 *len_ret = sizeof (struct sockaddr_rc);
1676 return 1;
1677 case BTPROTO_HCI:
1678 *len_ret = sizeof (struct sockaddr_hci);
1679 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001680#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 case BTPROTO_SCO:
1682 *len_ret = sizeof (struct sockaddr_sco);
1683 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001684#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001685 default:
1686 PyErr_SetString(socket_error, "getsockaddrlen: "
1687 "unknown BT protocol");
1688 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001689
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001690 }
1691 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001692#endif
1693
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001694#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001695 case AF_PACKET:
1696 {
1697 *len_ret = sizeof (struct sockaddr_ll);
1698 return 1;
1699 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001700#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001701
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001702#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001703 case AF_TIPC:
1704 {
1705 *len_ret = sizeof (struct sockaddr_tipc);
1706 return 1;
1707 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001708#endif
1709
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001710 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001712 default:
1713 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1714 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001715
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001716 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001717}
1718
1719
Guido van Rossum30a685f1991-06-27 15:51:29 +00001720/* s.accept() method */
1721
Guido van Rossum73624e91994-10-10 17:59:00 +00001722static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001723sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001725 sock_addr_t addrbuf;
1726 SOCKET_T newfd;
1727 socklen_t addrlen;
1728 PyObject *sock = NULL;
1729 PyObject *addr = NULL;
1730 PyObject *res = NULL;
1731 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001732
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 if (!getsockaddrlen(s, &addrlen))
1734 return NULL;
1735 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001737 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001738
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001739 if (!IS_SELECTABLE(s))
1740 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001741
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001742 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001743 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001744 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001745 if (!timeout)
1746 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1747 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 if (timeout == 1) {
1750 PyErr_SetString(socket_timeout, "timed out");
1751 return NULL;
1752 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001753 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001755 if (newfd == INVALID_SOCKET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001757
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001758 /* Create the new object with unspecified family,
1759 to avoid calls to bind() etc. on it. */
1760 sock = (PyObject *) new_sockobject(newfd,
1761 s->sock_family,
1762 s->sock_type,
1763 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001764
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001765 if (sock == NULL) {
1766 SOCKETCLOSE(newfd);
1767 goto finally;
1768 }
1769 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1770 addrlen, s->sock_proto);
1771 if (addr == NULL)
1772 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001773
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001774 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001775
Guido van Rossum67f7a382002-06-06 21:08:16 +00001776finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001777 Py_XDECREF(sock);
1778 Py_XDECREF(addr);
1779 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001780}
1781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001782PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783"accept() -> (socket object, address info)\n\
1784\n\
1785Wait for an incoming connection. Return a new socket representing the\n\
1786connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001787info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001788
Guido van Rossum11ba0942002-06-13 15:07:44 +00001789/* s.setblocking(flag) method. Argument:
1790 False -- non-blocking mode; same as settimeout(0)
1791 True -- blocking mode; same as settimeout(None)
1792*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001793
Guido van Rossum73624e91994-10-10 17:59:00 +00001794static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001795sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001796{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001797 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001798
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001799 block = PyInt_AsLong(arg);
1800 if (block == -1 && PyErr_Occurred())
1801 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001802
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001803 s->sock_timeout = block ? -1.0 : 0.0;
1804 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001805
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001806 Py_INCREF(Py_None);
1807 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001808}
Guido van Rossume4485b01994-09-07 14:32:49 +00001809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001810PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001811"setblocking(flag)\n\
1812\n\
1813Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001814setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001815setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001816
Guido van Rossum11ba0942002-06-13 15:07:44 +00001817/* s.settimeout(timeout) method. Argument:
1818 None -- no timeout, blocking mode; same as setblocking(True)
1819 0.0 -- non-blocking mode; same as setblocking(False)
1820 > 0 -- timeout mode; operations time out after timeout seconds
1821 < 0 -- illegal; raises an exception
1822*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001823static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001824sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001825{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001826 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001827
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001828 if (arg == Py_None)
1829 timeout = -1.0;
1830 else {
1831 timeout = PyFloat_AsDouble(arg);
1832 if (timeout < 0.0) {
1833 if (!PyErr_Occurred())
1834 PyErr_SetString(PyExc_ValueError,
1835 "Timeout value out of range");
1836 return NULL;
1837 }
1838 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001840 s->sock_timeout = timeout;
1841 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001842
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001843 Py_INCREF(Py_None);
1844 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001845}
1846
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001847PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001848"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001849\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001850Set a timeout on socket operations. 'timeout' can be a float,\n\
1851giving in seconds, or None. Setting a timeout of None disables\n\
1852the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001853Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001854
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001855/* s.gettimeout() method.
1856 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001857static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001858sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001859{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001860 if (s->sock_timeout < 0.0) {
1861 Py_INCREF(Py_None);
1862 return Py_None;
1863 }
1864 else
1865 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001866}
1867
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001868PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001869"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001870\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001871Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001872operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001873operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001874
Guido van Rossum48a680c2001-03-02 06:34:14 +00001875#ifdef RISCOS
1876/* s.sleeptaskw(1 | 0) method */
1877
1878static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001879sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001880{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001881 int block;
1882 block = PyInt_AsLong(arg);
1883 if (block == -1 && PyErr_Occurred())
1884 return NULL;
1885 Py_BEGIN_ALLOW_THREADS
1886 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1887 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001888
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001889 Py_INCREF(Py_None);
1890 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001891}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001892PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001893"sleeptaskw(flag)\n\
1894\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001895Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001896#endif
1897
1898
Guido van Rossumaee08791992-09-08 09:05:33 +00001899/* s.setsockopt() method.
1900 With an integer third argument, sets an integer option.
1901 With a string third argument, sets an option from a buffer;
1902 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001903
Guido van Rossum73624e91994-10-10 17:59:00 +00001904static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001905sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001906{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001907 int level;
1908 int optname;
1909 int res;
1910 char *buf;
1911 int buflen;
1912 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001913
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001914 if (PyArg_ParseTuple(args, "iii:setsockopt",
1915 &level, &optname, &flag)) {
1916 buf = (char *) &flag;
1917 buflen = sizeof flag;
1918 }
1919 else {
1920 PyErr_Clear();
1921 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1922 &level, &optname, &buf, &buflen))
1923 return NULL;
1924 }
1925 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1926 if (res < 0)
1927 return s->errorhandler();
1928 Py_INCREF(Py_None);
1929 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001930}
1931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001932PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001933"setsockopt(level, option, value)\n\
1934\n\
1935Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001936The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001937
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001938
Guido van Rossumaee08791992-09-08 09:05:33 +00001939/* s.getsockopt() method.
1940 With two arguments, retrieves an integer option.
1941 With a third integer argument, retrieves a string buffer of that size;
1942 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001943
Guido van Rossum73624e91994-10-10 17:59:00 +00001944static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001945sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001946{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001947 int level;
1948 int optname;
1949 int res;
1950 PyObject *buf;
1951 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001952
Guido van Rossumbcc20741998-08-04 22:53:56 +00001953#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001954 /* We have incomplete socket support. */
1955 PyErr_SetString(socket_error, "getsockopt not supported");
1956 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001957#else
1958
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001959 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1960 &level, &optname, &buflen))
1961 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001962
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001963 if (buflen == 0) {
1964 int flag = 0;
1965 socklen_t flagsize = sizeof flag;
1966 res = getsockopt(s->sock_fd, level, optname,
1967 (void *)&flag, &flagsize);
1968 if (res < 0)
1969 return s->errorhandler();
1970 return PyInt_FromLong(flag);
1971 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001972#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 /* socklen_t is unsigned so no negative test is needed,
1974 test buflen == 0 is previously done */
1975 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001976#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001977 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001978#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001979 PyErr_SetString(socket_error,
1980 "getsockopt buflen out of range");
1981 return NULL;
1982 }
1983 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1984 if (buf == NULL)
1985 return NULL;
1986 res = getsockopt(s->sock_fd, level, optname,
1987 (void *)PyString_AS_STRING(buf), &buflen);
1988 if (res < 0) {
1989 Py_DECREF(buf);
1990 return s->errorhandler();
1991 }
1992 _PyString_Resize(&buf, buflen);
1993 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001994#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001995}
1996
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001997PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001998"getsockopt(level, option[, buffersize]) -> value\n\
1999\n\
2000Get a socket option. See the Unix manual for level and option.\n\
2001If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002002string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002003
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002004
Fred Drake728819a2000-07-01 03:40:12 +00002005/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002006
Guido van Rossum73624e91994-10-10 17:59:00 +00002007static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002008sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002009{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002010 sock_addr_t addrbuf;
2011 int addrlen;
2012 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002013
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002014 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2015 return NULL;
2016 Py_BEGIN_ALLOW_THREADS
2017 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2018 Py_END_ALLOW_THREADS
2019 if (res < 0)
2020 return s->errorhandler();
2021 Py_INCREF(Py_None);
2022 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002023}
2024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002025PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002026"bind(address)\n\
2027\n\
2028Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002029pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002030sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002031
Guido van Rossum30a685f1991-06-27 15:51:29 +00002032
2033/* s.close() method.
2034 Set the file descriptor to -1 so operations tried subsequently
2035 will surely fail. */
2036
Guido van Rossum73624e91994-10-10 17:59:00 +00002037static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002038sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002039{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002040 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002041
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002042 if ((fd = s->sock_fd) != -1) {
2043 s->sock_fd = -1;
2044 Py_BEGIN_ALLOW_THREADS
2045 (void) SOCKETCLOSE(fd);
2046 Py_END_ALLOW_THREADS
2047 }
2048 Py_INCREF(Py_None);
2049 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002050}
2051
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002052PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002053"close()\n\
2054\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002055Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002056
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002057static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002058internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002059 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002060{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002061 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002062
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002063 timeout = 0;
2064 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002065
2066#ifdef MS_WINDOWS
2067
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002068 if (s->sock_timeout > 0.0) {
2069 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2070 IS_SELECTABLE(s)) {
2071 /* This is a mess. Best solution: trust select */
2072 fd_set fds;
2073 fd_set fds_exc;
2074 struct timeval tv;
2075 tv.tv_sec = (int)s->sock_timeout;
2076 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2077 FD_ZERO(&fds);
2078 FD_SET(s->sock_fd, &fds);
2079 FD_ZERO(&fds_exc);
2080 FD_SET(s->sock_fd, &fds_exc);
2081 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2082 if (res == 0) {
2083 res = WSAEWOULDBLOCK;
2084 timeout = 1;
2085 } else if (res > 0) {
2086 if (FD_ISSET(s->sock_fd, &fds))
2087 /* The socket is in the writeable set - this
2088 means connected */
2089 res = 0;
2090 else {
2091 /* As per MS docs, we need to call getsockopt()
2092 to get the underlying error */
2093 int res_size = sizeof res;
2094 /* It must be in the exception set */
2095 assert(FD_ISSET(s->sock_fd, &fds_exc));
2096 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2097 (char *)&res, &res_size))
2098 /* getsockopt also clears WSAGetLastError,
2099 so reset it back. */
2100 WSASetLastError(res);
2101 else
2102 res = WSAGetLastError();
2103 }
2104 }
2105 /* else if (res < 0) an error occurred */
2106 }
2107 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002108
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002109 if (res < 0)
2110 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002111
2112#else
2113
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002114 if (s->sock_timeout > 0.0) {
2115 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2116 timeout = internal_select(s, 1);
2117 if (timeout == 0) {
2118 /* Bug #1019808: in case of an EINPROGRESS,
2119 use getsockopt(SO_ERROR) to get the real
2120 error. */
2121 socklen_t res_size = sizeof res;
2122 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2123 SO_ERROR, &res, &res_size);
2124 if (res == EISCONN)
2125 res = 0;
2126 errno = res;
2127 }
2128 else if (timeout == -1) {
2129 res = errno; /* had error */
2130 }
2131 else
2132 res = EWOULDBLOCK; /* timed out */
2133 }
2134 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002135
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002136 if (res < 0)
2137 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002138
2139#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002140 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002141
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002142 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002143}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144
Fred Drake728819a2000-07-01 03:40:12 +00002145/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002146
Guido van Rossum73624e91994-10-10 17:59:00 +00002147static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002148sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002149{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002150 sock_addr_t addrbuf;
2151 int addrlen;
2152 int res;
2153 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002154
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002155 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2156 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002157
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002158 Py_BEGIN_ALLOW_THREADS
2159 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2160 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002161
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002162 if (timeout == 1) {
2163 PyErr_SetString(socket_timeout, "timed out");
2164 return NULL;
2165 }
2166 if (res != 0)
2167 return s->errorhandler();
2168 Py_INCREF(Py_None);
2169 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002170}
2171
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002172PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002173"connect(address)\n\
2174\n\
2175Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177
Guido van Rossum30a685f1991-06-27 15:51:29 +00002178
Fred Drake728819a2000-07-01 03:40:12 +00002179/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002180
2181static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002182sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002183{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002184 sock_addr_t addrbuf;
2185 int addrlen;
2186 int res;
2187 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002188
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002189 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2190 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002191
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002192 Py_BEGIN_ALLOW_THREADS
2193 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2194 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002195
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002196 /* Signals are not errors (though they may raise exceptions). Adapted
2197 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002198#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002199 if (res == EINTR && PyErr_CheckSignals())
2200 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002201#endif
2202
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002203 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002204}
2205
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002206PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002207"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002208\n\
2209This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002210instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002211
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002212
Guido van Rossumed233a51992-06-23 09:07:03 +00002213/* s.fileno() method */
2214
Guido van Rossum73624e91994-10-10 17:59:00 +00002215static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002216sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002217{
Fred Drakea04eaad2000-06-30 02:46:07 +00002218#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002219 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002220#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002221 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002222#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002223}
2224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002225PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002226"fileno() -> integer\n\
2227\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002228Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002229
Guido van Rossumed233a51992-06-23 09:07:03 +00002230
Guido van Rossumbe32c891996-06-20 16:25:29 +00002231#ifndef NO_DUP
2232/* s.dup() method */
2233
2234static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002235sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002236{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002237 SOCKET_T newfd;
2238 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002239
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002240 newfd = dup(s->sock_fd);
2241 if (newfd < 0)
2242 return s->errorhandler();
2243 sock = (PyObject *) new_sockobject(newfd,
2244 s->sock_family,
2245 s->sock_type,
2246 s->sock_proto);
2247 if (sock == NULL)
2248 SOCKETCLOSE(newfd);
2249 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002250}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002251
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002252PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002253"dup() -> socket object\n\
2254\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002255Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002256
Guido van Rossumbe32c891996-06-20 16:25:29 +00002257#endif
2258
2259
Guido van Rossumc89705d1992-11-26 08:54:07 +00002260/* s.getsockname() method */
2261
Guido van Rossum73624e91994-10-10 17:59:00 +00002262static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002263sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002264{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002265 sock_addr_t addrbuf;
2266 int res;
2267 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002268
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002269 if (!getsockaddrlen(s, &addrlen))
2270 return NULL;
2271 memset(&addrbuf, 0, addrlen);
2272 Py_BEGIN_ALLOW_THREADS
2273 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2274 Py_END_ALLOW_THREADS
2275 if (res < 0)
2276 return s->errorhandler();
2277 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2278 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002279}
2280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002281PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002282"getsockname() -> address info\n\
2283\n\
2284Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002285info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002286
Guido van Rossumc89705d1992-11-26 08:54:07 +00002287
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002288#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002289/* s.getpeername() method */
2290
Guido van Rossum73624e91994-10-10 17:59:00 +00002291static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002292sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002293{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002294 sock_addr_t addrbuf;
2295 int res;
2296 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002297
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002298 if (!getsockaddrlen(s, &addrlen))
2299 return NULL;
2300 memset(&addrbuf, 0, addrlen);
2301 Py_BEGIN_ALLOW_THREADS
2302 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2303 Py_END_ALLOW_THREADS
2304 if (res < 0)
2305 return s->errorhandler();
2306 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2307 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002308}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002310PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002311"getpeername() -> address info\n\
2312\n\
2313Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002314info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002315
Guido van Rossumb6775db1994-08-01 11:34:53 +00002316#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002317
2318
Guido van Rossum30a685f1991-06-27 15:51:29 +00002319/* s.listen(n) method */
2320
Guido van Rossum73624e91994-10-10 17:59:00 +00002321static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002322sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002323{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002324 int backlog;
2325 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002326
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002327 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002328 if (backlog == -1 && PyErr_Occurred())
2329 return NULL;
2330 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002331 /* To avoid problems on systems that don't allow a negative backlog
2332 * (which doesn't make sense anyway) we force a minimum value of 0. */
2333 if (backlog < 0)
2334 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002335 res = listen(s->sock_fd, backlog);
2336 Py_END_ALLOW_THREADS
2337 if (res < 0)
2338 return s->errorhandler();
2339 Py_INCREF(Py_None);
2340 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002341}
2342
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344"listen(backlog)\n\
2345\n\
2346Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002347least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2348unaccepted connections that the system will allow before refusing new\n\
2349connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002350
2351
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002352#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002353/* s.makefile(mode) method.
2354 Create a new open file object referring to a dupped version of
2355 the socket's file descriptor. (The dup() call is necessary so
2356 that the open file and socket objects may be closed independent
2357 of each other.)
2358 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2359
Guido van Rossum73624e91994-10-10 17:59:00 +00002360static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002361sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002362{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002363 extern int fclose(FILE *);
2364 char *mode = "r";
2365 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002366#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002367 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002368#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002369 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002371 FILE *fp;
2372 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002373#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002374 char *mode_r = "r";
2375 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002376#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002378 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2379 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002380#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002381 if (strcmp(mode,"rb") == 0) {
2382 mode = mode_r;
2383 }
2384 else {
2385 if (strcmp(mode,"wb") == 0) {
2386 mode = mode_w;
2387 }
2388 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002389#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002390#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002391 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2392 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002393#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002394 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002395#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002396 {
2397 if (fd >= 0)
2398 SOCKETCLOSE(fd);
2399 return s->errorhandler();
2400 }
2401 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2402 if (f != NULL)
2403 PyFile_SetBufSize(f, bufsize);
2404 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002405}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002408"makefile([mode[, buffersize]]) -> file object\n\
2409\n\
2410Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002411The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002412
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002413#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002414
Martin Blais2856e5f2006-05-26 12:03:27 +00002415/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002416 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002417 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002418 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002419 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002420 * also possible that we return a number of bytes smaller than the request
2421 * bytes.
2422 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002423static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002424sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2425{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002426 ssize_t outlen = -1;
2427 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002428#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002429 int remaining;
2430 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002431#endif
2432
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002433 if (!IS_SELECTABLE(s)) {
2434 select_error();
2435 return -1;
2436 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002437
2438#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002439 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002440 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002441 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002442 if (!timeout)
2443 outlen = recv(s->sock_fd, cbuf, len, flags);
2444 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002445
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002446 if (timeout == 1) {
2447 PyErr_SetString(socket_timeout, "timed out");
2448 return -1;
2449 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002450 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002451 if (outlen < 0) {
2452 /* Note: the call to errorhandler() ALWAYS indirectly returned
2453 NULL, so ignore its return value */
2454 s->errorhandler();
2455 return -1;
2456 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002457#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002458 read_buf = cbuf;
2459 remaining = len;
2460 while (remaining != 0) {
2461 unsigned int segment;
2462 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002463
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002464 segment = remaining /SEGMENT_SIZE;
2465 if (segment != 0) {
2466 segment = SEGMENT_SIZE;
2467 }
2468 else {
2469 segment = remaining;
2470 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002471
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002472 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002473 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002474 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002475 if (!timeout)
2476 nread = recv(s->sock_fd, read_buf, segment, flags);
2477 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002479 if (timeout == 1) {
2480 PyErr_SetString(socket_timeout, "timed out");
2481 return -1;
2482 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002483 END_SELECT_LOOP(s)
2484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002485 if (nread < 0) {
2486 s->errorhandler();
2487 return -1;
2488 }
2489 if (nread != remaining) {
2490 read_buf += nread;
2491 break;
2492 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002493
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002494 remaining -= segment;
2495 read_buf += segment;
2496 }
2497 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002498#endif /* !__VMS */
2499
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002500 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002501}
2502
Guido van Rossum48a680c2001-03-02 06:34:14 +00002503
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002504/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002505
Guido van Rossum73624e91994-10-10 17:59:00 +00002506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002507sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002508{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002509 int recvlen, flags = 0;
2510 ssize_t outlen;
2511 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002512
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002513 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2514 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002515
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002516 if (recvlen < 0) {
2517 PyErr_SetString(PyExc_ValueError,
2518 "negative buffersize in recv");
2519 return NULL;
2520 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002522 /* Allocate a new string. */
2523 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2524 if (buf == NULL)
2525 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002527 /* Call the guts */
2528 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2529 if (outlen < 0) {
2530 /* An error occurred, release the string and return an
2531 error. */
2532 Py_DECREF(buf);
2533 return NULL;
2534 }
2535 if (outlen != recvlen) {
2536 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002537 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002538 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002539 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002540 return NULL;
2541 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002542
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002543 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002544}
2545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002546PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002547"recv(buffersize[, flags]) -> data\n\
2548\n\
2549Receive up to buffersize bytes from the socket. For the optional flags\n\
2550argument, see the Unix manual. When no data is available, block until\n\
2551at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002552the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002553
Guido van Rossum30a685f1991-06-27 15:51:29 +00002554
Martin Blaisaf2ae722006-06-04 13:49:49 +00002555/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002556
Martin Blais2856e5f2006-05-26 12:03:27 +00002557static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002558sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002559{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002560 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002561
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002562 int recvlen = 0, flags = 0;
2563 ssize_t readlen;
2564 Py_buffer buf;
2565 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002566
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002567 /* Get the buffer's memory */
2568 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2569 &buf, &recvlen, &flags))
2570 return NULL;
2571 buflen = buf.len;
2572 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002573
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002574 if (recvlen < 0) {
2575 PyErr_SetString(PyExc_ValueError,
2576 "negative buffersize in recv_into");
2577 goto error;
2578 }
2579 if (recvlen == 0) {
2580 /* If nbytes was not specified, use the buffer's length */
2581 recvlen = buflen;
2582 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002584 /* Check if the buffer is large enough */
2585 if (buflen < recvlen) {
2586 PyErr_SetString(PyExc_ValueError,
2587 "buffer too small for requested bytes");
2588 goto error;
2589 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002590
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002591 /* Call the guts */
2592 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2593 if (readlen < 0) {
2594 /* Return an error. */
2595 goto error;
2596 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002597
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002598 PyBuffer_Release(&buf);
2599 /* Return the number of bytes read. Note that we do not do anything
2600 special here in the case that readlen < recvlen. */
2601 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002602
2603error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002604 PyBuffer_Release(&buf);
2605 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002606}
2607
Martin Blaisaf2ae722006-06-04 13:49:49 +00002608PyDoc_STRVAR(recv_into_doc,
2609"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002610\n\
2611A version of recv() that stores its data into a buffer rather than creating \n\
2612a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2613is not specified (or 0), receive up to the size available in the given buffer.\n\
2614\n\
2615See recv() for documentation about the flags.");
2616
2617
2618/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002619 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2620 * into a char buffer. If you have any inc/def ref to do to the objects that
2621 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002622 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002623 * that it is also possible that we return a number of bytes smaller than the
2624 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002625 *
2626 * 'addr' is a return value for the address object. Note that you must decref
2627 * it yourself.
2628 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002629static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002630sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002631 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002632{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002633 sock_addr_t addrbuf;
2634 int timeout;
2635 ssize_t n = -1;
2636 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002637
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002638 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002639
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002640 if (!getsockaddrlen(s, &addrlen))
2641 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002642
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002643 if (!IS_SELECTABLE(s)) {
2644 select_error();
2645 return -1;
2646 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002647
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002648 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002649 Py_BEGIN_ALLOW_THREADS
2650 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002651 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002652 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002653#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002654#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002655 n = recvfrom(s->sock_fd, cbuf, len, flags,
2656 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002657#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002658 n = recvfrom(s->sock_fd, cbuf, len, flags,
2659 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002660#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002661#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002662 n = recvfrom(s->sock_fd, cbuf, len, flags,
2663 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002664#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002665 }
2666 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002667
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002668 if (timeout == 1) {
2669 PyErr_SetString(socket_timeout, "timed out");
2670 return -1;
2671 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002672 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002673 if (n < 0) {
2674 s->errorhandler();
2675 return -1;
2676 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002677
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002678 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2679 addrlen, s->sock_proto)))
2680 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002681
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002682 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002683}
2684
2685/* s.recvfrom(nbytes [,flags]) method */
2686
2687static PyObject *
2688sock_recvfrom(PySocketSockObject *s, PyObject *args)
2689{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002690 PyObject *buf = NULL;
2691 PyObject *addr = NULL;
2692 PyObject *ret = NULL;
2693 int recvlen, flags = 0;
2694 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002695
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002696 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2697 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002698
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002699 if (recvlen < 0) {
2700 PyErr_SetString(PyExc_ValueError,
2701 "negative buffersize in recvfrom");
2702 return NULL;
2703 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002704
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002705 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2706 if (buf == NULL)
2707 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002708
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002709 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2710 recvlen, flags, &addr);
2711 if (outlen < 0) {
2712 goto finally;
2713 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002715 if (outlen != recvlen) {
2716 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002717 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002718 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002719 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002720 goto finally;
2721 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002722
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002723 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002724
2725finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002726 Py_XDECREF(buf);
2727 Py_XDECREF(addr);
2728 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002729}
2730
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002732"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2733\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002734Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002735
Martin Blais2856e5f2006-05-26 12:03:27 +00002736
Martin Blaisaf2ae722006-06-04 13:49:49 +00002737/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002738
2739static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002740sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002741{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002742 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002743
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002744 int recvlen = 0, flags = 0;
2745 ssize_t readlen;
2746 Py_buffer buf;
2747 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002749 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002750
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002751 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2752 kwlist, &buf,
2753 &recvlen, &flags))
2754 return NULL;
2755 buflen = buf.len;
Martin Blais2856e5f2006-05-26 12:03:27 +00002756
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002757 if (recvlen < 0) {
2758 PyErr_SetString(PyExc_ValueError,
2759 "negative buffersize in recvfrom_into");
2760 goto error;
2761 }
2762 if (recvlen == 0) {
2763 /* If nbytes was not specified, use the buffer's length */
2764 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002765 } else if (recvlen > buflen) {
2766 PyErr_SetString(PyExc_ValueError,
2767 "nbytes is greater than the length of the buffer");
2768 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002769 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002770
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002771 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2772 if (readlen < 0) {
2773 /* Return an error */
2774 goto error;
2775 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002776
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002777 PyBuffer_Release(&buf);
2778 /* Return the number of bytes read and the address. Note that we do
2779 not do anything special here in the case that readlen < recvlen. */
2780 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002781
2782error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002783 Py_XDECREF(addr);
2784 PyBuffer_Release(&buf);
2785 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002786}
2787
Martin Blaisaf2ae722006-06-04 13:49:49 +00002788PyDoc_STRVAR(recvfrom_into_doc,
2789"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002790\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002791Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002792
2793
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002794/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002795
Guido van Rossum73624e91994-10-10 17:59:00 +00002796static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002797sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002798{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002799 char *buf;
2800 int len, n = -1, flags = 0, timeout;
2801 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002802
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002803 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2804 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002805
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002806 if (!IS_SELECTABLE(s)) {
2807 PyBuffer_Release(&pbuf);
2808 return select_error();
2809 }
2810 buf = pbuf.buf;
2811 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002812
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002813 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002814 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002815 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002816 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002817#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002818 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002819#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002820 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002821#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002822 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002823 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002824 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002825 PyErr_SetString(socket_timeout, "timed out");
2826 return NULL;
2827 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002828 END_SELECT_LOOP(s)
2829
2830 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002831 if (n < 0)
2832 return s->errorhandler();
2833 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002834}
2835
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002836PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002837"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838\n\
2839Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002840argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002842
2843
2844/* s.sendall(data [,flags]) method */
2845
2846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002847sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002848{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002849 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002850 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002851 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002852
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002853 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2854 return NULL;
2855 buf = pbuf.buf;
2856 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002857
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002858 if (!IS_SELECTABLE(s)) {
2859 PyBuffer_Release(&pbuf);
2860 return select_error();
2861 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002862
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002863 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002864 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002865 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002866 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002867 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002868 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002869#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002870 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002871#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002872 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002873#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002874 }
2875 Py_END_ALLOW_THREADS
2876 if (timeout == 1) {
2877 PyBuffer_Release(&pbuf);
2878 PyErr_SetString(socket_timeout, "timed out");
2879 return NULL;
2880 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002881 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002882 /* PyErr_CheckSignals() might change errno */
2883 saved_errno = errno;
2884 /* We must run our signal handlers before looping again.
2885 send() can return a successful partial write when it is
2886 interrupted, so we can't restrict ourselves to EINTR. */
2887 if (PyErr_CheckSignals()) {
2888 PyBuffer_Release(&pbuf);
2889 return NULL;
2890 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002891 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002892 /* If interrupted, try again */
2893 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002895 else
2896 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002897 }
2898 buf += n;
2899 len -= n;
2900 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002901 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002902
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002903 if (n < 0)
2904 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002905
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002906 Py_INCREF(Py_None);
2907 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002908}
2909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002910PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002911"sendall(data[, flags])\n\
2912\n\
2913Send a data string to the socket. For the optional flags\n\
2914argument, see the Unix manual. This calls send() repeatedly\n\
2915until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002916to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002917
Guido van Rossum30a685f1991-06-27 15:51:29 +00002918
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002919/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002920
Guido van Rossum73624e91994-10-10 17:59:00 +00002921static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002922sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002923{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002924 Py_buffer pbuf;
2925 PyObject *addro;
2926 char *buf;
2927 Py_ssize_t len;
2928 sock_addr_t addrbuf;
Victor Stinner31c7e4f2015-04-02 17:19:17 +02002929 int addrlen, flags, timeout;
2930 long n = -1;
Ezio Melotti0639be62011-05-07 19:21:22 +03002931 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002932
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002933 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002934 arglen = PyTuple_Size(args);
2935 switch(arglen) {
2936 case 2:
2937 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2938 break;
2939 case 3:
2940 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2941 break;
2942 default:
2943 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2944 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002945 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002946 if (PyErr_Occurred())
2947 return NULL;
2948
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002949 buf = pbuf.buf;
2950 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002951
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002952 if (!IS_SELECTABLE(s)) {
2953 PyBuffer_Release(&pbuf);
2954 return select_error();
2955 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002956
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002957 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2958 PyBuffer_Release(&pbuf);
2959 return NULL;
2960 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002961
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002962 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002963 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002964 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002965 if (!timeout)
2966 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2967 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002968
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002969 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002970 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002971 PyErr_SetString(socket_timeout, "timed out");
2972 return NULL;
2973 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002974 END_SELECT_LOOP(s)
2975 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002976 if (n < 0)
2977 return s->errorhandler();
2978 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002979}
2980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002981PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002982"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983\n\
2984Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002985For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002986
Guido van Rossum30a685f1991-06-27 15:51:29 +00002987
2988/* s.shutdown(how) method */
2989
Guido van Rossum73624e91994-10-10 17:59:00 +00002990static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002991sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002992{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002993 int how;
2994 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002995
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002996 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002997 if (how == -1 && PyErr_Occurred())
2998 return NULL;
2999 Py_BEGIN_ALLOW_THREADS
3000 res = shutdown(s->sock_fd, how);
3001 Py_END_ALLOW_THREADS
3002 if (res < 0)
3003 return s->errorhandler();
3004 Py_INCREF(Py_None);
3005 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003006}
3007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003008PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003009"shutdown(flag)\n\
3010\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003011Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3012of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003013
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003014#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00003015static PyObject*
3016sock_ioctl(PySocketSockObject *s, PyObject *arg)
3017{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003018 unsigned long cmd = SIO_RCVALL;
3019 PyObject *argO;
3020 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00003021
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003022 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3023 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00003024
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003025 switch (cmd) {
3026 case SIO_RCVALL: {
3027 unsigned int option = RCVALL_ON;
3028 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3029 return NULL;
3030 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3031 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3032 return set_error();
3033 }
3034 return PyLong_FromUnsignedLong(recv); }
3035 case SIO_KEEPALIVE_VALS: {
3036 struct tcp_keepalive ka;
3037 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3038 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3039 return NULL;
3040 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3041 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3042 return set_error();
3043 }
3044 return PyLong_FromUnsignedLong(recv); }
3045 default:
3046 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3047 return NULL;
3048 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003049}
3050PyDoc_STRVAR(sock_ioctl_doc,
3051"ioctl(cmd, option) -> long\n\
3052\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003053Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3054SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3055SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003056
3057#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003058
3059/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003060
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003061static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003062 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3063 accept_doc},
3064 {"bind", (PyCFunction)sock_bind, METH_O,
3065 bind_doc},
3066 {"close", (PyCFunction)sock_close, METH_NOARGS,
3067 close_doc},
3068 {"connect", (PyCFunction)sock_connect, METH_O,
3069 connect_doc},
3070 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3071 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003072#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003073 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3074 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003075#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003076 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3077 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003078#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003079 {"getpeername", (PyCFunction)sock_getpeername,
3080 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003081#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003082 {"getsockname", (PyCFunction)sock_getsockname,
3083 METH_NOARGS, getsockname_doc},
3084 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3085 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003086#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003087 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3088 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003090 {"listen", (PyCFunction)sock_listen, METH_O,
3091 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003092#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003093 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3094 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003096 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3097 recv_doc},
3098 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3099 recv_into_doc},
3100 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3101 recvfrom_doc},
3102 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3103 recvfrom_into_doc},
3104 {"send", (PyCFunction)sock_send, METH_VARARGS,
3105 send_doc},
3106 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3107 sendall_doc},
3108 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3109 sendto_doc},
3110 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3111 setblocking_doc},
3112 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3113 settimeout_doc},
3114 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3115 gettimeout_doc},
3116 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3117 setsockopt_doc},
3118 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3119 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003120#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003121 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3122 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003123#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003124 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003125};
3126
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003127/* SockObject members */
3128static PyMemberDef sock_memberlist[] = {
3129 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3130 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3131 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3132 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3133 {0},
3134};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003135
Guido van Rossum73624e91994-10-10 17:59:00 +00003136/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003137 First close the file description. */
3138
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003139static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003140sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003141{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003142 if (s->sock_fd != -1)
3143 (void) SOCKETCLOSE(s->sock_fd);
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003144 if (s->weakreflist != NULL)
3145 PyObject_ClearWeakRefs((PyObject *)s);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003146 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003147}
3148
Guido van Rossum30a685f1991-06-27 15:51:29 +00003149
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003151sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003152{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003153 char buf[512];
Victor Stinner0a649c72014-07-26 14:52:55 +02003154 long sock_fd;
3155 /* On Windows, this test is needed because SOCKET_T is unsigned */
3156 if (s->sock_fd == INVALID_SOCKET) {
3157 sock_fd = -1;
3158 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003159#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinner0a649c72014-07-26 14:52:55 +02003160 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003161 /* this can occur on Win64, and actually there is a special
3162 ugly printf formatter for decimal pointer length integer
3163 printing, only bother if necessary*/
3164 PyErr_SetString(PyExc_OverflowError,
3165 "no printf formatter to display "
3166 "the socket descriptor in decimal");
3167 return NULL;
3168 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003169#endif
Victor Stinner0a649c72014-07-26 14:52:55 +02003170 else
3171 sock_fd = (long)s->sock_fd;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003172 PyOS_snprintf(
3173 buf, sizeof(buf),
3174 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Victor Stinner0a649c72014-07-26 14:52:55 +02003175 sock_fd, s->sock_family,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003176 s->sock_type,
3177 s->sock_proto);
3178 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003179}
3180
3181
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003182/* Create a new, uninitialized socket object. */
3183
3184static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003185sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003186{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003187 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003188
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003189 new = type->tp_alloc(type, 0);
3190 if (new != NULL) {
3191 ((PySocketSockObject *)new)->sock_fd = -1;
3192 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3193 ((PySocketSockObject *)new)->errorhandler = &set_error;
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003194 ((PySocketSockObject *)new)->weakreflist = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003195 }
3196 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003197}
3198
3199
3200/* Initialize a new socket object. */
3201
3202/*ARGSUSED*/
3203static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003204sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003205{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003206 PySocketSockObject *s = (PySocketSockObject *)self;
3207 SOCKET_T fd;
3208 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3209 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003210
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003211 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3212 "|iii:socket", keywords,
3213 &family, &type, &proto))
3214 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003215
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003216 Py_BEGIN_ALLOW_THREADS
3217 fd = socket(family, type, proto);
3218 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003219
Victor Stinner465db3c2014-07-26 14:47:56 +02003220 if (fd == INVALID_SOCKET) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003221 set_error();
3222 return -1;
3223 }
3224 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003225
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003226 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003227
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003228}
3229
3230
Guido van Rossumb6775db1994-08-01 11:34:53 +00003231/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003232
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003233static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003234 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3235 "_socket.socket", /* tp_name */
3236 sizeof(PySocketSockObject), /* tp_basicsize */
3237 0, /* tp_itemsize */
3238 (destructor)sock_dealloc, /* tp_dealloc */
3239 0, /* tp_print */
3240 0, /* tp_getattr */
3241 0, /* tp_setattr */
3242 0, /* tp_compare */
3243 (reprfunc)sock_repr, /* tp_repr */
3244 0, /* tp_as_number */
3245 0, /* tp_as_sequence */
3246 0, /* tp_as_mapping */
3247 0, /* tp_hash */
3248 0, /* tp_call */
3249 0, /* tp_str */
3250 PyObject_GenericGetAttr, /* tp_getattro */
3251 0, /* tp_setattro */
3252 0, /* tp_as_buffer */
3253 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3254 sock_doc, /* tp_doc */
3255 0, /* tp_traverse */
3256 0, /* tp_clear */
3257 0, /* tp_richcompare */
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003258 offsetof(PySocketSockObject, weakreflist), /* tp_weaklistoffset */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003259 0, /* tp_iter */
3260 0, /* tp_iternext */
3261 sock_methods, /* tp_methods */
3262 sock_memberlist, /* tp_members */
3263 0, /* tp_getset */
3264 0, /* tp_base */
3265 0, /* tp_dict */
3266 0, /* tp_descr_get */
3267 0, /* tp_descr_set */
3268 0, /* tp_dictoffset */
3269 sock_initobj, /* tp_init */
3270 PyType_GenericAlloc, /* tp_alloc */
3271 sock_new, /* tp_new */
3272 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003273};
3274
Guido van Rossum30a685f1991-06-27 15:51:29 +00003275
Guido van Rossum81194471991-07-27 21:42:02 +00003276/* Python interface to gethostname(). */
3277
3278/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003279static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003280socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003281{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003282 char buf[1024];
3283 int res;
3284 Py_BEGIN_ALLOW_THREADS
3285 res = gethostname(buf, (int) sizeof buf - 1);
3286 Py_END_ALLOW_THREADS
3287 if (res < 0)
3288 return set_error();
3289 buf[sizeof buf - 1] = '\0';
3290 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003291}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003292
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003293PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003294"gethostname() -> string\n\
3295\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003296Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003297
Guido van Rossumff4949e1992-08-05 19:58:53 +00003298
Guido van Rossum30a685f1991-06-27 15:51:29 +00003299/* Python interface to gethostbyname(name). */
3300
3301/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003302static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003303socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003304{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003305 char *name;
3306 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003307
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003308 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3309 return NULL;
3310 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3311 return NULL;
3312 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003313}
3314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003315PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003316"gethostbyname(host) -> address\n\
3317\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003318Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003319
3320
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003321/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3322
3323static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003324gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003325{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003326 char **pch;
3327 PyObject *rtn_tuple = (PyObject *)NULL;
3328 PyObject *name_list = (PyObject *)NULL;
3329 PyObject *addr_list = (PyObject *)NULL;
3330 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003331
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003332 if (h == NULL) {
3333 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003334#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003335 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003336#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003337 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003338#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003339 return NULL;
3340 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003341
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003342 if (h->h_addrtype != af) {
3343 /* Let's get real error message to return */
3344 PyErr_SetString(socket_error,
3345 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003346
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003347 return NULL;
3348 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003349
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003350 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003351
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003352 case AF_INET:
3353 if (alen < sizeof(struct sockaddr_in))
3354 return NULL;
3355 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003356
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003357#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003358 case AF_INET6:
3359 if (alen < sizeof(struct sockaddr_in6))
3360 return NULL;
3361 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003362#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003364 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003365
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003366 if ((name_list = PyList_New(0)) == NULL)
3367 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003368
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003369 if ((addr_list = PyList_New(0)) == NULL)
3370 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003371
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003372 /* SF #1511317: h_aliases can be NULL */
3373 if (h->h_aliases) {
3374 for (pch = h->h_aliases; *pch != NULL; pch++) {
3375 int status;
3376 tmp = PyString_FromString(*pch);
3377 if (tmp == NULL)
3378 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003379
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003380 status = PyList_Append(name_list, tmp);
3381 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003382
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003383 if (status)
3384 goto err;
3385 }
3386 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003387
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003388 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3389 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003390
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003391 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003392
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003393 case AF_INET:
3394 {
3395 struct sockaddr_in sin;
3396 memset(&sin, 0, sizeof(sin));
3397 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003398#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003399 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003400#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003401 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3402 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003403
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003404 if (pch == h->h_addr_list && alen >= sizeof(sin))
3405 memcpy((char *) addr, &sin, sizeof(sin));
3406 break;
3407 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003408
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003409#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003410 case AF_INET6:
3411 {
3412 struct sockaddr_in6 sin6;
3413 memset(&sin6, 0, sizeof(sin6));
3414 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003415#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003416 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003417#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003418 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3419 tmp = makeipaddr((struct sockaddr *)&sin6,
3420 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003421
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003422 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3423 memcpy((char *) addr, &sin6, sizeof(sin6));
3424 break;
3425 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003426#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003427
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003428 default: /* can't happen */
3429 PyErr_SetString(socket_error,
3430 "unsupported address family");
3431 return NULL;
3432 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003433
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003434 if (tmp == NULL)
3435 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003436
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003437 status = PyList_Append(addr_list, tmp);
3438 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003439
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003440 if (status)
3441 goto err;
3442 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003443
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003444 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003445
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003446 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003447 Py_XDECREF(name_list);
3448 Py_XDECREF(addr_list);
3449 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003450}
3451
3452
3453/* Python interface to gethostbyname_ex(name). */
3454
3455/*ARGSUSED*/
3456static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003457socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003458{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003459 char *name;
3460 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003461#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003462 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003463#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003464 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003465#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003466 struct sockaddr *sa;
3467 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003468#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003469 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003470#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003471 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003472#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003473 char buf[16384];
3474 int buf_len = (sizeof buf) - 1;
3475 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003476#endif
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003477#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003478 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003479#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003480#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003482 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3483 return NULL;
3484 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3485 return NULL;
3486 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003487#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003488#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003489 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003490 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003491#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003492 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003493#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003494 memset((void *) &data, '\0', sizeof(data));
3495 result = gethostbyname_r(name, &hp_allocated, &data);
3496 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003497#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003498#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003499#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003500 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003501#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003502 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003503#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003504 Py_END_ALLOW_THREADS
3505 /* Some C libraries would require addr.__ss_family instead of
3506 addr.ss_family.
3507 Therefore, we cast the sockaddr_storage into sockaddr to
3508 access sa_family. */
3509 sa = (struct sockaddr*)&addr;
3510 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3511 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003512#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003513 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003514#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003515 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003516}
3517
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003518PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003519"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3520\n\
3521Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003522for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003523
3524
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003525/* Python interface to gethostbyaddr(IP). */
3526
3527/*ARGSUSED*/
3528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003529socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003530{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003531#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003532 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003533#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003534 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003535#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003536 struct sockaddr *sa = (struct sockaddr *)&addr;
3537 char *ip_num;
3538 struct hostent *h;
3539 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003540#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003541 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003542#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003543 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003544#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003545 /* glibcs up to 2.10 assume that the buf argument to
3546 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3547 does not ensure. The attribute below instructs the compiler
3548 to maintain this alignment. */
3549 char buf[16384] Py_ALIGNED(8);
3550 int buf_len = (sizeof buf) - 1;
3551 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003552#endif
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003553#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003554 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003555#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003556#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003557 char *ap;
3558 int al;
3559 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003560
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003561 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3562 return NULL;
3563 af = AF_UNSPEC;
3564 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3565 return NULL;
3566 af = sa->sa_family;
3567 ap = NULL;
3568 switch (af) {
3569 case AF_INET:
3570 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3571 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3572 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003573#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003574 case AF_INET6:
3575 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3576 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3577 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003578#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003579 default:
3580 PyErr_SetString(socket_error, "unsupported address family");
3581 return NULL;
3582 }
3583 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003584#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003585#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003586 gethostbyaddr_r(ap, al, af,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003587 &hp_allocated, buf, buf_len,
3588 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003589#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003590 h = gethostbyaddr_r(ap, al, af,
3591 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003592#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003593 memset((void *) &data, '\0', sizeof(data));
3594 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3595 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003596#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003597#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003598#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003599 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003600#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003601 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003602#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003603 Py_END_ALLOW_THREADS
3604 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003605#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003606 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003607#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003608 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003609}
3610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003611PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003612"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3613\n\
3614Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003615for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003616
Guido van Rossum30a685f1991-06-27 15:51:29 +00003617
3618/* Python interface to getservbyname(name).
3619 This only returns the port number, since the other info is already
3620 known or not useful (like the list of aliases). */
3621
3622/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003623static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003624socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003625{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003626 char *name, *proto=NULL;
3627 struct servent *sp;
3628 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3629 return NULL;
3630 Py_BEGIN_ALLOW_THREADS
3631 sp = getservbyname(name, proto);
3632 Py_END_ALLOW_THREADS
3633 if (sp == NULL) {
3634 PyErr_SetString(socket_error, "service/proto not found");
3635 return NULL;
3636 }
3637 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003638}
3639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003640PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003641"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003642\n\
3643Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003644The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3645otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003646
Guido van Rossum30a685f1991-06-27 15:51:29 +00003647
Barry Warsaw11b91a02004-06-28 00:50:43 +00003648/* Python interface to getservbyport(port).
3649 This only returns the service name, since the other info is already
3650 known or not useful (like the list of aliases). */
3651
3652/*ARGSUSED*/
3653static PyObject *
3654socket_getservbyport(PyObject *self, PyObject *args)
3655{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003656 int port;
3657 char *proto=NULL;
3658 struct servent *sp;
3659 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3660 return NULL;
3661 if (port < 0 || port > 0xffff) {
3662 PyErr_SetString(
3663 PyExc_OverflowError,
3664 "getservbyport: port must be 0-65535.");
3665 return NULL;
3666 }
3667 Py_BEGIN_ALLOW_THREADS
3668 sp = getservbyport(htons((short)port), proto);
3669 Py_END_ALLOW_THREADS
3670 if (sp == NULL) {
3671 PyErr_SetString(socket_error, "port/proto not found");
3672 return NULL;
3673 }
3674 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003675}
3676
3677PyDoc_STRVAR(getservbyport_doc,
3678"getservbyport(port[, protocolname]) -> string\n\
3679\n\
3680Return the service name from a port number and protocol name.\n\
3681The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3682otherwise any protocol will match.");
3683
Guido van Rossum3901d851996-12-19 16:35:04 +00003684/* Python interface to getprotobyname(name).
3685 This only returns the protocol number, since the other info is
3686 already known or not useful (like the list of aliases). */
3687
3688/*ARGSUSED*/
3689static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003690socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003691{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003692 char *name;
3693 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003694#ifdef __BEOS__
3695/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003696 PyErr_SetString(socket_error, "getprotobyname not supported");
3697 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003698#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003699 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3700 return NULL;
3701 Py_BEGIN_ALLOW_THREADS
3702 sp = getprotobyname(name);
3703 Py_END_ALLOW_THREADS
3704 if (sp == NULL) {
3705 PyErr_SetString(socket_error, "protocol not found");
3706 return NULL;
3707 }
3708 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003709#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003710}
3711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003712PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003713"getprotobyname(name) -> integer\n\
3714\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003715Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003716
Guido van Rossum3901d851996-12-19 16:35:04 +00003717
Dave Cole331708b2004-08-09 04:51:41 +00003718#ifdef HAVE_SOCKETPAIR
3719/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003720 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003721 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003722
3723/*ARGSUSED*/
3724static PyObject *
3725socket_socketpair(PyObject *self, PyObject *args)
3726{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003727 PySocketSockObject *s0 = NULL, *s1 = NULL;
3728 SOCKET_T sv[2];
3729 int family, type = SOCK_STREAM, proto = 0;
3730 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003731
3732#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003733 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003734#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003735 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003736#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003737 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3738 &family, &type, &proto))
3739 return NULL;
3740 /* Create a pair of socket fds */
3741 if (socketpair(family, type, proto, sv) < 0)
3742 return set_error();
3743 s0 = new_sockobject(sv[0], family, type, proto);
3744 if (s0 == NULL)
3745 goto finally;
3746 s1 = new_sockobject(sv[1], family, type, proto);
3747 if (s1 == NULL)
3748 goto finally;
3749 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003750
3751finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003752 if (res == NULL) {
3753 if (s0 == NULL)
3754 SOCKETCLOSE(sv[0]);
3755 if (s1 == NULL)
3756 SOCKETCLOSE(sv[1]);
3757 }
3758 Py_XDECREF(s0);
3759 Py_XDECREF(s1);
3760 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003761}
3762
3763PyDoc_STRVAR(socketpair_doc,
3764"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3765\n\
3766Create a pair of socket objects from the sockets returned by the platform\n\
3767socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003768The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003769AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003770
3771#endif /* HAVE_SOCKETPAIR */
3772
3773
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003774#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003775/* Create a socket object from a numeric file description.
3776 Useful e.g. if stdin is a socket.
3777 Additional arguments as for socket(). */
3778
3779/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003781socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003782{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003783 PySocketSockObject *s;
3784 SOCKET_T fd;
3785 int family, type, proto = 0;
3786 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3787 &fd, &family, &type, &proto))
3788 return NULL;
3789 /* Dup the fd so it and the socket can be closed independently */
3790 fd = dup(fd);
3791 if (fd < 0)
3792 return set_error();
3793 s = new_sockobject(fd, family, type, proto);
3794 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003795}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003797PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003798"fromfd(fd, family, type[, proto]) -> socket object\n\
3799\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003800Create a socket object from a duplicate of the given\n\
3801file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003802The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003803
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003804#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003805
Guido van Rossum82a5c661998-07-07 20:45:43 +00003806
Guido van Rossum006bf911996-06-12 04:04:55 +00003807static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003808socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003809{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003810 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003811
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003812 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3813 return NULL;
3814 }
3815 if (x1 < 0) {
3816 PyErr_SetString(PyExc_OverflowError,
3817 "can't convert negative number to unsigned long");
3818 return NULL;
3819 }
3820 x2 = (unsigned int)ntohs((unsigned short)x1);
3821 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003822}
3823
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003824PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003825"ntohs(integer) -> integer\n\
3826\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003827Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003828
3829
Guido van Rossum006bf911996-06-12 04:04:55 +00003830static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003831socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003832{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003833 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003834
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003835 if (PyInt_Check(arg)) {
3836 x = PyInt_AS_LONG(arg);
3837 if (x == (unsigned long) -1 && PyErr_Occurred())
3838 return NULL;
3839 if ((long)x < 0) {
3840 PyErr_SetString(PyExc_OverflowError,
3841 "can't convert negative number to unsigned long");
3842 return NULL;
3843 }
3844 }
3845 else if (PyLong_Check(arg)) {
3846 x = PyLong_AsUnsignedLong(arg);
3847 if (x == (unsigned long) -1 && PyErr_Occurred())
3848 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003849#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003850 {
3851 unsigned long y;
3852 /* only want the trailing 32 bits */
3853 y = x & 0xFFFFFFFFUL;
3854 if (y ^ x)
3855 return PyErr_Format(PyExc_OverflowError,
3856 "long int larger than 32 bits");
3857 x = y;
3858 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003859#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003860 }
3861 else
3862 return PyErr_Format(PyExc_TypeError,
3863 "expected int/long, %s found",
3864 Py_TYPE(arg)->tp_name);
3865 if (x == (unsigned long) -1 && PyErr_Occurred())
3866 return NULL;
3867 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003868}
3869
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003870PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003871"ntohl(integer) -> integer\n\
3872\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003873Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003874
3875
Guido van Rossum006bf911996-06-12 04:04:55 +00003876static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003877socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003878{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003879 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003880
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003881 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3882 return NULL;
3883 }
3884 if (x1 < 0) {
3885 PyErr_SetString(PyExc_OverflowError,
3886 "can't convert negative number to unsigned long");
3887 return NULL;
3888 }
3889 x2 = (unsigned int)htons((unsigned short)x1);
3890 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003891}
3892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003893PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003894"htons(integer) -> integer\n\
3895\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003896Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003897
3898
Guido van Rossum006bf911996-06-12 04:04:55 +00003899static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003900socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003901{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003902 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003903
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003904 if (PyInt_Check(arg)) {
3905 x = PyInt_AS_LONG(arg);
3906 if (x == (unsigned long) -1 && PyErr_Occurred())
3907 return NULL;
3908 if ((long)x < 0) {
3909 PyErr_SetString(PyExc_OverflowError,
3910 "can't convert negative number to unsigned long");
3911 return NULL;
3912 }
3913 }
3914 else if (PyLong_Check(arg)) {
3915 x = PyLong_AsUnsignedLong(arg);
3916 if (x == (unsigned long) -1 && PyErr_Occurred())
3917 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003918#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003919 {
3920 unsigned long y;
3921 /* only want the trailing 32 bits */
3922 y = x & 0xFFFFFFFFUL;
3923 if (y ^ x)
3924 return PyErr_Format(PyExc_OverflowError,
3925 "long int larger than 32 bits");
3926 x = y;
3927 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003928#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003929 }
3930 else
3931 return PyErr_Format(PyExc_TypeError,
3932 "expected int/long, %s found",
3933 Py_TYPE(arg)->tp_name);
3934 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003935}
3936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003937PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003938"htonl(integer) -> integer\n\
3939\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003940Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003941
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003942/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003944PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003945"inet_aton(string) -> packed 32-bit IP representation\n\
3946\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003947Convert 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 +00003948binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003949
3950static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003951socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003952{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003953#ifndef INADDR_NONE
3954#define INADDR_NONE (-1)
3955#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003956#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003957 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003958#endif
3959
3960#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003961#if (SIZEOF_INT != 4)
3962#error "Not sure if in_addr_t exists and int is not 32-bits."
3963#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003964 /* Have to use inet_addr() instead */
3965 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003966#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003967 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003968
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003969 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3970 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003971
Tim Peters1df9fdd2003-02-13 03:13:40 +00003972
3973#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003974
3975#ifdef USE_INET_ATON_WEAKLINK
3976 if (inet_aton != NULL) {
3977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003978 if (inet_aton(ip_addr, &buf))
3979 return PyString_FromStringAndSize((char *)(&buf),
3980 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003981
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003982 PyErr_SetString(socket_error,
3983 "illegal IP address string passed to inet_aton");
3984 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003985
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003986#ifdef USE_INET_ATON_WEAKLINK
3987 } else {
3988#endif
3989
3990#endif
3991
3992#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3993
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003994 /* special-case this address as inet_addr might return INADDR_NONE
3995 * for this */
3996 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3997 packed_addr = 0xFFFFFFFF;
3998 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004000 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004001
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004002 if (packed_addr == INADDR_NONE) { /* invalid address */
4003 PyErr_SetString(socket_error,
4004 "illegal IP address string passed to inet_aton");
4005 return NULL;
4006 }
4007 }
4008 return PyString_FromStringAndSize((char *) &packed_addr,
4009 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00004010
4011#ifdef USE_INET_ATON_WEAKLINK
4012 }
4013#endif
4014
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004015#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004016}
4017
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004018PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004019"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004020\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004021Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004022
4023static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004024socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004025{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004026 char *packed_str;
4027 int addr_len;
4028 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004029
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004030 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4031 return NULL;
4032 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004033
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004034 if (addr_len != sizeof(packed_addr)) {
4035 PyErr_SetString(socket_error,
4036 "packed IP wrong length for inet_ntoa");
4037 return NULL;
4038 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004039
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004040 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004041
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004042 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004043}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004044
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004045#ifdef HAVE_INET_PTON
4046
4047PyDoc_STRVAR(inet_pton_doc,
4048"inet_pton(af, ip) -> packed IP address string\n\
4049\n\
4050Convert an IP address from string format to a packed string suitable\n\
4051for use with low-level network functions.");
4052
4053static PyObject *
4054socket_inet_pton(PyObject *self, PyObject *args)
4055{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004056 int af;
4057 char* ip;
4058 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004059#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004060 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004061#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004062 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004063#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004064 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4065 return NULL;
4066 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004067
Martin v. Löwis04697e82004-06-02 12:35:29 +00004068#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004069 if(af == AF_INET6) {
4070 PyErr_SetString(socket_error,
4071 "can't use AF_INET6, IPv6 is disabled");
4072 return NULL;
4073 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004074#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004075
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004076 retval = inet_pton(af, ip, packed);
4077 if (retval < 0) {
4078 PyErr_SetFromErrno(socket_error);
4079 return NULL;
4080 } else if (retval == 0) {
4081 PyErr_SetString(socket_error,
4082 "illegal IP address string passed to inet_pton");
4083 return NULL;
4084 } else if (af == AF_INET) {
4085 return PyString_FromStringAndSize(packed,
4086 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004087#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004088 } else if (af == AF_INET6) {
4089 return PyString_FromStringAndSize(packed,
4090 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004091#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004092 } else {
4093 PyErr_SetString(socket_error, "unknown address family");
4094 return NULL;
4095 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004096}
Martin Blais2856e5f2006-05-26 12:03:27 +00004097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004098PyDoc_STRVAR(inet_ntop_doc,
4099"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4100\n\
4101Convert a packed IP address of the given family to string format.");
4102
4103static PyObject *
4104socket_inet_ntop(PyObject *self, PyObject *args)
4105{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004106 int af;
4107 char* packed;
4108 int len;
4109 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004110#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004111 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004112#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004113 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004114#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004116 /* Guarantee NUL-termination for PyString_FromString() below */
4117 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004119 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4120 return NULL;
4121 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004122
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004123 if (af == AF_INET) {
4124 if (len != sizeof(struct in_addr)) {
4125 PyErr_SetString(PyExc_ValueError,
4126 "invalid length of packed IP address string");
4127 return NULL;
4128 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004129#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004130 } else if (af == AF_INET6) {
4131 if (len != sizeof(struct in6_addr)) {
4132 PyErr_SetString(PyExc_ValueError,
4133 "invalid length of packed IP address string");
4134 return NULL;
4135 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004136#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004137 } else {
4138 PyErr_Format(PyExc_ValueError,
4139 "unknown address family %d", af);
4140 return NULL;
4141 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004142
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004143 retval = inet_ntop(af, packed, ip, sizeof(ip));
4144 if (!retval) {
4145 PyErr_SetFromErrno(socket_error);
4146 return NULL;
4147 } else {
4148 return PyString_FromString(retval);
4149 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004150
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004151 /* NOTREACHED */
4152 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4153 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004154}
4155
4156#endif /* HAVE_INET_PTON */
4157
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004158/* Python interface to getaddrinfo(host, port). */
4159
4160/*ARGSUSED*/
4161static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004162socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004163{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004164 struct addrinfo hints, *res;
4165 struct addrinfo *res0 = NULL;
4166 PyObject *hobj = NULL;
4167 PyObject *pobj = (PyObject *)NULL;
4168 char pbuf[30];
4169 char *hptr, *pptr;
4170 int family, socktype, protocol, flags;
4171 int error;
4172 PyObject *all = (PyObject *)NULL;
4173 PyObject *single = (PyObject *)NULL;
4174 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004175
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004176 family = socktype = protocol = flags = 0;
4177 family = AF_UNSPEC;
4178 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4179 &hobj, &pobj, &family, &socktype,
4180 &protocol, &flags)) {
4181 return NULL;
4182 }
4183 if (hobj == Py_None) {
4184 hptr = NULL;
4185 } else if (PyUnicode_Check(hobj)) {
Victor Stinner9a2326b2015-09-11 12:42:13 +02004186 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004187 if (!idna)
4188 return NULL;
4189 hptr = PyString_AsString(idna);
4190 } else if (PyString_Check(hobj)) {
4191 hptr = PyString_AsString(hobj);
4192 } else {
4193 PyErr_SetString(PyExc_TypeError,
4194 "getaddrinfo() argument 1 must be string or None");
4195 return NULL;
4196 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004197 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4198 long value = PyLong_AsLong(pobj);
4199 if (value == -1 && PyErr_Occurred())
4200 return NULL;
4201 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004202 pptr = pbuf;
4203 } else if (PyString_Check(pobj)) {
4204 pptr = PyString_AsString(pobj);
4205 } else if (pobj == Py_None) {
4206 pptr = (char *)NULL;
4207 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004208 PyErr_SetString(socket_error,
4209 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004210 goto err;
4211 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004212#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004213 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4214 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4215 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4216 * This workaround avoids a segfault in libsystem.
4217 */
4218 pptr = "00";
4219 }
4220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004221 memset(&hints, 0, sizeof(hints));
4222 hints.ai_family = family;
4223 hints.ai_socktype = socktype;
4224 hints.ai_protocol = protocol;
4225 hints.ai_flags = flags;
4226 Py_BEGIN_ALLOW_THREADS
4227 ACQUIRE_GETADDRINFO_LOCK
4228 error = getaddrinfo(hptr, pptr, &hints, &res0);
4229 Py_END_ALLOW_THREADS
4230 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4231 if (error) {
4232 set_gaierror(error);
4233 goto err;
4234 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004235
Benjamin Petersona5a44ab2015-04-01 11:16:40 -04004236 all = PyList_New(0);
4237 if (all == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004238 goto err;
4239 for (res = res0; res; res = res->ai_next) {
4240 PyObject *addr =
4241 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4242 if (addr == NULL)
4243 goto err;
4244 single = Py_BuildValue("iiisO", res->ai_family,
4245 res->ai_socktype, res->ai_protocol,
4246 res->ai_canonname ? res->ai_canonname : "",
4247 addr);
4248 Py_DECREF(addr);
4249 if (single == NULL)
4250 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004251
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004252 if (PyList_Append(all, single))
4253 goto err;
4254 Py_XDECREF(single);
4255 }
4256 Py_XDECREF(idna);
4257 if (res0)
4258 freeaddrinfo(res0);
4259 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004260 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004261 Py_XDECREF(single);
4262 Py_XDECREF(all);
4263 Py_XDECREF(idna);
4264 if (res0)
4265 freeaddrinfo(res0);
4266 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004267}
4268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004269PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004270"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4271 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004272\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004273Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004274
4275/* Python interface to getnameinfo(sa, flags). */
4276
4277/*ARGSUSED*/
4278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004279socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004280{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004281 PyObject *sa = (PyObject *)NULL;
4282 int flags;
4283 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004284 int port;
4285 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004286 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4287 struct addrinfo hints, *res = NULL;
4288 int error;
4289 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004290
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004291 flags = flowinfo = scope_id = 0;
4292 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4293 return NULL;
4294 if (!PyTuple_Check(sa)) {
4295 PyErr_SetString(PyExc_TypeError,
4296 "getnameinfo() argument 1 must be a tuple");
4297 return NULL;
4298 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004299 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004300 &hostp, &port, &flowinfo, &scope_id))
4301 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004302 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004303 PyErr_SetString(PyExc_OverflowError,
4304 "getsockaddrarg: flowinfo must be 0-1048575.");
4305 return NULL;
4306 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004307 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4308 memset(&hints, 0, sizeof(hints));
4309 hints.ai_family = AF_UNSPEC;
4310 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4311 Py_BEGIN_ALLOW_THREADS
4312 ACQUIRE_GETADDRINFO_LOCK
4313 error = getaddrinfo(hostp, pbuf, &hints, &res);
4314 Py_END_ALLOW_THREADS
4315 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4316 if (error) {
4317 set_gaierror(error);
4318 goto fail;
4319 }
4320 if (res->ai_next) {
4321 PyErr_SetString(socket_error,
4322 "sockaddr resolved to multiple addresses");
4323 goto fail;
4324 }
4325 switch (res->ai_family) {
4326 case AF_INET:
4327 {
4328 if (PyTuple_GET_SIZE(sa) != 2) {
4329 PyErr_SetString(socket_error,
4330 "IPv4 sockaddr must be 2 tuple");
4331 goto fail;
4332 }
4333 break;
4334 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004335#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004336 case AF_INET6:
4337 {
4338 struct sockaddr_in6 *sin6;
4339 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004340 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004341 sin6->sin6_scope_id = scope_id;
4342 break;
4343 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004344#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004345 }
4346 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4347 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4348 if (error) {
4349 set_gaierror(error);
4350 goto fail;
4351 }
4352 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004353
4354fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004355 if (res)
4356 freeaddrinfo(res);
4357 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004358}
4359
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004360PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004361"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004362\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004363Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004364
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004365
4366/* Python API to getting and setting the default timeout value. */
4367
4368static PyObject *
4369socket_getdefaulttimeout(PyObject *self)
4370{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004371 if (defaulttimeout < 0.0) {
4372 Py_INCREF(Py_None);
4373 return Py_None;
4374 }
4375 else
4376 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004377}
4378
4379PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004380"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004381\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004382Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004383A value of None indicates that new socket objects have no timeout.\n\
4384When the socket module is first imported, the default is None.");
4385
4386static PyObject *
4387socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4388{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004389 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004390
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004391 if (arg == Py_None)
4392 timeout = -1.0;
4393 else {
4394 timeout = PyFloat_AsDouble(arg);
4395 if (timeout < 0.0) {
4396 if (!PyErr_Occurred())
4397 PyErr_SetString(PyExc_ValueError,
4398 "Timeout value out of range");
4399 return NULL;
4400 }
4401 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004402
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004403 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004404
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004405 Py_INCREF(Py_None);
4406 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004407}
4408
4409PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004410"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004411\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004412Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004413A value of None indicates that new socket objects have no timeout.\n\
4414When the socket module is first imported, the default is None.");
4415
4416
Guido van Rossum30a685f1991-06-27 15:51:29 +00004417/* List of functions exported by this module. */
4418
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004419static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004420 {"gethostbyname", socket_gethostbyname,
4421 METH_VARARGS, gethostbyname_doc},
4422 {"gethostbyname_ex", socket_gethostbyname_ex,
4423 METH_VARARGS, ghbn_ex_doc},
4424 {"gethostbyaddr", socket_gethostbyaddr,
4425 METH_VARARGS, gethostbyaddr_doc},
4426 {"gethostname", socket_gethostname,
4427 METH_NOARGS, gethostname_doc},
4428 {"getservbyname", socket_getservbyname,
4429 METH_VARARGS, getservbyname_doc},
4430 {"getservbyport", socket_getservbyport,
4431 METH_VARARGS, getservbyport_doc},
4432 {"getprotobyname", socket_getprotobyname,
4433 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004434#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004435 {"fromfd", socket_fromfd,
4436 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004437#endif
Dave Cole331708b2004-08-09 04:51:41 +00004438#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004439 {"socketpair", socket_socketpair,
4440 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004441#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004442 {"ntohs", socket_ntohs,
4443 METH_VARARGS, ntohs_doc},
4444 {"ntohl", socket_ntohl,
4445 METH_O, ntohl_doc},
4446 {"htons", socket_htons,
4447 METH_VARARGS, htons_doc},
4448 {"htonl", socket_htonl,
4449 METH_O, htonl_doc},
4450 {"inet_aton", socket_inet_aton,
4451 METH_VARARGS, inet_aton_doc},
4452 {"inet_ntoa", socket_inet_ntoa,
4453 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004454#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004455 {"inet_pton", socket_inet_pton,
4456 METH_VARARGS, inet_pton_doc},
4457 {"inet_ntop", socket_inet_ntop,
4458 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004459#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004460 {"getaddrinfo", socket_getaddrinfo,
4461 METH_VARARGS, getaddrinfo_doc},
4462 {"getnameinfo", socket_getnameinfo,
4463 METH_VARARGS, getnameinfo_doc},
4464 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4465 METH_NOARGS, getdefaulttimeout_doc},
4466 {"setdefaulttimeout", socket_setdefaulttimeout,
4467 METH_O, setdefaulttimeout_doc},
4468 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004469};
4470
Guido van Rossum30a685f1991-06-27 15:51:29 +00004471
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004472#ifdef RISCOS
4473#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004474
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004475static int
4476os_init(void)
4477{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004478 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004479
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004480 r.r[0] = 0;
4481 _kernel_swi(0x43380, &r, &r);
4482 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004483
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004484 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004485}
4486
4487#endif /* RISCOS */
4488
4489
4490#ifdef MS_WINDOWS
4491#define OS_INIT_DEFINED
4492
4493/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004494
4495static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004496os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004497{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004498 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004499}
4500
4501static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004502os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004503{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004504 WSADATA WSAData;
4505 int ret;
4506 char buf[100];
4507 ret = WSAStartup(0x0101, &WSAData);
4508 switch (ret) {
4509 case 0: /* No error */
4510 Py_AtExit(os_cleanup);
4511 return 1; /* Success */
4512 case WSASYSNOTREADY:
4513 PyErr_SetString(PyExc_ImportError,
4514 "WSAStartup failed: network not ready");
4515 break;
4516 case WSAVERNOTSUPPORTED:
4517 case WSAEINVAL:
4518 PyErr_SetString(
4519 PyExc_ImportError,
4520 "WSAStartup failed: requested version not supported");
4521 break;
4522 default:
4523 PyOS_snprintf(buf, sizeof(buf),
4524 "WSAStartup failed: error code %d", ret);
4525 PyErr_SetString(PyExc_ImportError, buf);
4526 break;
4527 }
4528 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004529}
4530
Guido van Rossum8d665e61996-06-26 18:22:49 +00004531#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004532
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004533
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004534#ifdef PYOS_OS2
4535#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004537/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004538
4539static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004540os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004541{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004542#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004543 char reason[64];
4544 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004545
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004546 if (rc == 0) {
4547 return 1; /* Success */
4548 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004549
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004550 PyOS_snprintf(reason, sizeof(reason),
4551 "OS/2 TCP/IP Error# %d", sock_errno());
4552 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004553
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004554 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004555#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004556 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004557 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004558#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004559}
4560
4561#endif /* PYOS_OS2 */
4562
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004563
4564#ifndef OS_INIT_DEFINED
4565static int
4566os_init(void)
4567{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004568 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004569}
4570#endif
4571
4572
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004573/* C API table - always add new things to the end for binary
4574 compatibility. */
4575static
4576PySocketModule_APIObject PySocketModuleAPI =
4577{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004578 &sock_type,
4579 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004580};
4581
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004582
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004583/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004584
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004585 This module is actually called "_socket", and there's a wrapper
4586 "socket.py" which implements some additional functionality. On some
4587 platforms (e.g. Windows and OS/2), socket.py also implements a
4588 wrapper for the socket type that provides missing functionality such
4589 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4590 with an ImportError exception if os-specific initialization fails.
4591 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004592 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004593 made at exit time.
4594*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004596PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004597"Implementation module for socket operations.\n\
4598\n\
4599See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004600
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004601PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004602init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004603{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004604 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004605
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004606 if (!os_init())
4607 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004608
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004609 Py_TYPE(&sock_type) = &PyType_Type;
4610 m = Py_InitModule3(PySocket_MODULE_NAME,
4611 socket_methods,
4612 socket_doc);
4613 if (m == NULL)
4614 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004615
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004616 socket_error = PyErr_NewException("socket.error",
4617 PyExc_IOError, NULL);
4618 if (socket_error == NULL)
4619 return;
4620 PySocketModuleAPI.error = socket_error;
4621 Py_INCREF(socket_error);
4622 PyModule_AddObject(m, "error", socket_error);
4623 socket_herror = PyErr_NewException("socket.herror",
4624 socket_error, NULL);
4625 if (socket_herror == NULL)
4626 return;
4627 Py_INCREF(socket_herror);
4628 PyModule_AddObject(m, "herror", socket_herror);
4629 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4630 NULL);
4631 if (socket_gaierror == NULL)
4632 return;
4633 Py_INCREF(socket_gaierror);
4634 PyModule_AddObject(m, "gaierror", socket_gaierror);
4635 socket_timeout = PyErr_NewException("socket.timeout",
4636 socket_error, NULL);
4637 if (socket_timeout == NULL)
4638 return;
4639 Py_INCREF(socket_timeout);
4640 PyModule_AddObject(m, "timeout", socket_timeout);
4641 Py_INCREF((PyObject *)&sock_type);
4642 if (PyModule_AddObject(m, "SocketType",
4643 (PyObject *)&sock_type) != 0)
4644 return;
4645 Py_INCREF((PyObject *)&sock_type);
4646 if (PyModule_AddObject(m, "socket",
4647 (PyObject *)&sock_type) != 0)
4648 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004649
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004650#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004651 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004652#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004653 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004654#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 Py_INCREF(has_ipv6);
4656 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004657
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004658 /* Export C API */
4659 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4660 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4661 ) != 0)
4662 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004663
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004664 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004665#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004666 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004667#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004668 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004669#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004670 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004671#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004672#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004673 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004674#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004675#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004676 /* Amateur Radio AX.25 */
4677 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004678#endif
4679#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004680 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004681#endif
4682#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004683 /* Appletalk DDP */
4684 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004685#endif
4686#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004687 /* Amateur radio NetROM */
4688 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004689#endif
4690#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004691 /* Multiprotocol bridge */
4692 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004693#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004694#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004695 /* ATM PVCs */
4696 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004697#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004698#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004699 /* Reserved for Werner's ATM */
4700 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004701#endif
4702#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004703 /* Reserved for X.25 project */
4704 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004705#endif
4706#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004707 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004708#endif
4709#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004710 /* Amateur Radio X.25 PLP */
4711 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004712#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004713#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004714 /* Reserved for DECnet project */
4715 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004716#endif
4717#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004718 /* Reserved for 802.2LLC project */
4719 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004720#endif
4721#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004722 /* Security callback pseudo AF */
4723 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004724#endif
4725#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004726 /* PF_KEY key management API */
4727 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004728#endif
4729#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004730 /* */
4731 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4732 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004733#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004734 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004735#endif
4736#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004737 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004738#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004739 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4740 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004741#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004743#endif
4744#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004745 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004746#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004747#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004748 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004749#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004750#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004751 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004752#endif
4753#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004754 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004755#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004756 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004757#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004758 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4759#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004760#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004761 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004762#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004763#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004764#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004765 /* Alias to emulate 4.4BSD */
4766 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004767#endif
4768#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004769 /* Ash */
4770 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004771#endif
4772#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004773 /* Acorn Econet */
4774 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004775#endif
4776#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004777 /* ATM SVCs */
4778 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004779#endif
4780#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004781 /* Linux SNA Project (nutters!) */
4782 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004783#endif
4784#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004785 /* IRDA sockets */
4786 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004787#endif
4788#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004789 /* PPPoX sockets */
4790 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004791#endif
4792#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004793 /* Wanpipe API Sockets */
4794 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004795#endif
4796#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004797 /* Linux LLC */
4798 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004799#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004800
Hye-Shik Chang81268602004-02-02 06:05:24 +00004801#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004802 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4803 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4804 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4805 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004806#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004807 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004808#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004809#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004810#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004811 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004812#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004813 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4814 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004815#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004816 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4817 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4818 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004819#endif
4820
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004821#ifdef AF_PACKET
4822 PyModule_AddIntMacro(m, AF_PACKET);
4823#endif
4824#ifdef PF_PACKET
4825 PyModule_AddIntMacro(m, PF_PACKET);
4826#endif
4827#ifdef PACKET_HOST
4828 PyModule_AddIntMacro(m, PACKET_HOST);
4829#endif
4830#ifdef PACKET_BROADCAST
4831 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4832#endif
4833#ifdef PACKET_MULTICAST
4834 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4835#endif
4836#ifdef PACKET_OTHERHOST
4837 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4838#endif
4839#ifdef PACKET_OUTGOING
4840 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4841#endif
4842#ifdef PACKET_LOOPBACK
4843 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4844#endif
4845#ifdef PACKET_FASTROUTE
4846 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004847#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004848
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004849#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004850 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004851
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004852 /* for addresses */
4853 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4854 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4855 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004856
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004857 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4858 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4859 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004860
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004861 /* for setsockopt() */
4862 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4863 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4864 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4865 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4866 TIPC_DEST_DROPPABLE);
4867 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004868
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004869 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4870 TIPC_LOW_IMPORTANCE);
4871 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4872 TIPC_MEDIUM_IMPORTANCE);
4873 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4874 TIPC_HIGH_IMPORTANCE);
4875 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4876 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004878 /* for subscriptions */
4879 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4880 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004881#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004882 /* doesn't seem to be available everywhere */
4883 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004884#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004885 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4886 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4887 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4888 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4889 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4890 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004891#endif
4892
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004893 /* Socket types */
4894 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4895 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004896#ifndef __BEOS__
4897/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004898 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4899 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004900#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004901 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004902#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004903#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004905#ifdef SO_DEBUG
4906 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004907#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908#ifdef SO_ACCEPTCONN
4909 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004910#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004911#ifdef SO_REUSEADDR
4912 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004913#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004914#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004916#endif
4917
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef SO_KEEPALIVE
4919 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004920#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921#ifdef SO_DONTROUTE
4922 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004923#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004924#ifdef SO_BROADCAST
4925 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927#ifdef SO_USELOOPBACK
4928 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004930#ifdef SO_LINGER
4931 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933#ifdef SO_OOBINLINE
4934 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004936#ifdef SO_REUSEPORT
4937 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004938#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004939#ifdef SO_SNDBUF
4940 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004941#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004942#ifdef SO_RCVBUF
4943 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004944#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004945#ifdef SO_SNDLOWAT
4946 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004947#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004948#ifdef SO_RCVLOWAT
4949 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004951#ifdef SO_SNDTIMEO
4952 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004954#ifdef SO_RCVTIMEO
4955 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004957#ifdef SO_ERROR
4958 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004959#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004960#ifdef SO_TYPE
4961 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004962#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004963#ifdef SO_SETFIB
4964 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4965#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004967 /* Maximum number of connections for "listen" */
4968#ifdef SOMAXCONN
4969 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004970#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004971 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004972#endif
4973
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004974 /* Flags for send, recv */
4975#ifdef MSG_OOB
4976 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef MSG_PEEK
4979 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef MSG_DONTROUTE
4982 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef MSG_DONTWAIT
4985 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef MSG_EOR
4988 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef MSG_TRUNC
4991 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef MSG_CTRUNC
4994 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004996#ifdef MSG_WAITALL
4997 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004998#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004999#ifdef MSG_BTAG
5000 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005001#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005002#ifdef MSG_ETAG
5003 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005004#endif
5005
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005006 /* Protocol level and numbers, usable for [gs]etsockopt */
5007#ifdef SOL_SOCKET
5008 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005009#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005010#ifdef SOL_IP
5011 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005012#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005014#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005015#ifdef SOL_IPX
5016 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005017#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005018#ifdef SOL_AX25
5019 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005020#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021#ifdef SOL_ATALK
5022 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005023#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005024#ifdef SOL_NETROM
5025 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005026#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005027#ifdef SOL_ROSE
5028 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005029#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005030#ifdef SOL_TCP
5031 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005032#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005034#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035#ifdef SOL_UDP
5036 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005037#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005038 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005039#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005040#ifdef IPPROTO_IP
5041 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005042#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005043 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005044#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005045#ifdef IPPROTO_HOPOPTS
5046 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005047#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048#ifdef IPPROTO_ICMP
5049 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005050#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005051 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005052#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005053#ifdef IPPROTO_IGMP
5054 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056#ifdef IPPROTO_GGP
5057 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005059#ifdef IPPROTO_IPV4
5060 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062#ifdef IPPROTO_IPV6
5063 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065#ifdef IPPROTO_IPIP
5066 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005067#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005068#ifdef IPPROTO_TCP
5069 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005070#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005071 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005072#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005073#ifdef IPPROTO_EGP
5074 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005075#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005076#ifdef IPPROTO_PUP
5077 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005078#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005079#ifdef IPPROTO_UDP
5080 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005081#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005082 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IPPROTO_IDP
5085 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IPPROTO_HELLO
5088 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IPPROTO_ND
5091 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IPPROTO_TP
5094 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IPPROTO_IPV6
5097 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IPPROTO_ROUTING
5100 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IPPROTO_FRAGMENT
5103 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IPPROTO_RSVP
5106 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IPPROTO_GRE
5109 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111#ifdef IPPROTO_ESP
5112 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005113#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005114#ifdef IPPROTO_AH
5115 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005116#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117#ifdef IPPROTO_MOBILE
5118 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005119#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005120#ifdef IPPROTO_ICMPV6
5121 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005122#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005123#ifdef IPPROTO_NONE
5124 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005125#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126#ifdef IPPROTO_DSTOPTS
5127 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005128#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129#ifdef IPPROTO_XTP
5130 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005131#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005132#ifdef IPPROTO_EON
5133 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005134#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005135#ifdef IPPROTO_PIM
5136 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005137#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005138#ifdef IPPROTO_IPCOMP
5139 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005140#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005141#ifdef IPPROTO_VRRP
5142 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005143#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005144#ifdef IPPROTO_BIP
5145 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005146#endif
5147/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148#ifdef IPPROTO_RAW
5149 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005150#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005151 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005152#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005153#ifdef IPPROTO_MAX
5154 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005155#endif
5156
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005157 /* Some port configuration */
5158#ifdef IPPORT_RESERVED
5159 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005160#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005162#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163#ifdef IPPORT_USERRESERVED
5164 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005165#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005166 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005167#endif
5168
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005169 /* Some reserved IP v.4 addresses */
5170#ifdef INADDR_ANY
5171 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005172#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005174#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175#ifdef INADDR_BROADCAST
5176 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005177#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005179#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005180#ifdef INADDR_LOOPBACK
5181 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005182#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005183 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005184#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185#ifdef INADDR_UNSPEC_GROUP
5186 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005187#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005189#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005190#ifdef INADDR_ALLHOSTS_GROUP
5191 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5192 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005193#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005195#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005196#ifdef INADDR_MAX_LOCAL_GROUP
5197 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5198 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005199#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005201#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005202#ifdef INADDR_NONE
5203 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005204#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005205 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005206#endif
5207
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005208 /* IPv4 [gs]etsockopt options */
5209#ifdef IP_OPTIONS
5210 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef IP_HDRINCL
5213 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215#ifdef IP_TOS
5216 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef IP_TTL
5219 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef IP_RECVOPTS
5222 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef IP_RECVRETOPTS
5225 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227#ifdef IP_RECVDSTADDR
5228 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005229#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005230#ifdef IP_RETOPTS
5231 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005232#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233#ifdef IP_MULTICAST_IF
5234 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef IP_MULTICAST_TTL
5237 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239#ifdef IP_MULTICAST_LOOP
5240 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005241#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005242#ifdef IP_ADD_MEMBERSHIP
5243 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005244#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005245#ifdef IP_DROP_MEMBERSHIP
5246 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005247#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005248#ifdef IP_DEFAULT_MULTICAST_TTL
5249 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5250 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005251#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005252#ifdef IP_DEFAULT_MULTICAST_LOOP
5253 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5254 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005255#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005256#ifdef IP_MAX_MEMBERSHIPS
5257 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005258#endif
5259
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005260 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5261#ifdef IPV6_JOIN_GROUP
5262 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005263#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264#ifdef IPV6_LEAVE_GROUP
5265 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005266#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267#ifdef IPV6_MULTICAST_HOPS
5268 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005269#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270#ifdef IPV6_MULTICAST_IF
5271 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005272#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273#ifdef IPV6_MULTICAST_LOOP
5274 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005275#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276#ifdef IPV6_UNICAST_HOPS
5277 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005278#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005280#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005281 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005282#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005283 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005284#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
5287#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
5290#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005292#endif
5293#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005295#endif
5296#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
5299#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005301#endif
5302#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#endif
5305#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005307#endif
5308#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005310#endif
5311#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005313#endif
5314#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005316#endif
5317#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005319#endif
5320#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005322#endif
5323#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005325#endif
5326#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005328#endif
5329#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005331#endif
5332#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005334#endif
5335#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005337#endif
5338#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005340#endif
5341#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005342 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005343#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005344
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005345 /* TCP options */
5346#ifdef TCP_NODELAY
5347 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005348#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349#ifdef TCP_MAXSEG
5350 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005351#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005352#ifdef TCP_CORK
5353 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005354#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005355#ifdef TCP_KEEPIDLE
5356 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005357#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005358#ifdef TCP_KEEPINTVL
5359 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005360#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005361#ifdef TCP_KEEPCNT
5362 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005363#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005364#ifdef TCP_SYNCNT
5365 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005366#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367#ifdef TCP_LINGER2
5368 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005369#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005370#ifdef TCP_DEFER_ACCEPT
5371 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005372#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373#ifdef TCP_WINDOW_CLAMP
5374 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005375#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005376#ifdef TCP_INFO
5377 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005378#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005379#ifdef TCP_QUICKACK
5380 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005381#endif
5382
Guido van Rossum09be4091999-08-09 14:40:40 +00005383
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005384 /* IPX options */
5385#ifdef IPX_TYPE
5386 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005387#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005389 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005390#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005391 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392#endif
5393#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005394 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005395#endif
5396#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005397 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398#endif
5399#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005401#endif
5402#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005404#endif
5405#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005406 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005407#endif
5408#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005410#endif
5411#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005412 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005414#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005415 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005416#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005417#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005418 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419#endif
5420#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005421 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005422#endif
5423#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005424 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005425#endif
5426#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005427 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428#endif
5429#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005430 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431#endif
5432#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005433 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005434#endif
5435#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005436 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005437#endif
5438#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005439 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
5441#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005442 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005443#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005444#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005445 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005446#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005447#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005448 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
5450#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005451 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005452#endif
5453#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005454 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#endif
5456#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005457 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#endif
5459#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005460 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005461#endif
5462#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005463 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005464#endif
5465#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005466 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005467#endif
5468#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005469 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005470#endif
5471#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005472 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005473#endif
5474#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005475 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005476#endif
5477#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005478 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005479#endif
5480#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005481 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482#endif
5483#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005484 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005485#endif
5486
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005487 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005488#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005489 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005490#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005491 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005492#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005493 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005494#endif
5495#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005496 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005497#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005498 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005499#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005500 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005501#endif
5502#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005503 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005504#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005505 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005506#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005507 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005508#endif
5509
Christian Heimes04ae9162008-01-04 15:23:30 +00005510#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005511 {
5512 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5513 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5514 int i;
5515 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5516 PyObject *tmp;
5517 tmp = PyLong_FromUnsignedLong(codes[i]);
5518 if (tmp == NULL)
5519 return;
5520 PyModule_AddObject(m, names[i], tmp);
5521 }
5522 }
5523 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5524 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5525 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005526#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005527 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005528#endif
5529#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005530 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005531#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005532#endif /* _MSTCPIP_ */
5533
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005534 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005535#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005536 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005537#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005538}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005539
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005540
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005541#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005542#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005543
5544/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005545/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005546
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005547int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005548inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005549{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005550 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005551#if (SIZEOF_INT != 4)
5552#error "Not sure if in_addr_t exists and int is not 32-bits."
5553#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005554 unsigned int packed_addr;
5555 packed_addr = inet_addr(src);
5556 if (packed_addr == INADDR_NONE)
5557 return 0;
5558 memcpy(dst, &packed_addr, 4);
5559 return 1;
5560 }
5561 /* Should set errno to EAFNOSUPPORT */
5562 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005563}
5564
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005565const char *
5566inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005567{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005568 if (af == AF_INET) {
5569 struct in_addr packed_addr;
5570 if (size < 16)
5571 /* Should set errno to ENOSPC. */
5572 return NULL;
5573 memcpy(&packed_addr, src, sizeof(packed_addr));
5574 return strncpy(dst, inet_ntoa(packed_addr), size);
5575 }
5576 /* Should set errno to EAFNOSUPPORT */
5577 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005578}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005579
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005580#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005581#endif