blob: 017a63e576111a4da2eeb073b107ab81be9381a6 [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 Heimes043d6f62008-01-07 17:19:16 +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 Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000050- an AF_PACKET socket address is a tuple containing a string
51 specifying the ethernet interface and an integer specifying
52 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000053 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000054 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000055- an AF_TIPC socket address is expressed as
56 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000058 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000060 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 if addr_type is TIPC_ADDR_NAME:
62 v1 is the server type
63 v2 is the port identifier
64 v3 is ignored
65 if addr_type is TIPC_ADDR_NAMESEQ:
66 v1 is the server type
67 v2 is the lower port number
68 v3 is the upper port number
69 if addr_type is TIPC_ADDR_ID:
70 v1 is the node
71 v2 is the ref
72 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000073
Guido van Rossum6574b3e1991-06-25 21:36:08 +000074
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000075Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000076
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000077- names starting with sock_ are socket object methods
78- names starting with socket_ are module-level functions
79- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000080
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081*/
82
Thomas Wouters477c8d52006-05-27 19:21:47 +000083#ifdef __APPLE__
84 /*
85 * inet_aton is not available on OSX 10.3, yet we want to use a binary
86 * that was build on 10.4 or later to work on that release, weak linking
87 * comes to the rescue.
88 */
89# pragma weak inet_aton
90#endif
91
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000092#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000093#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000094
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000095#undef MAX
96#define MAX(x, y) ((x) < (y) ? (y) : (x))
97
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000100"socket([family[, type[, proto]]]) -> socket object\n\
101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
107\n\
108A socket object represents one endpoint of a network connection.\n\
109\n\
110Methods of socket objects (keyword arguments not allowed):\n\
111\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000112_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113bind(addr) -- bind the socket to a local address\n\
114close() -- close the socket\n\
115connect(addr) -- connect the socket to a remote address\n\
116connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000117_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000118fileno() -- return underlying file descriptor\n\
119getpeername() -- return remote address [*]\n\
120getsockname() -- return local address\n\
121getsockopt(level, optname[, buflen]) -- get socket options\n\
122gettimeout() -- return timeout or None\n\
123listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000125recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000126recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000127recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000128 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000129sendall(data[, flags]) -- send all data\n\
130send(data[, flags]) -- send data, may not send all of it\n\
131sendto(data[, flags], addr) -- send data to a given address\n\
132setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
133setsockopt(level, optname, value) -- set socket options\n\
134settimeout(None | float) -- set or clear the timeout\n\
135shutdown(how) -- shut down traffic in one or both directions\n\
136\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000137 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000138
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000139/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000140 I hope some day someone can clean this up please... */
141
Guido van Rossum9376b741999-09-15 22:01:40 +0000142/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
143 script doesn't get this right, so we hardcode some platform checks below.
144 On the other hand, not all Linux versions agree, so there the settings
145 computed by the configure script are needed! */
146
147#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148# undef HAVE_GETHOSTBYNAME_R_3_ARG
149# undef HAVE_GETHOSTBYNAME_R_5_ARG
150# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000151#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000152
Guido van Rossum7a122991999-04-13 04:07:32 +0000153#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000155#endif
156
Guido van Rossume7de2061999-03-24 17:24:33 +0000157#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000158# if defined(_AIX) || defined(__osf__)
159# define HAVE_GETHOSTBYNAME_R_3_ARG
160# elif defined(__sun) || defined(__sgi)
161# define HAVE_GETHOSTBYNAME_R_5_ARG
162# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000163/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# else
165# undef HAVE_GETHOSTBYNAME_R
166# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000167#endif
168
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000169#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
170 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000172#endif
173
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000174/* To use __FreeBSD_version */
175#ifdef HAVE_SYS_PARAM_H
176#include <sys/param.h>
177#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000178/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000179 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000180#if defined(WITH_THREAD) && (defined(__APPLE__) || \
181 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000182 defined(__OpenBSD__) || defined(__NetBSD__) || \
183 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000184#define USE_GETADDRINFO_LOCK
185#endif
186
187#ifdef USE_GETADDRINFO_LOCK
188#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
189#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
190#else
191#define ACQUIRE_GETADDRINFO_LOCK
192#define RELEASE_GETADDRINFO_LOCK
193#endif
194
195#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000196# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000197#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000198
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000199#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000200# include <types.h>
201# include <io.h>
202# include <sys/ioctl.h>
203# include <utils.h>
204# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000205#endif
206
Martin v. Löwis9e437302002-12-06 12:57:26 +0000207#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000208# include <ioctl.h>
209#endif
210
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000211#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000212# define INCL_DOS
213# define INCL_DOSERRORS
214# define INCL_NOPMAPI
215# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000216#endif
217
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000218#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000219/* make sure that the reentrant (gethostbyaddr_r etc)
220 functions are declared correctly if compiling with
221 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000222
Thomas Wouters477c8d52006-05-27 19:21:47 +0000223/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000225#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000226#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000227
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000228#undef _XOPEN_SOURCE
229#include <sys/socket.h>
230#include <sys/types.h>
231#include <netinet/in.h>
232#ifdef _SS_ALIGNSIZE
233#define HAVE_GETADDRINFO 1
234#define HAVE_GETNAMEINFO 1
235#endif
236
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237#define HAVE_INET_PTON
238#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000239#endif
240
Thomas Wouters477c8d52006-05-27 19:21:47 +0000241/* Irix 6.5 fails to define this variable at all. This is needed
242 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000243 are just busted. Same thing for Solaris. */
244#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000245#define INET_ADDRSTRLEN 16
246#endif
247
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000249#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000250#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000253/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000255#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256
257/* Addressing includes */
258
Guido van Rossum6f489d91996-06-28 20:15:15 +0000259#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000260
261/* Non-MS WINDOWS includes */
262# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000263
Guido van Rossum9376b741999-09-15 22:01:40 +0000264/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000265# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000267typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000269# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000271
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000274#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277# ifdef HAVE_FCNTL_H
278# include <fcntl.h>
279# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000280
Jeremy Hylton22308652001-02-02 03:23:09 +0000281#endif
282
Skip Montanaro7befb992004-02-10 16:50:21 +0000283#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000284
285#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000287#endif
288
Neal Norwitz39d22e52002-11-02 19:55:21 +0000289#ifndef O_NONBLOCK
290# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000291#endif
292
Trent Micka708d6e2004-09-07 17:48:26 +0000293/* include Python's addrinfo.h unless it causes trouble */
294#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
295 /* Do not include addinfo.h on some newer IRIX versions.
296 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
297 * for example, but not by 6.5.10.
298 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000299#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000300 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
301 * EAI_* constants are defined in (the already included) ws2tcpip.h.
302 */
303#else
304# include "addrinfo.h"
305#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000306
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000307#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000308#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000309int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000310const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000311#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000312#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000313
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000314#ifdef __APPLE__
315/* On OS X, getaddrinfo returns no error indication of lookup
316 failure, so we must use the emulation instead of the libinfo
317 implementation. Unfortunately, performing an autoconf test
318 for this bug would require DNS access for the machine performing
319 the configuration, which is not acceptable. Therefore, we
320 determine the bug just by checking for __APPLE__. If this bug
321 gets ever fixed, perhaps checking for sys/version.h would be
322 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000323#ifndef HAVE_GETNAMEINFO
324/* This bug seems to be fixed in Jaguar. Ths easiest way I could
325 Find to check for Jaguar is that it has getnameinfo(), which
326 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000328#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000329
330#ifdef HAVE_INET_ATON
331#define USE_INET_ATON_WEAKLINK
332#endif
333
Jack Jansen84262fb2002-07-02 14:40:42 +0000334#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000336/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000338/* avoid clashes with the C library definition of the symbol. */
339#define getaddrinfo fake_getaddrinfo
340#define gai_strerror fake_gai_strerror
341#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000342#include "getaddrinfo.c"
343#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000346#include "getnameinfo.c"
347#endif
348
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000349#ifdef MS_WINDOWS
350/* On Windows a socket is really a handle not an fd */
351static SOCKET
352dup_socket(SOCKET handle)
353{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000354 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000355
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000356 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000358
359 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
360 FROM_PROTOCOL_INFO, &info, 0, 0);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000361}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000362#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000363#else
364/* On Unix we can use dup to duplicate the file descriptor of a socket*/
365#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000366#endif
367
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000368#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000369#define EAFNOSUPPORT WSAEAFNOSUPPORT
370#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000371#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000372
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000373#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000374#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000375#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000376#endif
377
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000378#ifndef SOCKETCLOSE
379#define SOCKETCLOSE close
380#endif
381
Jesse Noller32d68c22009-03-31 18:48:42 +0000382#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H) && !defined(__NetBSD__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000383#define USE_BLUETOOTH 1
384#if defined(__FreeBSD__)
385#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
386#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000388#define SOL_HCI SOL_HCI_RAW
389#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#define sockaddr_l2 sockaddr_l2cap
391#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000392#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000393#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
394#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000395#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000396#elif defined(__NetBSD__)
397#define sockaddr_l2 sockaddr_bt
398#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000399#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400#define sockaddr_sco sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000401#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
402#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000403#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000404#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000405#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000406#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
407#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000408#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
410#endif
411#endif
412
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000413#ifdef __VMS
414/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
415#define SEGMENT_SIZE (32 * 1024 -1)
416#endif
417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418#define SAS2SA(x) ((struct sockaddr *)(x))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419
Martin v. Löwise9416172003-05-03 10:12:45 +0000420/*
421 * Constants for getnameinfo()
422 */
423#if !defined(NI_MAXHOST)
424#define NI_MAXHOST 1025
425#endif
426#if !defined(NI_MAXSERV)
427#define NI_MAXSERV 32
428#endif
429
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000430#ifndef INVALID_SOCKET /* MS defines this */
431#define INVALID_SOCKET (-1)
432#endif
433
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000434/* XXX There's a problem here: *static* functions are not supposed to have
435 a Py prefix (or use CapitalizedWords). Later... */
436
Guido van Rossum30a685f1991-06-27 15:51:29 +0000437/* Global variable holding the exception type for errors detected
438 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000439static PyObject *socket_error;
440static PyObject *socket_herror;
441static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000442static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000443
Tim Peters643a7fc2002-02-17 04:13:21 +0000444/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000445 The sock_type variable contains pointers to various functions,
446 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000447 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000448static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000449
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000450#if defined(HAVE_POLL_H)
451#include <poll.h>
452#elif defined(HAVE_SYS_POLL_H)
453#include <sys/poll.h>
454#endif
455
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000456#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
457/* Platform can select file descriptors beyond FD_SETSIZE */
458#define IS_SELECTABLE(s) 1
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000459#elif defined(HAVE_POLL)
460/* Instead of select(), we'll use poll() since poll() works on any fd. */
461#define IS_SELECTABLE(s) 1
462/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000463#else
464/* POSIX says selecting file descriptors beyond FD_SETSIZE
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465 has undefined behaviour. If there's no timeout left, we don't have to
466 call select, so it's a safe, little white lie. */
467#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000469
470static PyObject*
471select_error(void)
472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 PyErr_SetString(socket_error, "unable to select on socket");
474 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000475}
476
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#ifdef MS_WINDOWS
478#define CHECK_ERRNO(expected) \
479 (WSAGetLastError() == WSA ## expected)
480#else
481#define CHECK_ERRNO(expected) \
482 (errno == expected)
483#endif
484
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485/* Convenience function to raise an error according to errno
486 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487
Guido van Rossum73624e91994-10-10 17:59:00 +0000488static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000489set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000491#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 int err_no = WSAGetLastError();
493 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
494 recognizes the error codes used by both GetLastError() and
495 WSAGetLastError */
496 if (err_no)
497 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000498#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000499
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000500#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 if (sock_errno() != NO_ERROR) {
502 APIRET rc;
503 ULONG msglen;
504 char outbuf[100];
505 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 /* Retrieve socket-related error message from MPTN.MSG file */
508 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
509 myerrorcode - SOCBASEERR + 26,
510 "mptn.msg",
511 &msglen);
512 if (rc == NO_ERROR) {
513 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 /* OS/2 doesn't guarantee a terminator */
516 outbuf[msglen] = '\0';
517 if (strlen(outbuf) > 0) {
518 /* If non-empty msg, trim CRLF */
519 char *lastc = &outbuf[ strlen(outbuf)-1 ];
520 while (lastc > outbuf &&
521 isspace(Py_CHARMASK(*lastc))) {
522 /* Trim trailing whitespace (CRLF) */
523 *lastc-- = '\0';
524 }
525 }
526 v = Py_BuildValue("(is)", myerrorcode, outbuf);
527 if (v != NULL) {
528 PyErr_SetObject(socket_error, v);
529 Py_DECREF(v);
530 }
531 return NULL;
532 }
533 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000534#endif
535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537}
538
Guido van Rossum30a685f1991-06-27 15:51:29 +0000539
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544
545#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 if (v != NULL) {
551 PyErr_SetObject(socket_herror, v);
552 Py_DECREF(v);
553 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556}
557
558
559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000560set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563
Martin v. Löwis272cb402002-03-01 08:31:07 +0000564#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 /* EAI_SYSTEM is not available on Windows XP. */
566 if (error == EAI_SYSTEM)
567 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000568#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000570#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000572#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 if (v != NULL) {
576 PyErr_SetObject(socket_gaierror, v);
577 Py_DECREF(v);
578 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581}
582
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000583#ifdef __VMS
584/* Function to send in segments */
585static int
586sendsegmented(int sock_fd, char *buf, int len, int flags)
587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 int n = 0;
589 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 while (remaining > 0) {
592 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
595 n = send(sock_fd, buf, segment, flags);
596 if (n < 0) {
597 return n;
598 }
599 remaining -= segment;
600 buf += segment;
601 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000604}
605#endif
606
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000607/* Function to perform the setting of socket blocking mode
608 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000609static int
610internal_setblocking(PySocketSockObject *s, int block)
611{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000614#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617#ifndef MS_WINDOWS
618#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 block = !block;
620 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000621#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 block = !block;
623 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000624#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
626 if (block)
627 delay_flag &= (~O_NONBLOCK);
628 else
629 delay_flag |= O_NONBLOCK;
630 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000631#endif /* !PYOS_OS2 */
632#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 block = !block;
634 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000635#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 /* Since these don't return anything */
639 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640}
641
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000642/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000643 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000644 This does not raise an exception; we'll let our caller do that
645 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000646 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000647static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000648internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* Nothing to do unless we're in timeout mode (not non-blocking) */
653 if (s->sock_timeout <= 0.0)
654 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Guard against closed socket */
657 if (s->sock_fd < 0)
658 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000659
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000660 /* Handling this condition here simplifies the select loops */
661 if (interval < 0.0)
662 return 1;
663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 /* Prefer poll, if available, since you can poll() any fd
665 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000666#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 {
668 struct pollfd pollfd;
669 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 pollfd.fd = s->sock_fd;
672 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000675 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 n = poll(&pollfd, 1, timeout);
677 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 {
680 /* Construct the arguments to select */
681 fd_set fds;
682 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000683 tv.tv_sec = (int)interval;
684 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 FD_ZERO(&fds);
686 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 /* See if the socket is ready */
689 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000690 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
691 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000693 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
694 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000696#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 if (n < 0)
699 return -1;
700 if (n == 0)
701 return 1;
702 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703}
704
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000705static int
706internal_select(PySocketSockObject *s, int writing)
707{
708 return internal_select_ex(s, writing, s->sock_timeout);
709}
710
711/*
712 Two macros for automatic retry of select() in case of false positives
713 (for example, select() could indicate a socket is ready for reading
714 but the data then discarded by the OS because of a wrong checksum).
715 Here is an example of use:
716
717 BEGIN_SELECT_LOOP(s)
718 Py_BEGIN_ALLOW_THREADS
719 timeout = internal_select_ex(s, 0, interval);
720 if (!timeout)
721 outlen = recv(s->sock_fd, cbuf, len, flags);
722 Py_END_ALLOW_THREADS
723 if (timeout == 1) {
724 PyErr_SetString(socket_timeout, "timed out");
725 return -1;
726 }
727 END_SELECT_LOOP(s)
728*/
729
730#define BEGIN_SELECT_LOOP(s) \
731 { \
732 _PyTime_timeval now, deadline = {0, 0}; \
733 double interval = s->sock_timeout; \
734 int has_timeout = s->sock_timeout > 0.0; \
735 if (has_timeout) { \
736 _PyTime_gettimeofday(&now); \
737 deadline = now; \
738 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
739 } \
740 while (1) { \
741 errno = 0; \
742
743#define END_SELECT_LOOP(s) \
744 if (!has_timeout || \
745 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
746 break; \
747 _PyTime_gettimeofday(&now); \
748 interval = _PyTime_INTERVAL(now, deadline); \
749 } \
750 } \
751
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000752/* Initialize a new socket object. */
753
Tim Petersa12b4cf2002-07-18 22:38:44 +0000754static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000755
Martin v. Löwis1a214512008-06-11 05:26:20 +0000756static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000757init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 s->sock_fd = fd;
761 s->sock_family = family;
762 s->sock_type = type;
763 s->sock_proto = proto;
764 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 if (defaulttimeout >= 0.0)
769 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000770
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000771}
772
773
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774/* Create a new socket object.
775 This just creates the object and initializes it.
776 If the creation fails, return NULL and set an exception (implicit
777 in NEWOBJ()). */
778
Guido van Rossum73624e91994-10-10 17:59:00 +0000779static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000780new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 PySocketSockObject *s;
783 s = (PySocketSockObject *)
784 PyType_GenericNew(&sock_type, NULL, NULL);
785 if (s != NULL)
786 init_sockobject(s, fd, family, type, proto);
787 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788}
789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790
Guido van Rossum48a680c2001-03-02 06:34:14 +0000791/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000792 thread to be in gethostbyname or getaddrinfo */
793#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
794PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000795#endif
796
797
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798/* Convert a string specifying a host name or one of a few symbolic
799 names to a numeric IP address. This usually calls gethostbyname()
800 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802 an error occurred; then an exception is raised. */
803
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000805setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 struct addrinfo hints, *res;
808 int error;
809 int d1, d2, d3, d4;
810 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
813 if (name[0] == '\0') {
814 int siz;
815 memset(&hints, 0, sizeof(hints));
816 hints.ai_family = af;
817 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
818 hints.ai_flags = AI_PASSIVE;
819 Py_BEGIN_ALLOW_THREADS
820 ACQUIRE_GETADDRINFO_LOCK
821 error = getaddrinfo(NULL, "0", &hints, &res);
822 Py_END_ALLOW_THREADS
823 /* We assume that those thread-unsafe getaddrinfo() versions
824 *are* safe regarding their return value, ie. that a
825 subsequent call to getaddrinfo() does not destroy the
826 outcome of the first call. */
827 RELEASE_GETADDRINFO_LOCK
828 if (error) {
829 set_gaierror(error);
830 return -1;
831 }
832 switch (res->ai_family) {
833 case AF_INET:
834 siz = 4;
835 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000836#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 case AF_INET6:
838 siz = 16;
839 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 default:
842 freeaddrinfo(res);
843 PyErr_SetString(socket_error,
844 "unsupported address family");
845 return -1;
846 }
847 if (res->ai_next) {
848 freeaddrinfo(res);
849 PyErr_SetString(socket_error,
850 "wildcard resolved to multiple address");
851 return -1;
852 }
853 if (res->ai_addrlen < addr_ret_size)
854 addr_ret_size = res->ai_addrlen;
855 memcpy(addr_ret, res->ai_addr, addr_ret_size);
856 freeaddrinfo(res);
857 return siz;
858 }
859 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
860 struct sockaddr_in *sin;
861 if (af != AF_INET && af != AF_UNSPEC) {
862 PyErr_SetString(socket_error,
863 "address family mismatched");
864 return -1;
865 }
866 sin = (struct sockaddr_in *)addr_ret;
867 memset((void *) sin, '\0', sizeof(*sin));
868 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000869#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 sin->sin_addr.s_addr = INADDR_BROADCAST;
873 return sizeof(sin->sin_addr);
874 }
875 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
876 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
877 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
878 struct sockaddr_in *sin;
879 sin = (struct sockaddr_in *)addr_ret;
880 sin->sin_addr.s_addr = htonl(
881 ((long) d1 << 24) | ((long) d2 << 16) |
882 ((long) d3 << 8) | ((long) d4 << 0));
883 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000884#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 return 4;
888 }
889 memset(&hints, 0, sizeof(hints));
890 hints.ai_family = af;
891 Py_BEGIN_ALLOW_THREADS
892 ACQUIRE_GETADDRINFO_LOCK
893 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000894#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 if (error == EAI_NONAME && af == AF_UNSPEC) {
896 /* On Tru64 V5.1, numeric-to-addr conversion fails
897 if no address family is given. Assume IPv4 for now.*/
898 hints.ai_family = AF_INET;
899 error = getaddrinfo(name, NULL, &hints, &res);
900 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 Py_END_ALLOW_THREADS
903 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
904 if (error) {
905 set_gaierror(error);
906 return -1;
907 }
908 if (res->ai_addrlen < addr_ret_size)
909 addr_ret_size = res->ai_addrlen;
910 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
911 freeaddrinfo(res);
912 switch (addr_ret->sa_family) {
913 case AF_INET:
914 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000915#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 case AF_INET6:
917 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 default:
920 PyErr_SetString(socket_error, "unknown address family");
921 return -1;
922 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000923}
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926/* Create a string object representing an IP address.
927 This is always a string of the form 'dd.dd.dd.dd' (with variable
928 size numbers). */
929
Guido van Rossum73624e91994-10-10 17:59:00 +0000930static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 char buf[NI_MAXHOST];
934 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
937 NI_NUMERICHOST);
938 if (error) {
939 set_gaierror(error);
940 return NULL;
941 }
942 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000943}
944
945
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000946#ifdef USE_BLUETOOTH
947/* Convert a string representation of a Bluetooth address into a numeric
948 address. Returns the length (6), or raises an exception and returns -1 if
949 an error occurred. */
950
951static int
952setbdaddr(char *name, bdaddr_t *bdaddr)
953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 unsigned int b0, b1, b2, b3, b4, b5;
955 char ch;
956 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
959 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
960 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
961 bdaddr->b[0] = b0;
962 bdaddr->b[1] = b1;
963 bdaddr->b[2] = b2;
964 bdaddr->b[3] = b3;
965 bdaddr->b[4] = b4;
966 bdaddr->b[5] = b5;
967 return 6;
968 } else {
969 PyErr_SetString(socket_error, "bad bluetooth address");
970 return -1;
971 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000972}
973
974/* Create a string representation of the Bluetooth address. This is always a
975 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
976 value (zero padded if necessary). */
977
978static PyObject *
979makebdaddr(bdaddr_t *bdaddr)
980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
984 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
985 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
986 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000987}
988#endif
989
990
Guido van Rossum30a685f1991-06-27 15:51:29 +0000991/* Create an object representing the given socket address,
992 suitable for passing it back to bind(), connect() etc.
993 The family field of the sockaddr structure is inspected
994 to determine what kind of address it really is. */
995
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000996/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000997static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000998makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 if (addrlen == 0) {
1001 /* No address -- may be recvfrom() from known socket */
1002 Py_INCREF(Py_None);
1003 return Py_None;
1004 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 case AF_INET:
1009 {
1010 struct sockaddr_in *a;
1011 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1012 PyObject *ret = NULL;
1013 if (addrobj) {
1014 a = (struct sockaddr_in *)addr;
1015 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1016 Py_DECREF(addrobj);
1017 }
1018 return ret;
1019 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001020
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001021#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 case AF_UNIX:
1023 {
1024 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001025#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1027 addrlen -= offsetof(struct sockaddr_un, sun_path);
1028 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1029 }
1030 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001031#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 {
1033 /* regular NULL-terminated string */
1034 return PyUnicode_FromString(a->sun_path);
1035 }
1036 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001037#endif /* AF_UNIX */
1038
Martin v. Löwis11017b12006-01-14 18:12:57 +00001039#if defined(AF_NETLINK)
1040 case AF_NETLINK:
1041 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1043 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001044 }
1045#endif /* AF_NETLINK */
1046
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001047#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 case AF_INET6:
1049 {
1050 struct sockaddr_in6 *a;
1051 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1052 PyObject *ret = NULL;
1053 if (addrobj) {
1054 a = (struct sockaddr_in6 *)addr;
1055 ret = Py_BuildValue("Oiii",
1056 addrobj,
1057 ntohs(a->sin6_port),
1058 a->sin6_flowinfo,
1059 a->sin6_scope_id);
1060 Py_DECREF(addrobj);
1061 }
1062 return ret;
1063 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001064#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001065
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001066#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 case AF_BLUETOOTH:
1068 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 case BTPROTO_L2CAP:
1071 {
1072 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1073 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1074 PyObject *ret = NULL;
1075 if (addrobj) {
1076 ret = Py_BuildValue("Oi",
1077 addrobj,
1078 _BT_L2_MEMB(a, psm));
1079 Py_DECREF(addrobj);
1080 }
1081 return ret;
1082 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 case BTPROTO_RFCOMM:
1085 {
1086 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1087 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1088 PyObject *ret = NULL;
1089 if (addrobj) {
1090 ret = Py_BuildValue("Oi",
1091 addrobj,
1092 _BT_RC_MEMB(a, channel));
1093 Py_DECREF(addrobj);
1094 }
1095 return ret;
1096 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case BTPROTO_HCI:
1099 {
1100 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
1101 PyObject *ret = NULL;
1102 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1103 return ret;
1104 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001105
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001106#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 case BTPROTO_SCO:
1108 {
1109 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1110 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1111 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001112#endif
1113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 default:
1115 PyErr_SetString(PyExc_ValueError,
1116 "Unknown Bluetooth protocol");
1117 return NULL;
1118 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001119#endif
1120
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001121#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 case AF_PACKET:
1123 {
1124 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1125 char *ifname = "";
1126 struct ifreq ifr;
1127 /* need to look up interface name give index */
1128 if (a->sll_ifindex) {
1129 ifr.ifr_ifindex = a->sll_ifindex;
1130 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1131 ifname = ifr.ifr_name;
1132 }
1133 return Py_BuildValue("shbhy#",
1134 ifname,
1135 ntohs(a->sll_protocol),
1136 a->sll_pkttype,
1137 a->sll_hatype,
1138 a->sll_addr,
1139 a->sll_halen);
1140 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001141#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001142
Christian Heimes043d6f62008-01-07 17:19:16 +00001143#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 case AF_TIPC:
1145 {
1146 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1147 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1148 return Py_BuildValue("IIIII",
1149 a->addrtype,
1150 a->addr.nameseq.type,
1151 a->addr.nameseq.lower,
1152 a->addr.nameseq.upper,
1153 a->scope);
1154 } else if (a->addrtype == TIPC_ADDR_NAME) {
1155 return Py_BuildValue("IIIII",
1156 a->addrtype,
1157 a->addr.name.name.type,
1158 a->addr.name.name.instance,
1159 a->addr.name.name.instance,
1160 a->scope);
1161 } else if (a->addrtype == TIPC_ADDR_ID) {
1162 return Py_BuildValue("IIIII",
1163 a->addrtype,
1164 a->addr.id.node,
1165 a->addr.id.ref,
1166 0,
1167 a->scope);
1168 } else {
1169 PyErr_SetString(PyExc_ValueError,
1170 "Invalid address type");
1171 return NULL;
1172 }
1173 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001174#endif
1175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 default:
1179 /* If we don't know the address family, don't raise an
1180 exception -- return it as an (int, bytes) tuple. */
1181 return Py_BuildValue("iy#",
1182 addr->sa_family,
1183 addr->sa_data,
1184 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001187}
1188
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189
1190/* Parse a socket address argument according to the socket object's
1191 address family. Return 1 if the address was in the proper format,
1192 0 of not. The address is returned through addr_ret, its length
1193 through len_ret. */
1194
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001196getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001200
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001201#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 case AF_UNIX:
1203 {
1204 struct sockaddr_un* addr;
1205 char *path;
1206 int len;
1207 if (!PyArg_Parse(args, "s#", &path, &len))
1208 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001211#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 if (len > 0 && path[0] == 0) {
1213 /* Linux abstract namespace extension */
1214 if (len > sizeof addr->sun_path) {
1215 PyErr_SetString(socket_error,
1216 "AF_UNIX path too long");
1217 return 0;
1218 }
1219 }
1220 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001221#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 {
1223 /* regular NULL-terminated string */
1224 if (len >= sizeof addr->sun_path) {
1225 PyErr_SetString(socket_error,
1226 "AF_UNIX path too long");
1227 return 0;
1228 }
1229 addr->sun_path[len] = 0;
1230 }
1231 addr->sun_family = s->sock_family;
1232 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001233#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001235#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 return 1;
1239 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001240#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001241
Martin v. Löwis11017b12006-01-14 18:12:57 +00001242#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 case AF_NETLINK:
1244 {
1245 struct sockaddr_nl* addr;
1246 int pid, groups;
1247 addr = (struct sockaddr_nl *)addr_ret;
1248 if (!PyTuple_Check(args)) {
1249 PyErr_Format(
1250 PyExc_TypeError,
1251 "getsockaddrarg: "
1252 "AF_NETLINK address must be tuple, not %.500s",
1253 Py_TYPE(args)->tp_name);
1254 return 0;
1255 }
1256 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1257 return 0;
1258 addr->nl_family = AF_NETLINK;
1259 addr->nl_pid = pid;
1260 addr->nl_groups = groups;
1261 *len_ret = sizeof(*addr);
1262 return 1;
1263 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001264#endif
1265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 case AF_INET:
1267 {
1268 struct sockaddr_in* addr;
1269 char *host;
1270 int port, result;
1271 if (!PyTuple_Check(args)) {
1272 PyErr_Format(
1273 PyExc_TypeError,
1274 "getsockaddrarg: "
1275 "AF_INET address must be tuple, not %.500s",
1276 Py_TYPE(args)->tp_name);
1277 return 0;
1278 }
1279 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1280 "idna", &host, &port))
1281 return 0;
1282 addr=(struct sockaddr_in*)addr_ret;
1283 result = setipaddr(host, (struct sockaddr *)addr,
1284 sizeof(*addr), AF_INET);
1285 PyMem_Free(host);
1286 if (result < 0)
1287 return 0;
1288 if (port < 0 || port > 0xffff) {
1289 PyErr_SetString(
1290 PyExc_OverflowError,
1291 "getsockaddrarg: port must be 0-65535.");
1292 return 0;
1293 }
1294 addr->sin_family = AF_INET;
1295 addr->sin_port = htons((short)port);
1296 *len_ret = sizeof *addr;
1297 return 1;
1298 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001300#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 case AF_INET6:
1302 {
1303 struct sockaddr_in6* addr;
1304 char *host;
1305 int port, flowinfo, scope_id, result;
1306 flowinfo = scope_id = 0;
1307 if (!PyTuple_Check(args)) {
1308 PyErr_Format(
1309 PyExc_TypeError,
1310 "getsockaddrarg: "
1311 "AF_INET6 address must be tuple, not %.500s",
1312 Py_TYPE(args)->tp_name);
1313 return 0;
1314 }
1315 if (!PyArg_ParseTuple(args, "eti|ii",
1316 "idna", &host, &port, &flowinfo,
1317 &scope_id)) {
1318 return 0;
1319 }
1320 addr = (struct sockaddr_in6*)addr_ret;
1321 result = setipaddr(host, (struct sockaddr *)addr,
1322 sizeof(*addr), AF_INET6);
1323 PyMem_Free(host);
1324 if (result < 0)
1325 return 0;
1326 if (port < 0 || port > 0xffff) {
1327 PyErr_SetString(
1328 PyExc_OverflowError,
1329 "getsockaddrarg: port must be 0-65535.");
1330 return 0;
1331 }
1332 addr->sin6_family = s->sock_family;
1333 addr->sin6_port = htons((short)port);
1334 addr->sin6_flowinfo = flowinfo;
1335 addr->sin6_scope_id = scope_id;
1336 *len_ret = sizeof *addr;
1337 return 1;
1338 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001339#endif
1340
Hye-Shik Chang81268602004-02-02 06:05:24 +00001341#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 case AF_BLUETOOTH:
1343 {
1344 switch (s->sock_proto) {
1345 case BTPROTO_L2CAP:
1346 {
1347 struct sockaddr_l2 *addr;
1348 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 addr = (struct sockaddr_l2 *)addr_ret;
1351 memset(addr, 0, sizeof(struct sockaddr_l2));
1352 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1353 if (!PyArg_ParseTuple(args, "si", &straddr,
1354 &_BT_L2_MEMB(addr, psm))) {
1355 PyErr_SetString(socket_error, "getsockaddrarg: "
1356 "wrong format");
1357 return 0;
1358 }
1359 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1360 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 *len_ret = sizeof *addr;
1363 return 1;
1364 }
1365 case BTPROTO_RFCOMM:
1366 {
1367 struct sockaddr_rc *addr;
1368 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 addr = (struct sockaddr_rc *)addr_ret;
1371 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1372 if (!PyArg_ParseTuple(args, "si", &straddr,
1373 &_BT_RC_MEMB(addr, channel))) {
1374 PyErr_SetString(socket_error, "getsockaddrarg: "
1375 "wrong format");
1376 return 0;
1377 }
1378 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1379 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 *len_ret = sizeof *addr;
1382 return 1;
1383 }
1384 case BTPROTO_HCI:
1385 {
1386 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
1387 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1388 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1389 PyErr_SetString(socket_error, "getsockaddrarg: "
1390 "wrong format");
1391 return 0;
1392 }
1393 *len_ret = sizeof *addr;
1394 return 1;
1395 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001396#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 case BTPROTO_SCO:
1398 {
1399 struct sockaddr_sco *addr;
1400 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 addr = (struct sockaddr_sco *)addr_ret;
1403 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1404 if (!PyBytes_Check(args)) {
1405 PyErr_SetString(socket_error, "getsockaddrarg: "
1406 "wrong format");
1407 return 0;
1408 }
1409 straddr = PyBytes_AS_STRING(args);
1410 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1411 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 *len_ret = sizeof *addr;
1414 return 1;
1415 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 default:
1418 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1419 return 0;
1420 }
1421 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001422#endif
1423
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001424#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 case AF_PACKET:
1426 {
1427 struct sockaddr_ll* addr;
1428 struct ifreq ifr;
1429 char *interfaceName;
1430 int protoNumber;
1431 int hatype = 0;
1432 int pkttype = 0;
1433 char *haddr = NULL;
1434 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 if (!PyTuple_Check(args)) {
1437 PyErr_Format(
1438 PyExc_TypeError,
1439 "getsockaddrarg: "
1440 "AF_PACKET address must be tuple, not %.500s",
1441 Py_TYPE(args)->tp_name);
1442 return 0;
1443 }
1444 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1445 &protoNumber, &pkttype, &hatype,
1446 &haddr, &halen))
1447 return 0;
1448 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1449 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1450 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1451 s->errorhandler();
1452 return 0;
1453 }
1454 if (halen > 8) {
1455 PyErr_SetString(PyExc_ValueError,
1456 "Hardware address must be 8 bytes or less");
1457 return 0;
1458 }
1459 if (protoNumber < 0 || protoNumber > 0xffff) {
1460 PyErr_SetString(
1461 PyExc_OverflowError,
1462 "getsockaddrarg: protoNumber must be 0-65535.");
1463 return 0;
1464 }
1465 addr = (struct sockaddr_ll*)addr_ret;
1466 addr->sll_family = AF_PACKET;
1467 addr->sll_protocol = htons((short)protoNumber);
1468 addr->sll_ifindex = ifr.ifr_ifindex;
1469 addr->sll_pkttype = pkttype;
1470 addr->sll_hatype = hatype;
1471 if (halen != 0) {
1472 memcpy(&addr->sll_addr, haddr, halen);
1473 }
1474 addr->sll_halen = halen;
1475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001478#endif
1479
Christian Heimes043d6f62008-01-07 17:19:16 +00001480#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 case AF_TIPC:
1482 {
1483 unsigned int atype, v1, v2, v3;
1484 unsigned int scope = TIPC_CLUSTER_SCOPE;
1485 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 if (!PyTuple_Check(args)) {
1488 PyErr_Format(
1489 PyExc_TypeError,
1490 "getsockaddrarg: "
1491 "AF_TIPC address must be tuple, not %.500s",
1492 Py_TYPE(args)->tp_name);
1493 return 0;
1494 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 if (!PyArg_ParseTuple(args,
1497 "IIII|I;Invalid TIPC address format",
1498 &atype, &v1, &v2, &v3, &scope))
1499 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 addr = (struct sockaddr_tipc *) addr_ret;
1502 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 addr->family = AF_TIPC;
1505 addr->scope = scope;
1506 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 if (atype == TIPC_ADDR_NAMESEQ) {
1509 addr->addr.nameseq.type = v1;
1510 addr->addr.nameseq.lower = v2;
1511 addr->addr.nameseq.upper = v3;
1512 } else if (atype == TIPC_ADDR_NAME) {
1513 addr->addr.name.name.type = v1;
1514 addr->addr.name.name.instance = v2;
1515 } else if (atype == TIPC_ADDR_ID) {
1516 addr->addr.id.node = v1;
1517 addr->addr.id.ref = v2;
1518 } else {
1519 /* Shouldn't happen */
1520 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1521 return 0;
1522 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 return 1;
1527 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001528#endif
1529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 default:
1533 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1534 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001537}
1538
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539
Guido van Rossum48a680c2001-03-02 06:34:14 +00001540/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001541 Return 1 if the family is known, 0 otherwise. The length is returned
1542 through len_ret. */
1543
1544static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001545getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001548
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001549#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 case AF_UNIX:
1551 {
1552 *len_ret = sizeof (struct sockaddr_un);
1553 return 1;
1554 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001555#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001556#if defined(AF_NETLINK)
1557 case AF_NETLINK:
1558 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 *len_ret = sizeof (struct sockaddr_nl);
1560 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001561 }
1562#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 case AF_INET:
1565 {
1566 *len_ret = sizeof (struct sockaddr_in);
1567 return 1;
1568 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001569
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001570#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 case AF_INET6:
1572 {
1573 *len_ret = sizeof (struct sockaddr_in6);
1574 return 1;
1575 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001576#endif
1577
Hye-Shik Chang81268602004-02-02 06:05:24 +00001578#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 case AF_BLUETOOTH:
1580 {
1581 switch(s->sock_proto)
1582 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 case BTPROTO_L2CAP:
1585 *len_ret = sizeof (struct sockaddr_l2);
1586 return 1;
1587 case BTPROTO_RFCOMM:
1588 *len_ret = sizeof (struct sockaddr_rc);
1589 return 1;
1590 case BTPROTO_HCI:
1591 *len_ret = sizeof (struct sockaddr_hci);
1592 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001593#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 case BTPROTO_SCO:
1595 *len_ret = sizeof (struct sockaddr_sco);
1596 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 default:
1599 PyErr_SetString(socket_error, "getsockaddrlen: "
1600 "unknown BT protocol");
1601 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 }
1604 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001605#endif
1606
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001607#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 case AF_PACKET:
1609 {
1610 *len_ret = sizeof (struct sockaddr_ll);
1611 return 1;
1612 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001613#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001614
Christian Heimes043d6f62008-01-07 17:19:16 +00001615#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 case AF_TIPC:
1617 {
1618 *len_ret = sizeof (struct sockaddr_tipc);
1619 return 1;
1620 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001621#endif
1622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 default:
1626 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1627 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001630}
1631
1632
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001633/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001634
Guido van Rossum73624e91994-10-10 17:59:00 +00001635static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001636sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 sock_addr_t addrbuf;
1639 SOCKET_T newfd = INVALID_SOCKET;
1640 socklen_t addrlen;
1641 PyObject *sock = NULL;
1642 PyObject *addr = NULL;
1643 PyObject *res = NULL;
1644 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 if (!getsockaddrlen(s, &addrlen))
1647 return NULL;
1648 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 if (!IS_SELECTABLE(s))
1651 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001652
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001653 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001655 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 if (!timeout)
1657 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1658 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 if (timeout == 1) {
1661 PyErr_SetString(socket_timeout, "timed out");
1662 return NULL;
1663 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001664 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 if (newfd == INVALID_SOCKET)
1667 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 sock = PyLong_FromSocket_t(newfd);
1670 if (sock == NULL) {
1671 SOCKETCLOSE(newfd);
1672 goto finally;
1673 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1676 addrlen, s->sock_proto);
1677 if (addr == NULL)
1678 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001681
Guido van Rossum67f7a382002-06-06 21:08:16 +00001682finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 Py_XDECREF(sock);
1684 Py_XDECREF(addr);
1685 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001686}
1687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001688PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001689"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001690\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001691Wait for an incoming connection. Return a new socket file descriptor\n\
1692representing the connection, and the address of the client.\n\
1693For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001694
Guido van Rossum11ba0942002-06-13 15:07:44 +00001695/* s.setblocking(flag) method. Argument:
1696 False -- non-blocking mode; same as settimeout(0)
1697 True -- blocking mode; same as settimeout(None)
1698*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001699
Guido van Rossum73624e91994-10-10 17:59:00 +00001700static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001701sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 block = PyLong_AsLong(arg);
1706 if (block == -1 && PyErr_Occurred())
1707 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 s->sock_timeout = block ? -1.0 : 0.0;
1710 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 Py_INCREF(Py_None);
1713 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001714}
Guido van Rossume4485b01994-09-07 14:32:49 +00001715
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001716PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001717"setblocking(flag)\n\
1718\n\
1719Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001720setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001721setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001722
Guido van Rossum11ba0942002-06-13 15:07:44 +00001723/* s.settimeout(timeout) method. Argument:
1724 None -- no timeout, blocking mode; same as setblocking(True)
1725 0.0 -- non-blocking mode; same as setblocking(False)
1726 > 0 -- timeout mode; operations time out after timeout seconds
1727 < 0 -- illegal; raises an exception
1728*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001729static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001730sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 if (arg == Py_None)
1735 timeout = -1.0;
1736 else {
1737 timeout = PyFloat_AsDouble(arg);
1738 if (timeout < 0.0) {
1739 if (!PyErr_Occurred())
1740 PyErr_SetString(PyExc_ValueError,
1741 "Timeout value out of range");
1742 return NULL;
1743 }
1744 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 s->sock_timeout = timeout;
1747 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 Py_INCREF(Py_None);
1750 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001751}
1752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001753PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001754"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001756Set a timeout on socket operations. 'timeout' can be a float,\n\
1757giving in seconds, or None. Setting a timeout of None disables\n\
1758the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001759Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001760
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001761/* s.gettimeout() method.
1762 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001763static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001764sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 if (s->sock_timeout < 0.0) {
1767 Py_INCREF(Py_None);
1768 return Py_None;
1769 }
1770 else
1771 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001772}
1773
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001774PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001775"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001776\n\
1777Returns the timeout in floating seconds associated with socket \n\
1778operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001779operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001780
Guido van Rossumaee08791992-09-08 09:05:33 +00001781/* s.setsockopt() method.
1782 With an integer third argument, sets an integer option.
1783 With a string third argument, sets an option from a buffer;
1784 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001785
Guido van Rossum73624e91994-10-10 17:59:00 +00001786static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001787sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 int level;
1790 int optname;
1791 int res;
1792 char *buf;
1793 int buflen;
1794 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 if (PyArg_ParseTuple(args, "iii:setsockopt",
1797 &level, &optname, &flag)) {
1798 buf = (char *) &flag;
1799 buflen = sizeof flag;
1800 }
1801 else {
1802 PyErr_Clear();
1803 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
1804 &level, &optname, &buf, &buflen))
1805 return NULL;
1806 }
1807 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1808 if (res < 0)
1809 return s->errorhandler();
1810 Py_INCREF(Py_None);
1811 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001812}
1813
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001814PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001815"setsockopt(level, option, value)\n\
1816\n\
1817Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001818The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001819
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001820
Guido van Rossumaee08791992-09-08 09:05:33 +00001821/* s.getsockopt() method.
1822 With two arguments, retrieves an integer option.
1823 With a third integer argument, retrieves a string buffer of that size;
1824 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001825
Guido van Rossum73624e91994-10-10 17:59:00 +00001826static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001827sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 int level;
1830 int optname;
1831 int res;
1832 PyObject *buf;
1833 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1836 &level, &optname, &buflen))
1837 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 if (buflen == 0) {
1840 int flag = 0;
1841 socklen_t flagsize = sizeof flag;
1842 res = getsockopt(s->sock_fd, level, optname,
1843 (void *)&flag, &flagsize);
1844 if (res < 0)
1845 return s->errorhandler();
1846 return PyLong_FromLong(flag);
1847 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001848#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 /* socklen_t is unsigned so no negative test is needed,
1850 test buflen == 0 is previously done */
1851 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001852#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 PyErr_SetString(socket_error,
1856 "getsockopt buflen out of range");
1857 return NULL;
1858 }
1859 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
1860 if (buf == NULL)
1861 return NULL;
1862 res = getsockopt(s->sock_fd, level, optname,
1863 (void *)PyBytes_AS_STRING(buf), &buflen);
1864 if (res < 0) {
1865 Py_DECREF(buf);
1866 return s->errorhandler();
1867 }
1868 _PyBytes_Resize(&buf, buflen);
1869 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001870}
1871
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001872PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001873"getsockopt(level, option[, buffersize]) -> value\n\
1874\n\
1875Get a socket option. See the Unix manual for level and option.\n\
1876If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001877string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001878
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001879
Fred Drake728819a2000-07-01 03:40:12 +00001880/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001881
Guido van Rossum73624e91994-10-10 17:59:00 +00001882static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001883sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 sock_addr_t addrbuf;
1886 int addrlen;
1887 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1890 return NULL;
1891 Py_BEGIN_ALLOW_THREADS
1892 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1893 Py_END_ALLOW_THREADS
1894 if (res < 0)
1895 return s->errorhandler();
1896 Py_INCREF(Py_None);
1897 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001898}
1899
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001900PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001901"bind(address)\n\
1902\n\
1903Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001904pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001905sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001906
Guido van Rossum30a685f1991-06-27 15:51:29 +00001907
1908/* s.close() method.
1909 Set the file descriptor to -1 so operations tried subsequently
1910 will surely fail. */
1911
Guido van Rossum73624e91994-10-10 17:59:00 +00001912static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001913sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 if ((fd = s->sock_fd) != -1) {
1918 s->sock_fd = -1;
1919 Py_BEGIN_ALLOW_THREADS
1920 (void) SOCKETCLOSE(fd);
1921 Py_END_ALLOW_THREADS
1922 }
1923 Py_INCREF(Py_None);
1924 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001925}
1926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001927PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001928"close()\n\
1929\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001930Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001931
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001932static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001933sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001934{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001935 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001936 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001937 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001938}
1939
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001940PyDoc_STRVAR(detach_doc,
1941"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001942\n\
1943Close the socket object without closing the underlying file descriptor.\
1944The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001945can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001946
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001947static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001948internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 timeout = 0;
1954 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001955
1956#ifdef MS_WINDOWS
1957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 if (s->sock_timeout > 0.0) {
1959 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1960 IS_SELECTABLE(s)) {
1961 /* This is a mess. Best solution: trust select */
1962 fd_set fds;
1963 fd_set fds_exc;
1964 struct timeval tv;
1965 tv.tv_sec = (int)s->sock_timeout;
1966 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1967 FD_ZERO(&fds);
1968 FD_SET(s->sock_fd, &fds);
1969 FD_ZERO(&fds_exc);
1970 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00001971 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
1972 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 if (res == 0) {
1974 res = WSAEWOULDBLOCK;
1975 timeout = 1;
1976 } else if (res > 0) {
1977 if (FD_ISSET(s->sock_fd, &fds))
1978 /* The socket is in the writable set - this
1979 means connected */
1980 res = 0;
1981 else {
1982 /* As per MS docs, we need to call getsockopt()
1983 to get the underlying error */
1984 int res_size = sizeof res;
1985 /* It must be in the exception set */
1986 assert(FD_ISSET(s->sock_fd, &fds_exc));
1987 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1988 (char *)&res, &res_size))
1989 /* getsockopt also clears WSAGetLastError,
1990 so reset it back. */
1991 WSASetLastError(res);
1992 else
1993 res = WSAGetLastError();
1994 }
1995 }
1996 /* else if (res < 0) an error occurred */
1997 }
1998 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 if (res < 0)
2001 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002002
2003#else
2004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 if (s->sock_timeout > 0.0) {
2006 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2007 timeout = internal_select(s, 1);
2008 if (timeout == 0) {
2009 /* Bug #1019808: in case of an EINPROGRESS,
2010 use getsockopt(SO_ERROR) to get the real
2011 error. */
2012 socklen_t res_size = sizeof res;
2013 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2014 SO_ERROR, &res, &res_size);
2015 if (res == EISCONN)
2016 res = 0;
2017 errno = res;
2018 }
2019 else if (timeout == -1) {
2020 res = errno; /* had error */
2021 }
2022 else
2023 res = EWOULDBLOCK; /* timed out */
2024 }
2025 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 if (res < 0)
2028 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002029
2030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002034}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002035
Fred Drake728819a2000-07-01 03:40:12 +00002036/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002037
Guido van Rossum73624e91994-10-10 17:59:00 +00002038static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002039sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 sock_addr_t addrbuf;
2042 int addrlen;
2043 int res;
2044 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2047 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 Py_BEGIN_ALLOW_THREADS
2050 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2051 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (timeout == 1) {
2054 PyErr_SetString(socket_timeout, "timed out");
2055 return NULL;
2056 }
2057 if (res != 0)
2058 return s->errorhandler();
2059 Py_INCREF(Py_None);
2060 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002061}
2062
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002063PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002064"connect(address)\n\
2065\n\
2066Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002067is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002068
Guido van Rossum30a685f1991-06-27 15:51:29 +00002069
Fred Drake728819a2000-07-01 03:40:12 +00002070/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002071
2072static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002073sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 sock_addr_t addrbuf;
2076 int addrlen;
2077 int res;
2078 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2081 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 Py_BEGIN_ALLOW_THREADS
2084 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2085 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 /* Signals are not errors (though they may raise exceptions). Adapted
2088 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002089#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 if (res == EINTR && PyErr_CheckSignals())
2091 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002092#endif
2093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002095}
2096
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002097PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002098"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002099\n\
2100This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002101instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002102
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002103
Guido van Rossumed233a51992-06-23 09:07:03 +00002104/* s.fileno() method */
2105
Guido van Rossum73624e91994-10-10 17:59:00 +00002106static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002107sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002110}
2111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002112PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002113"fileno() -> integer\n\
2114\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002115Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002116
Guido van Rossumed233a51992-06-23 09:07:03 +00002117
Guido van Rossumc89705d1992-11-26 08:54:07 +00002118/* s.getsockname() method */
2119
Guido van Rossum73624e91994-10-10 17:59:00 +00002120static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002121sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 sock_addr_t addrbuf;
2124 int res;
2125 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 if (!getsockaddrlen(s, &addrlen))
2128 return NULL;
2129 memset(&addrbuf, 0, addrlen);
2130 Py_BEGIN_ALLOW_THREADS
2131 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2132 Py_END_ALLOW_THREADS
2133 if (res < 0)
2134 return s->errorhandler();
2135 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2136 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002137}
2138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002139PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002140"getsockname() -> address info\n\
2141\n\
2142Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002143info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002144
Guido van Rossumc89705d1992-11-26 08:54:07 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002147/* s.getpeername() method */
2148
Guido van Rossum73624e91994-10-10 17:59:00 +00002149static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002150sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 sock_addr_t addrbuf;
2153 int res;
2154 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 if (!getsockaddrlen(s, &addrlen))
2157 return NULL;
2158 memset(&addrbuf, 0, addrlen);
2159 Py_BEGIN_ALLOW_THREADS
2160 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2161 Py_END_ALLOW_THREADS
2162 if (res < 0)
2163 return s->errorhandler();
2164 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2165 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002166}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002168PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169"getpeername() -> address info\n\
2170\n\
2171Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002172info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002173
Guido van Rossumb6775db1994-08-01 11:34:53 +00002174#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002175
2176
Guido van Rossum30a685f1991-06-27 15:51:29 +00002177/* s.listen(n) method */
2178
Guido van Rossum73624e91994-10-10 17:59:00 +00002179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002180sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 int backlog;
2183 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 backlog = PyLong_AsLong(arg);
2186 if (backlog == -1 && PyErr_Occurred())
2187 return NULL;
2188 Py_BEGIN_ALLOW_THREADS
2189 if (backlog < 1)
2190 backlog = 1;
2191 res = listen(s->sock_fd, backlog);
2192 Py_END_ALLOW_THREADS
2193 if (res < 0)
2194 return s->errorhandler();
2195 Py_INCREF(Py_None);
2196 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002197}
2198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002199PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200"listen(backlog)\n\
2201\n\
2202Enable a server to accept connections. The backlog argument must be at\n\
2203least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002204will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002205
2206
Thomas Wouters477c8d52006-05-27 19:21:47 +00002207/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002208 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002209 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002210 * the buffer, do it in the caller. This function returns the number of bytes
2211 * succesfully read. If there was an error, it returns -1. Note that it is
2212 * also possible that we return a number of bytes smaller than the request
2213 * bytes.
2214 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002215
Antoine Pitrou19467d22010-08-17 19:33:30 +00002216static Py_ssize_t
2217sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002218{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002219 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002221#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 int remaining;
2223 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224#endif
2225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 if (!IS_SELECTABLE(s)) {
2227 select_error();
2228 return -1;
2229 }
2230 if (len == 0) {
2231 /* If 0 bytes were requested, do nothing. */
2232 return 0;
2233 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002234
2235#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002236 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002238 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 if (!timeout)
2240 outlen = recv(s->sock_fd, cbuf, len, flags);
2241 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 if (timeout == 1) {
2244 PyErr_SetString(socket_timeout, "timed out");
2245 return -1;
2246 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002247 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 if (outlen < 0) {
2249 /* Note: the call to errorhandler() ALWAYS indirectly returned
2250 NULL, so ignore its return value */
2251 s->errorhandler();
2252 return -1;
2253 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002254#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 read_buf = cbuf;
2256 remaining = len;
2257 while (remaining != 0) {
2258 unsigned int segment;
2259 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 segment = remaining /SEGMENT_SIZE;
2262 if (segment != 0) {
2263 segment = SEGMENT_SIZE;
2264 }
2265 else {
2266 segment = remaining;
2267 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002268
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002269 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002271 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 if (!timeout)
2273 nread = recv(s->sock_fd, read_buf, segment, flags);
2274 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 if (timeout == 1) {
2276 PyErr_SetString(socket_timeout, "timed out");
2277 return -1;
2278 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002279 END_SELECT_LOOP(s)
2280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 if (nread < 0) {
2282 s->errorhandler();
2283 return -1;
2284 }
2285 if (nread != remaining) {
2286 read_buf += nread;
2287 break;
2288 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 remaining -= segment;
2291 read_buf += segment;
2292 }
2293 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002294#endif /* !__VMS */
2295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002297}
2298
Guido van Rossum48a680c2001-03-02 06:34:14 +00002299
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002300/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002301
Guido van Rossum73624e91994-10-10 17:59:00 +00002302static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002303sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002304{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002305 Py_ssize_t recvlen, outlen;
2306 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Antoine Pitrou19467d22010-08-17 19:33:30 +00002309 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 if (recvlen < 0) {
2313 PyErr_SetString(PyExc_ValueError,
2314 "negative buffersize in recv");
2315 return NULL;
2316 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 /* Allocate a new string. */
2319 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2320 if (buf == NULL)
2321 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 /* Call the guts */
2324 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2325 if (outlen < 0) {
2326 /* An error occurred, release the string and return an
2327 error. */
2328 Py_DECREF(buf);
2329 return NULL;
2330 }
2331 if (outlen != recvlen) {
2332 /* We did not read as many bytes as we anticipated, resize the
2333 string if possible and be successful. */
2334 _PyBytes_Resize(&buf, outlen);
2335 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002338}
2339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002340PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002341"recv(buffersize[, flags]) -> data\n\
2342\n\
2343Receive up to buffersize bytes from the socket. For the optional flags\n\
2344argument, see the Unix manual. When no data is available, block until\n\
2345at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347
Guido van Rossum30a685f1991-06-27 15:51:29 +00002348
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002349/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002350
Thomas Wouters477c8d52006-05-27 19:21:47 +00002351static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002352sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002355
Antoine Pitrou19467d22010-08-17 19:33:30 +00002356 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 Py_buffer pbuf;
2358 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002359 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002362 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 &pbuf, &recvlen, &flags))
2364 return NULL;
2365 buf = pbuf.buf;
2366 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 if (recvlen < 0) {
2369 PyBuffer_Release(&pbuf);
2370 PyErr_SetString(PyExc_ValueError,
2371 "negative buffersize in recv_into");
2372 return NULL;
2373 }
2374 if (recvlen == 0) {
2375 /* If nbytes was not specified, use the buffer's length */
2376 recvlen = buflen;
2377 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 /* Check if the buffer is large enough */
2380 if (buflen < recvlen) {
2381 PyBuffer_Release(&pbuf);
2382 PyErr_SetString(PyExc_ValueError,
2383 "buffer too small for requested bytes");
2384 return NULL;
2385 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 /* Call the guts */
2388 readlen = sock_recv_guts(s, buf, recvlen, flags);
2389 if (readlen < 0) {
2390 /* Return an error. */
2391 PyBuffer_Release(&pbuf);
2392 return NULL;
2393 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 PyBuffer_Release(&pbuf);
2396 /* Return the number of bytes read. Note that we do not do anything
2397 special here in the case that readlen < recvlen. */
2398 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002399}
2400
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002401PyDoc_STRVAR(recv_into_doc,
2402"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002403\n\
2404A version of recv() that stores its data into a buffer rather than creating \n\
2405a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2406is not specified (or 0), receive up to the size available in the given buffer.\n\
2407\n\
2408See recv() for documentation about the flags.");
2409
2410
2411/*
Christian Heimes99170a52007-12-19 02:07:34 +00002412 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2413 * into a char buffer. If you have any inc/def ref to do to the objects that
2414 * contain the buffer, do it in the caller. This function returns the number
2415 * of bytes succesfully read. If there was an error, it returns -1. Note
2416 * that it is also possible that we return a number of bytes smaller than the
2417 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002418 *
2419 * 'addr' is a return value for the address object. Note that you must decref
2420 * it yourself.
2421 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002422static Py_ssize_t
2423sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 sock_addr_t addrbuf;
2427 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002428 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 if (!getsockaddrlen(s, &addrlen))
2434 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 if (!IS_SELECTABLE(s)) {
2437 select_error();
2438 return -1;
2439 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002440
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002441 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 Py_BEGIN_ALLOW_THREADS
2443 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002444 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002446#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002447#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 n = recvfrom(s->sock_fd, cbuf, len, flags,
2449 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002450#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 n = recvfrom(s->sock_fd, cbuf, len, flags,
2452 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002453#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002454#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 n = recvfrom(s->sock_fd, cbuf, len, flags,
2456 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 }
2459 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 if (timeout == 1) {
2462 PyErr_SetString(socket_timeout, "timed out");
2463 return -1;
2464 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002465 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 if (n < 0) {
2467 s->errorhandler();
2468 return -1;
2469 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2472 addrlen, s->sock_proto)))
2473 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002476}
2477
2478/* s.recvfrom(nbytes [,flags]) method */
2479
2480static PyObject *
2481sock_recvfrom(PySocketSockObject *s, PyObject *args)
2482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 PyObject *buf = NULL;
2484 PyObject *addr = NULL;
2485 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002486 int flags = 0;
2487 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002488
Antoine Pitrou19467d22010-08-17 19:33:30 +00002489 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 if (recvlen < 0) {
2493 PyErr_SetString(PyExc_ValueError,
2494 "negative buffersize in recvfrom");
2495 return NULL;
2496 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2499 if (buf == NULL)
2500 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2503 recvlen, flags, &addr);
2504 if (outlen < 0) {
2505 goto finally;
2506 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 if (outlen != recvlen) {
2509 /* We did not read as many bytes as we anticipated, resize the
2510 string if possible and be succesful. */
2511 if (_PyBytes_Resize(&buf, outlen) < 0)
2512 /* Oopsy, not so succesful after all. */
2513 goto finally;
2514 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517
2518finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 Py_XDECREF(buf);
2520 Py_XDECREF(addr);
2521 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002522}
2523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002525"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2526\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002528
Thomas Wouters477c8d52006-05-27 19:21:47 +00002529
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002530/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531
2532static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002533sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002536
Antoine Pitrou19467d22010-08-17 19:33:30 +00002537 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 Py_buffer pbuf;
2539 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002540 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002543
Antoine Pitrou19467d22010-08-17 19:33:30 +00002544 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 kwlist, &pbuf,
2546 &recvlen, &flags))
2547 return NULL;
2548 buf = pbuf.buf;
2549 buflen = pbuf.len;
2550 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 if (recvlen < 0) {
2553 PyBuffer_Release(&pbuf);
2554 PyErr_SetString(PyExc_ValueError,
2555 "negative buffersize in recvfrom_into");
2556 return NULL;
2557 }
2558 if (recvlen == 0) {
2559 /* If nbytes was not specified, use the buffer's length */
2560 recvlen = buflen;
2561 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2564 if (readlen < 0) {
2565 PyBuffer_Release(&pbuf);
2566 /* Return an error */
2567 Py_XDECREF(addr);
2568 return NULL;
2569 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 PyBuffer_Release(&pbuf);
2572 /* Return the number of bytes read and the address. Note that we do
2573 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002574 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002575}
2576
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002577PyDoc_STRVAR(recvfrom_into_doc,
2578"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002579\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002580Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002581
2582
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002583/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002584
Guido van Rossum73624e91994-10-10 17:59:00 +00002585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002586sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002589 Py_ssize_t len, n = -1;
2590 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
2594 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 if (!IS_SELECTABLE(s)) {
2597 PyBuffer_Release(&pbuf);
2598 return select_error();
2599 }
2600 buf = pbuf.buf;
2601 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002602
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002603 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002605 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002607#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002614 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 PyErr_SetString(socket_timeout, "timed out");
2616 return NULL;
2617 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002618 END_SELECT_LOOP(s)
2619
2620 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 if (n < 0)
2622 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00002623 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002624}
2625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002626PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002627"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002628\n\
2629Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002630argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002631sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002632
2633
2634/* s.sendall(data [,flags]) method */
2635
2636static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002637sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002640 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002641 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
2645 return NULL;
2646 buf = pbuf.buf;
2647 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (!IS_SELECTABLE(s)) {
2650 PyBuffer_Release(&pbuf);
2651 return select_error();
2652 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002655 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 timeout = internal_select(s, 1);
2657 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002658 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002659#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002660 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002661#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002662 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002663#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002664 }
2665 Py_END_ALLOW_THREADS
2666 if (timeout == 1) {
2667 PyBuffer_Release(&pbuf);
2668 PyErr_SetString(socket_timeout, "timed out");
2669 return NULL;
2670 }
2671 /* PyErr_CheckSignals() might change errno */
2672 saved_errno = errno;
2673 /* We must run our signal handlers before looping again.
2674 send() can return a successful partial write when it is
2675 interrupted, so we can't restrict ourselves to EINTR. */
2676 if (PyErr_CheckSignals()) {
2677 PyBuffer_Release(&pbuf);
2678 return NULL;
2679 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002681 /* If interrupted, try again */
2682 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00002684 else
2685 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 }
2687 buf += n;
2688 len -= n;
2689 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 if (n < 0)
2693 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 Py_INCREF(Py_None);
2696 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002697}
2698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002700"sendall(data[, flags])\n\
2701\n\
2702Send a data string to the socket. For the optional flags\n\
2703argument, see the Unix manual. This calls send() repeatedly\n\
2704until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002705to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706
Guido van Rossum30a685f1991-06-27 15:51:29 +00002707
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002708/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002709
Guido van Rossum73624e91994-10-10 17:59:00 +00002710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002711sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 Py_buffer pbuf;
2714 PyObject *addro;
2715 char *buf;
2716 Py_ssize_t len;
2717 sock_addr_t addrbuf;
2718 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 flags = 0;
2721 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
2722 PyErr_Clear();
2723 if (!PyArg_ParseTuple(args, "y*iO:sendto",
2724 &pbuf, &flags, &addro))
2725 return NULL;
2726 }
2727 buf = pbuf.buf;
2728 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 if (!IS_SELECTABLE(s)) {
2731 PyBuffer_Release(&pbuf);
2732 return select_error();
2733 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2736 PyBuffer_Release(&pbuf);
2737 return NULL;
2738 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002739
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002740 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002742 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 if (!timeout)
2744 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2745 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002748 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 PyErr_SetString(socket_timeout, "timed out");
2750 return NULL;
2751 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002752 END_SELECT_LOOP(s)
2753 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (n < 0)
2755 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00002756 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002757}
2758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002759PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002760"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002761\n\
2762Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002763For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002764
Guido van Rossum30a685f1991-06-27 15:51:29 +00002765
2766/* s.shutdown(how) method */
2767
Guido van Rossum73624e91994-10-10 17:59:00 +00002768static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002769sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 int how;
2772 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 how = PyLong_AsLong(arg);
2775 if (how == -1 && PyErr_Occurred())
2776 return NULL;
2777 Py_BEGIN_ALLOW_THREADS
2778 res = shutdown(s->sock_fd, how);
2779 Py_END_ALLOW_THREADS
2780 if (res < 0)
2781 return s->errorhandler();
2782 Py_INCREF(Py_None);
2783 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002784}
2785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002786PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002787"shutdown(flag)\n\
2788\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002789Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2790of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002791
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00002792#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00002793static PyObject*
2794sock_ioctl(PySocketSockObject *s, PyObject *arg)
2795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 unsigned long cmd = SIO_RCVALL;
2797 PyObject *argO;
2798 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2801 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00002802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 switch (cmd) {
2804 case SIO_RCVALL: {
2805 unsigned int option = RCVALL_ON;
2806 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2807 return NULL;
2808 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2809 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2810 return set_error();
2811 }
2812 return PyLong_FromUnsignedLong(recv); }
2813 case SIO_KEEPALIVE_VALS: {
2814 struct tcp_keepalive ka;
2815 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2816 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2817 return NULL;
2818 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2819 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2820 return set_error();
2821 }
2822 return PyLong_FromUnsignedLong(recv); }
2823 default:
2824 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2825 return NULL;
2826 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00002827}
2828PyDoc_STRVAR(sock_ioctl_doc,
2829"ioctl(cmd, option) -> long\n\
2830\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00002831Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2832SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2833SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00002834
2835#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002836
2837/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002838
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002839static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
2841 accept_doc},
2842 {"bind", (PyCFunction)sock_bind, METH_O,
2843 bind_doc},
2844 {"close", (PyCFunction)sock_close, METH_NOARGS,
2845 close_doc},
2846 {"connect", (PyCFunction)sock_connect, METH_O,
2847 connect_doc},
2848 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2849 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002850 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
2851 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2853 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002854#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 {"getpeername", (PyCFunction)sock_getpeername,
2856 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 {"getsockname", (PyCFunction)sock_getsockname,
2859 METH_NOARGS, getsockname_doc},
2860 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2861 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00002862#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2864 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00002865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 {"listen", (PyCFunction)sock_listen, METH_O,
2867 listen_doc},
2868 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2869 recv_doc},
2870 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2871 recv_into_doc},
2872 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2873 recvfrom_doc},
2874 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2875 recvfrom_into_doc},
2876 {"send", (PyCFunction)sock_send, METH_VARARGS,
2877 send_doc},
2878 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2879 sendall_doc},
2880 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2881 sendto_doc},
2882 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2883 setblocking_doc},
2884 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2885 settimeout_doc},
2886 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2887 gettimeout_doc},
2888 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2889 setsockopt_doc},
2890 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2891 shutdown_doc},
2892 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002893};
2894
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002895/* SockObject members */
2896static PyMemberDef sock_memberlist[] = {
2897 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2898 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2899 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2900 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2901 {0},
2902};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002903
Guido van Rossum73624e91994-10-10 17:59:00 +00002904/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002905 First close the file description. */
2906
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002907static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002908sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 if (s->sock_fd != -1)
2911 (void) SOCKETCLOSE(s->sock_fd);
2912 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002913}
2914
Guido van Rossum30a685f1991-06-27 15:51:29 +00002915
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002916static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002917sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002918{
Fred Drakea04eaad2000-06-30 02:46:07 +00002919#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 if (s->sock_fd > LONG_MAX) {
2921 /* this can occur on Win64, and actually there is a special
2922 ugly printf formatter for decimal pointer length integer
2923 printing, only bother if necessary*/
2924 PyErr_SetString(PyExc_OverflowError,
2925 "no printf formatter to display "
2926 "the socket descriptor in decimal");
2927 return NULL;
2928 }
Fred Drakea04eaad2000-06-30 02:46:07 +00002929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 return PyUnicode_FromFormat(
2931 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
2932 (long)s->sock_fd, s->sock_family,
2933 s->sock_type,
2934 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002935}
2936
2937
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002938/* Create a new, uninitialized socket object. */
2939
2940static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002941sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 new = type->tp_alloc(type, 0);
2946 if (new != NULL) {
2947 ((PySocketSockObject *)new)->sock_fd = -1;
2948 ((PySocketSockObject *)new)->sock_timeout = -1.0;
2949 ((PySocketSockObject *)new)->errorhandler = &set_error;
2950 }
2951 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002952}
2953
2954
2955/* Initialize a new socket object. */
2956
2957/*ARGSUSED*/
2958static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002959sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 PySocketSockObject *s = (PySocketSockObject *)self;
2962 PyObject *fdobj = NULL;
2963 SOCKET_T fd = INVALID_SOCKET;
2964 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2965 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2968 "|iiiO:socket", keywords,
2969 &family, &type, &proto, &fdobj))
2970 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 if (fdobj != NULL && fdobj != Py_None) {
2973 fd = PyLong_AsSocket_t(fdobj);
2974 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
2975 return -1;
2976 if (fd == INVALID_SOCKET) {
2977 PyErr_SetString(PyExc_ValueError,
2978 "can't use invalid socket value");
2979 return -1;
2980 }
2981 }
2982 else {
2983 Py_BEGIN_ALLOW_THREADS
2984 fd = socket(family, type, proto);
2985 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 if (fd == INVALID_SOCKET) {
2988 set_error();
2989 return -1;
2990 }
2991 }
2992 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002995
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002996}
2997
2998
Guido van Rossumb6775db1994-08-01 11:34:53 +00002999/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003000
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003001static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3003 "_socket.socket", /* tp_name */
3004 sizeof(PySocketSockObject), /* tp_basicsize */
3005 0, /* tp_itemsize */
3006 (destructor)sock_dealloc, /* tp_dealloc */
3007 0, /* tp_print */
3008 0, /* tp_getattr */
3009 0, /* tp_setattr */
3010 0, /* tp_reserved */
3011 (reprfunc)sock_repr, /* tp_repr */
3012 0, /* tp_as_number */
3013 0, /* tp_as_sequence */
3014 0, /* tp_as_mapping */
3015 0, /* tp_hash */
3016 0, /* tp_call */
3017 0, /* tp_str */
3018 PyObject_GenericGetAttr, /* tp_getattro */
3019 0, /* tp_setattro */
3020 0, /* tp_as_buffer */
3021 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3022 sock_doc, /* tp_doc */
3023 0, /* tp_traverse */
3024 0, /* tp_clear */
3025 0, /* tp_richcompare */
3026 0, /* tp_weaklistoffset */
3027 0, /* tp_iter */
3028 0, /* tp_iternext */
3029 sock_methods, /* tp_methods */
3030 sock_memberlist, /* tp_members */
3031 0, /* tp_getset */
3032 0, /* tp_base */
3033 0, /* tp_dict */
3034 0, /* tp_descr_get */
3035 0, /* tp_descr_set */
3036 0, /* tp_dictoffset */
3037 sock_initobj, /* tp_init */
3038 PyType_GenericAlloc, /* tp_alloc */
3039 sock_new, /* tp_new */
3040 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003041};
3042
Guido van Rossum30a685f1991-06-27 15:51:29 +00003043
Guido van Rossum81194471991-07-27 21:42:02 +00003044/* Python interface to gethostname(). */
3045
3046/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003047static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003048socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 char buf[1024];
3051 int res;
3052 Py_BEGIN_ALLOW_THREADS
3053 res = gethostname(buf, (int) sizeof buf - 1);
3054 Py_END_ALLOW_THREADS
3055 if (res < 0)
3056 return set_error();
3057 buf[sizeof buf - 1] = '\0';
3058 return PyUnicode_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003059}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003061PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003062"gethostname() -> string\n\
3063\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003064Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003065
Guido van Rossumff4949e1992-08-05 19:58:53 +00003066
Guido van Rossum30a685f1991-06-27 15:51:29 +00003067/* Python interface to gethostbyname(name). */
3068
3069/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003070static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003071socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 char *name;
3074 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003075 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003076
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003077 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 return NULL;
3079 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003080 goto finally;
3081 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3082finally:
3083 PyMem_Free(name);
3084 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003085}
3086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003087PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003088"gethostbyname(host) -> address\n\
3089\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003090Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003091
3092
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003093/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3094
3095static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003096gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 char **pch;
3099 PyObject *rtn_tuple = (PyObject *)NULL;
3100 PyObject *name_list = (PyObject *)NULL;
3101 PyObject *addr_list = (PyObject *)NULL;
3102 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 if (h == NULL) {
3105 /* Let's get real error message to return */
3106 set_herror(h_errno);
3107 return NULL;
3108 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 if (h->h_addrtype != af) {
3111 /* Let's get real error message to return */
3112 PyErr_SetString(socket_error,
3113 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00003114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 return NULL;
3116 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 case AF_INET:
3121 if (alen < sizeof(struct sockaddr_in))
3122 return NULL;
3123 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003124
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003125#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 case AF_INET6:
3127 if (alen < sizeof(struct sockaddr_in6))
3128 return NULL;
3129 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003130#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 if ((name_list = PyList_New(0)) == NULL)
3135 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 if ((addr_list = PyList_New(0)) == NULL)
3138 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 /* SF #1511317: h_aliases can be NULL */
3141 if (h->h_aliases) {
3142 for (pch = h->h_aliases; *pch != NULL; pch++) {
3143 int status;
3144 tmp = PyUnicode_FromString(*pch);
3145 if (tmp == NULL)
3146 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 status = PyList_Append(name_list, tmp);
3149 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 if (status)
3152 goto err;
3153 }
3154 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3157 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 case AF_INET:
3162 {
3163 struct sockaddr_in sin;
3164 memset(&sin, 0, sizeof(sin));
3165 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003166#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3170 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 if (pch == h->h_addr_list && alen >= sizeof(sin))
3173 memcpy((char *) addr, &sin, sizeof(sin));
3174 break;
3175 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003176
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003177#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 case AF_INET6:
3179 {
3180 struct sockaddr_in6 sin6;
3181 memset(&sin6, 0, sizeof(sin6));
3182 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003183#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3187 tmp = makeipaddr((struct sockaddr *)&sin6,
3188 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3191 memcpy((char *) addr, &sin6, sizeof(sin6));
3192 break;
3193 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003194#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 default: /* can't happen */
3197 PyErr_SetString(socket_error,
3198 "unsupported address family");
3199 return NULL;
3200 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 if (tmp == NULL)
3203 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 status = PyList_Append(addr_list, tmp);
3206 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 if (status)
3209 goto err;
3210 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003213
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003214 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 Py_XDECREF(name_list);
3216 Py_XDECREF(addr_list);
3217 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003218}
3219
3220
3221/* Python interface to gethostbyname_ex(name). */
3222
3223/*ARGSUSED*/
3224static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003225socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 char *name;
3228 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003229#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003231#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003235 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003236#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003238#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003240#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 char buf[16384];
3242 int buf_len = (sizeof buf) - 1;
3243 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003244#endif
3245#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003247#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003248#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003249
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003250 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 return NULL;
3252 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003253 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003255#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003256#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3258 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003259#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003261#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 memset((void *) &data, '\0', sizeof(data));
3263 result = gethostbyname_r(name, &hp_allocated, &data);
3264 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003265#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003266#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003267#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003271#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 Py_END_ALLOW_THREADS
3273 /* Some C libraries would require addr.__ss_family instead of
3274 addr.ss_family.
3275 Therefore, we cast the sockaddr_storage into sockaddr to
3276 access sa_family. */
3277 sa = (struct sockaddr*)&addr;
3278 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3279 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003280#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003282#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003283finally:
3284 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003286}
3287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003289"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3290\n\
3291Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003293
3294
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003295/* Python interface to gethostbyaddr(IP). */
3296
3297/*ARGSUSED*/
3298static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003299socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003300{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003301#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003303#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 struct sockaddr *sa = (struct sockaddr *)&addr;
3307 char *ip_num;
3308 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003309 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003310#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003312#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003314#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 /* glibcs up to 2.10 assume that the buf argument to
3316 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3317 does not ensure. The attribute below instructs the compiler
3318 to maintain this alignment. */
3319 char buf[16384] Py_ALIGNED(8);
3320 int buf_len = (sizeof buf) - 1;
3321 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003322#endif
3323#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003325#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003326#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 char *ap;
3328 int al;
3329 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003330
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003331 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 return NULL;
3333 af = AF_UNSPEC;
3334 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003335 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 af = sa->sa_family;
3337 ap = NULL;
3338 al = 0;
3339 switch (af) {
3340 case AF_INET:
3341 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3342 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3343 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003344#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 case AF_INET6:
3346 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3347 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3348 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 default:
3351 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003352 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 }
3354 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003355#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003356#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 result = gethostbyaddr_r(ap, al, af,
3358 &hp_allocated, buf, buf_len,
3359 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003360#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 h = gethostbyaddr_r(ap, al, af,
3362 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003363#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 memset((void *) &data, '\0', sizeof(data));
3365 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3366 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003367#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003368#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003369#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003373#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 Py_END_ALLOW_THREADS
3375 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003376#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003378#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003379finally:
3380 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003382}
3383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003384PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003385"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3386\n\
3387Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003388for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003389
Guido van Rossum30a685f1991-06-27 15:51:29 +00003390
3391/* Python interface to getservbyname(name).
3392 This only returns the port number, since the other info is already
3393 known or not useful (like the list of aliases). */
3394
3395/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003397socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 char *name, *proto=NULL;
3400 struct servent *sp;
3401 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3402 return NULL;
3403 Py_BEGIN_ALLOW_THREADS
3404 sp = getservbyname(name, proto);
3405 Py_END_ALLOW_THREADS
3406 if (sp == NULL) {
3407 PyErr_SetString(socket_error, "service/proto not found");
3408 return NULL;
3409 }
3410 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003411}
3412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003413PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003414"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003415\n\
3416Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003417The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3418otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003419
Guido van Rossum30a685f1991-06-27 15:51:29 +00003420
Barry Warsaw11b91a02004-06-28 00:50:43 +00003421/* Python interface to getservbyport(port).
3422 This only returns the service name, since the other info is already
3423 known or not useful (like the list of aliases). */
3424
3425/*ARGSUSED*/
3426static PyObject *
3427socket_getservbyport(PyObject *self, PyObject *args)
3428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003429 int port;
3430 char *proto=NULL;
3431 struct servent *sp;
3432 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3433 return NULL;
3434 if (port < 0 || port > 0xffff) {
3435 PyErr_SetString(
3436 PyExc_OverflowError,
3437 "getservbyport: port must be 0-65535.");
3438 return NULL;
3439 }
3440 Py_BEGIN_ALLOW_THREADS
3441 sp = getservbyport(htons((short)port), proto);
3442 Py_END_ALLOW_THREADS
3443 if (sp == NULL) {
3444 PyErr_SetString(socket_error, "port/proto not found");
3445 return NULL;
3446 }
3447 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003448}
3449
3450PyDoc_STRVAR(getservbyport_doc,
3451"getservbyport(port[, protocolname]) -> string\n\
3452\n\
3453Return the service name from a port number and protocol name.\n\
3454The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3455otherwise any protocol will match.");
3456
Guido van Rossum3901d851996-12-19 16:35:04 +00003457/* Python interface to getprotobyname(name).
3458 This only returns the protocol number, since the other info is
3459 already known or not useful (like the list of aliases). */
3460
3461/*ARGSUSED*/
3462static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003463socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 char *name;
3466 struct protoent *sp;
3467 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3468 return NULL;
3469 Py_BEGIN_ALLOW_THREADS
3470 sp = getprotobyname(name);
3471 Py_END_ALLOW_THREADS
3472 if (sp == NULL) {
3473 PyErr_SetString(socket_error, "protocol not found");
3474 return NULL;
3475 }
3476 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00003477}
3478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003479PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003480"getprotobyname(name) -> integer\n\
3481\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003482Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003483
Guido van Rossum3901d851996-12-19 16:35:04 +00003484
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003485#ifndef NO_DUP
3486/* dup() function for socket fds */
3487
3488static PyObject *
3489socket_dup(PyObject *self, PyObject *fdobj)
3490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 SOCKET_T fd, newfd;
3492 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003493
3494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 fd = PyLong_AsSocket_t(fdobj);
3496 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3497 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 newfd = dup_socket(fd);
3500 if (newfd == INVALID_SOCKET)
3501 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 newfdobj = PyLong_FromSocket_t(newfd);
3504 if (newfdobj == NULL)
3505 SOCKETCLOSE(newfd);
3506 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003507}
3508
3509PyDoc_STRVAR(dup_doc,
3510"dup(integer) -> integer\n\
3511\n\
3512Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
3513sockets; on some platforms os.dup() won't work for socket file descriptors.");
3514#endif
3515
3516
Dave Cole331708b2004-08-09 04:51:41 +00003517#ifdef HAVE_SOCKETPAIR
3518/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003519 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003520 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003521
3522/*ARGSUSED*/
3523static PyObject *
3524socket_socketpair(PyObject *self, PyObject *args)
3525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 PySocketSockObject *s0 = NULL, *s1 = NULL;
3527 SOCKET_T sv[2];
3528 int family, type = SOCK_STREAM, proto = 0;
3529 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003530
3531#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003533#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3537 &family, &type, &proto))
3538 return NULL;
3539 /* Create a pair of socket fds */
3540 if (socketpair(family, type, proto, sv) < 0)
3541 return set_error();
3542 s0 = new_sockobject(sv[0], family, type, proto);
3543 if (s0 == NULL)
3544 goto finally;
3545 s1 = new_sockobject(sv[1], family, type, proto);
3546 if (s1 == NULL)
3547 goto finally;
3548 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003549
3550finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 if (res == NULL) {
3552 if (s0 == NULL)
3553 SOCKETCLOSE(sv[0]);
3554 if (s1 == NULL)
3555 SOCKETCLOSE(sv[1]);
3556 }
3557 Py_XDECREF(s0);
3558 Py_XDECREF(s1);
3559 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003560}
3561
3562PyDoc_STRVAR(socketpair_doc,
3563"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3564\n\
3565Create a pair of socket objects from the sockets returned by the platform\n\
3566socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003567The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003568AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003569
3570#endif /* HAVE_SOCKETPAIR */
3571
3572
Guido van Rossum006bf911996-06-12 04:04:55 +00003573static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003574socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3579 return NULL;
3580 }
3581 if (x1 < 0) {
3582 PyErr_SetString(PyExc_OverflowError,
3583 "can't convert negative number to unsigned long");
3584 return NULL;
3585 }
3586 x2 = (unsigned int)ntohs((unsigned short)x1);
3587 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003588}
3589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003590PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003591"ntohs(integer) -> integer\n\
3592\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003593Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003594
3595
Guido van Rossum006bf911996-06-12 04:04:55 +00003596static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003597socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 if (PyLong_Check(arg)) {
3602 x = PyLong_AsUnsignedLong(arg);
3603 if (x == (unsigned long) -1 && PyErr_Occurred())
3604 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003605#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 {
3607 unsigned long y;
3608 /* only want the trailing 32 bits */
3609 y = x & 0xFFFFFFFFUL;
3610 if (y ^ x)
3611 return PyErr_Format(PyExc_OverflowError,
3612 "long int larger than 32 bits");
3613 x = y;
3614 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 }
3617 else
3618 return PyErr_Format(PyExc_TypeError,
3619 "expected int/long, %s found",
3620 Py_TYPE(arg)->tp_name);
3621 if (x == (unsigned long) -1 && PyErr_Occurred())
3622 return NULL;
3623 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003624}
3625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003626PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003627"ntohl(integer) -> integer\n\
3628\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003629Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003630
3631
Guido van Rossum006bf911996-06-12 04:04:55 +00003632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003633socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3638 return NULL;
3639 }
3640 if (x1 < 0) {
3641 PyErr_SetString(PyExc_OverflowError,
3642 "can't convert negative number to unsigned long");
3643 return NULL;
3644 }
3645 x2 = (unsigned int)htons((unsigned short)x1);
3646 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003647}
3648
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003649PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003650"htons(integer) -> integer\n\
3651\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003652Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003653
3654
Guido van Rossum006bf911996-06-12 04:04:55 +00003655static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003656socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 if (PyLong_Check(arg)) {
3661 x = PyLong_AsUnsignedLong(arg);
3662 if (x == (unsigned long) -1 && PyErr_Occurred())
3663 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003664#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 {
3666 unsigned long y;
3667 /* only want the trailing 32 bits */
3668 y = x & 0xFFFFFFFFUL;
3669 if (y ^ x)
3670 return PyErr_Format(PyExc_OverflowError,
3671 "long int larger than 32 bits");
3672 x = y;
3673 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 }
3676 else
3677 return PyErr_Format(PyExc_TypeError,
3678 "expected int/long, %s found",
3679 Py_TYPE(arg)->tp_name);
3680 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003681}
3682
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003683PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003684"htonl(integer) -> integer\n\
3685\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003686Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003687
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003688/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003689
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003690PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003691"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003692\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003693Convert 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 +00003694binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003695
3696static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003697socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003698{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003699#ifndef INADDR_NONE
3700#define INADDR_NONE (-1)
3701#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003702#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003704#endif
3705
3706#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00003707#if (SIZEOF_INT != 4)
3708#error "Not sure if in_addr_t exists and int is not 32-bits."
3709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 /* Have to use inet_addr() instead */
3711 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003712#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3716 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003717
Tim Peters1df9fdd2003-02-13 03:13:40 +00003718
3719#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00003720
3721#ifdef USE_INET_ATON_WEAKLINK
3722 if (inet_aton != NULL) {
3723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 if (inet_aton(ip_addr, &buf))
3725 return PyBytes_FromStringAndSize((char *)(&buf),
3726 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 PyErr_SetString(socket_error,
3729 "illegal IP address string passed to inet_aton");
3730 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003731
Thomas Wouters477c8d52006-05-27 19:21:47 +00003732#ifdef USE_INET_ATON_WEAKLINK
3733 } else {
3734#endif
3735
3736#endif
3737
3738#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 /* special-case this address as inet_addr might return INADDR_NONE
3741 * for this */
3742 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3743 packed_addr = 0xFFFFFFFF;
3744 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 if (packed_addr == INADDR_NONE) { /* invalid address */
3749 PyErr_SetString(socket_error,
3750 "illegal IP address string passed to inet_aton");
3751 return NULL;
3752 }
3753 }
3754 return PyBytes_FromStringAndSize((char *) &packed_addr,
3755 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00003756
3757#ifdef USE_INET_ATON_WEAKLINK
3758 }
3759#endif
3760
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003761#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003762}
3763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003764PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003765"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003766\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003767Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003768
3769static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003770socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 char *packed_str;
3773 int addr_len;
3774 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
3777 return NULL;
3778 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003780 if (addr_len != sizeof(packed_addr)) {
3781 PyErr_SetString(socket_error,
3782 "packed IP wrong length for inet_ntoa");
3783 return NULL;
3784 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003788 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003789}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003790
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003791#ifdef HAVE_INET_PTON
3792
3793PyDoc_STRVAR(inet_pton_doc,
3794"inet_pton(af, ip) -> packed IP address string\n\
3795\n\
3796Convert an IP address from string format to a packed string suitable\n\
3797for use with low-level network functions.");
3798
3799static PyObject *
3800socket_inet_pton(PyObject *self, PyObject *args)
3801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003802 int af;
3803 char* ip;
3804 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003805#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003807#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3811 return NULL;
3812 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003813
Martin v. Löwis04697e82004-06-02 12:35:29 +00003814#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 if(af == AF_INET6) {
3816 PyErr_SetString(socket_error,
3817 "can't use AF_INET6, IPv6 is disabled");
3818 return NULL;
3819 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003820#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 retval = inet_pton(af, ip, packed);
3823 if (retval < 0) {
3824 PyErr_SetFromErrno(socket_error);
3825 return NULL;
3826 } else if (retval == 0) {
3827 PyErr_SetString(socket_error,
3828 "illegal IP address string passed to inet_pton");
3829 return NULL;
3830 } else if (af == AF_INET) {
3831 return PyBytes_FromStringAndSize(packed,
3832 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003833#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 } else if (af == AF_INET6) {
3835 return PyBytes_FromStringAndSize(packed,
3836 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 } else {
3839 PyErr_SetString(socket_error, "unknown address family");
3840 return NULL;
3841 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003842}
Thomas Wouters477c8d52006-05-27 19:21:47 +00003843
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003844PyDoc_STRVAR(inet_ntop_doc,
3845"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3846\n\
3847Convert a packed IP address of the given family to string format.");
3848
3849static PyObject *
3850socket_inet_ntop(PyObject *self, PyObject *args)
3851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 int af;
3853 char* packed;
3854 int len;
3855 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003856#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003858#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003860#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00003861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 /* Guarantee NUL-termination for PyUnicode_FromString() below */
3863 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
3866 return NULL;
3867 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 if (af == AF_INET) {
3870 if (len != sizeof(struct in_addr)) {
3871 PyErr_SetString(PyExc_ValueError,
3872 "invalid length of packed IP address string");
3873 return NULL;
3874 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003875#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 } else if (af == AF_INET6) {
3877 if (len != sizeof(struct in6_addr)) {
3878 PyErr_SetString(PyExc_ValueError,
3879 "invalid length of packed IP address string");
3880 return NULL;
3881 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 } else {
3884 PyErr_Format(PyExc_ValueError,
3885 "unknown address family %d", af);
3886 return NULL;
3887 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 retval = inet_ntop(af, packed, ip, sizeof(ip));
3890 if (!retval) {
3891 PyErr_SetFromErrno(socket_error);
3892 return NULL;
3893 } else {
3894 return PyUnicode_FromString(retval);
3895 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003897 /* NOTREACHED */
3898 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3899 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003900}
3901
3902#endif /* HAVE_INET_PTON */
3903
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003904/* Python interface to getaddrinfo(host, port). */
3905
3906/*ARGSUSED*/
3907static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00003908socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003909{
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00003910 static char* kwnames[] = {"host", "port", "family", "type", "proto",
3911 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 struct addrinfo hints, *res;
3913 struct addrinfo *res0 = NULL;
3914 PyObject *hobj = NULL;
3915 PyObject *pobj = (PyObject *)NULL;
3916 char pbuf[30];
3917 char *hptr, *pptr;
3918 int family, socktype, protocol, flags;
3919 int error;
3920 PyObject *all = (PyObject *)NULL;
3921 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 family = socktype = protocol = flags = 0;
3924 family = AF_UNSPEC;
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00003925 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
3926 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 &protocol, &flags)) {
3928 return NULL;
3929 }
3930 if (hobj == Py_None) {
3931 hptr = NULL;
3932 } else if (PyUnicode_Check(hobj)) {
3933 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3934 if (!idna)
3935 return NULL;
3936 assert(PyBytes_Check(idna));
3937 hptr = PyBytes_AS_STRING(idna);
3938 } else if (PyBytes_Check(hobj)) {
3939 hptr = PyBytes_AsString(hobj);
3940 } else {
3941 PyErr_SetString(PyExc_TypeError,
3942 "getaddrinfo() argument 1 must be string or None");
3943 return NULL;
3944 }
3945 if (PyLong_CheckExact(pobj)) {
3946 long value = PyLong_AsLong(pobj);
3947 if (value == -1 && PyErr_Occurred())
3948 goto err;
3949 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
3950 pptr = pbuf;
3951 } else if (PyUnicode_Check(pobj)) {
3952 pptr = _PyUnicode_AsString(pobj);
3953 } else if (PyBytes_Check(pobj)) {
3954 pptr = PyBytes_AsString(pobj);
3955 } else if (pobj == Py_None) {
3956 pptr = (char *)NULL;
3957 } else {
3958 PyErr_SetString(socket_error, "Int or String expected");
3959 goto err;
3960 }
3961 memset(&hints, 0, sizeof(hints));
3962 hints.ai_family = family;
3963 hints.ai_socktype = socktype;
3964 hints.ai_protocol = protocol;
3965 hints.ai_flags = flags;
3966 Py_BEGIN_ALLOW_THREADS
3967 ACQUIRE_GETADDRINFO_LOCK
3968 error = getaddrinfo(hptr, pptr, &hints, &res0);
3969 Py_END_ALLOW_THREADS
3970 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
3971 if (error) {
3972 set_gaierror(error);
3973 goto err;
3974 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 if ((all = PyList_New(0)) == NULL)
3977 goto err;
3978 for (res = res0; res; res = res->ai_next) {
3979 PyObject *single;
3980 PyObject *addr =
3981 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
3982 if (addr == NULL)
3983 goto err;
3984 single = Py_BuildValue("iiisO", res->ai_family,
3985 res->ai_socktype, res->ai_protocol,
3986 res->ai_canonname ? res->ai_canonname : "",
3987 addr);
3988 Py_DECREF(addr);
3989 if (single == NULL)
3990 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003992 if (PyList_Append(all, single))
3993 goto err;
3994 Py_XDECREF(single);
3995 }
3996 Py_XDECREF(idna);
3997 if (res0)
3998 freeaddrinfo(res0);
3999 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004000 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 Py_XDECREF(all);
4002 Py_XDECREF(idna);
4003 if (res0)
4004 freeaddrinfo(res0);
4005 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004006}
4007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004008PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004009"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4010 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004011\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004012Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004013
4014/* Python interface to getnameinfo(sa, flags). */
4015
4016/*ARGSUSED*/
4017static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004018socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 PyObject *sa = (PyObject *)NULL;
4021 int flags;
4022 char *hostp;
4023 int port, flowinfo, scope_id;
4024 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4025 struct addrinfo hints, *res = NULL;
4026 int error;
4027 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 flags = flowinfo = scope_id = 0;
4030 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4031 return NULL;
4032 if (!PyTuple_Check(sa)) {
4033 PyErr_SetString(PyExc_TypeError,
4034 "getnameinfo() argument 1 must be a tuple");
4035 return NULL;
4036 }
4037 if (!PyArg_ParseTuple(sa, "si|ii",
4038 &hostp, &port, &flowinfo, &scope_id))
4039 return NULL;
4040 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4041 memset(&hints, 0, sizeof(hints));
4042 hints.ai_family = AF_UNSPEC;
4043 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004044 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004045 Py_BEGIN_ALLOW_THREADS
4046 ACQUIRE_GETADDRINFO_LOCK
4047 error = getaddrinfo(hostp, pbuf, &hints, &res);
4048 Py_END_ALLOW_THREADS
4049 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4050 if (error) {
4051 set_gaierror(error);
4052 goto fail;
4053 }
4054 if (res->ai_next) {
4055 PyErr_SetString(socket_error,
4056 "sockaddr resolved to multiple addresses");
4057 goto fail;
4058 }
4059 switch (res->ai_family) {
4060 case AF_INET:
4061 {
4062 if (PyTuple_GET_SIZE(sa) != 2) {
4063 PyErr_SetString(socket_error,
4064 "IPv4 sockaddr must be 2 tuple");
4065 goto fail;
4066 }
4067 break;
4068 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004069#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 case AF_INET6:
4071 {
4072 struct sockaddr_in6 *sin6;
4073 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4074 sin6->sin6_flowinfo = flowinfo;
4075 sin6->sin6_scope_id = scope_id;
4076 break;
4077 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004080 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4082 if (error) {
4083 set_gaierror(error);
4084 goto fail;
4085 }
4086 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004087
4088fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 if (res)
4090 freeaddrinfo(res);
4091 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004092}
4093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004094PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004095"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004096\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004097Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004098
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004099
4100/* Python API to getting and setting the default timeout value. */
4101
4102static PyObject *
4103socket_getdefaulttimeout(PyObject *self)
4104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 if (defaulttimeout < 0.0) {
4106 Py_INCREF(Py_None);
4107 return Py_None;
4108 }
4109 else
4110 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004111}
4112
4113PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004114"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004115\n\
4116Returns the default timeout in floating seconds for new socket objects.\n\
4117A value of None indicates that new socket objects have no timeout.\n\
4118When the socket module is first imported, the default is None.");
4119
4120static PyObject *
4121socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 if (arg == Py_None)
4126 timeout = -1.0;
4127 else {
4128 timeout = PyFloat_AsDouble(arg);
4129 if (timeout < 0.0) {
4130 if (!PyErr_Occurred())
4131 PyErr_SetString(PyExc_ValueError,
4132 "Timeout value out of range");
4133 return NULL;
4134 }
4135 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 Py_INCREF(Py_None);
4140 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004141}
4142
4143PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004144"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004145\n\
4146Set the default timeout in floating seconds for new socket objects.\n\
4147A value of None indicates that new socket objects have no timeout.\n\
4148When the socket module is first imported, the default is None.");
4149
4150
Guido van Rossum30a685f1991-06-27 15:51:29 +00004151/* List of functions exported by this module. */
4152
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004153static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 {"gethostbyname", socket_gethostbyname,
4155 METH_VARARGS, gethostbyname_doc},
4156 {"gethostbyname_ex", socket_gethostbyname_ex,
4157 METH_VARARGS, ghbn_ex_doc},
4158 {"gethostbyaddr", socket_gethostbyaddr,
4159 METH_VARARGS, gethostbyaddr_doc},
4160 {"gethostname", socket_gethostname,
4161 METH_NOARGS, gethostname_doc},
4162 {"getservbyname", socket_getservbyname,
4163 METH_VARARGS, getservbyname_doc},
4164 {"getservbyport", socket_getservbyport,
4165 METH_VARARGS, getservbyport_doc},
4166 {"getprotobyname", socket_getprotobyname,
4167 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004168#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 {"dup", socket_dup,
4170 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004171#endif
Dave Cole331708b2004-08-09 04:51:41 +00004172#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 {"socketpair", socket_socketpair,
4174 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 {"ntohs", socket_ntohs,
4177 METH_VARARGS, ntohs_doc},
4178 {"ntohl", socket_ntohl,
4179 METH_O, ntohl_doc},
4180 {"htons", socket_htons,
4181 METH_VARARGS, htons_doc},
4182 {"htonl", socket_htonl,
4183 METH_O, htonl_doc},
4184 {"inet_aton", socket_inet_aton,
4185 METH_VARARGS, inet_aton_doc},
4186 {"inet_ntoa", socket_inet_ntoa,
4187 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004188#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 {"inet_pton", socket_inet_pton,
4190 METH_VARARGS, inet_pton_doc},
4191 {"inet_ntop", socket_inet_ntop,
4192 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004193#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004194 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
4195 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 {"getnameinfo", socket_getnameinfo,
4197 METH_VARARGS, getnameinfo_doc},
4198 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4199 METH_NOARGS, getdefaulttimeout_doc},
4200 {"setdefaulttimeout", socket_setdefaulttimeout,
4201 METH_O, setdefaulttimeout_doc},
4202 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004203};
4204
Guido van Rossum30a685f1991-06-27 15:51:29 +00004205
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004206#ifdef MS_WINDOWS
4207#define OS_INIT_DEFINED
4208
4209/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004210
4211static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004212os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004215}
4216
4217static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004218os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 WSADATA WSAData;
4221 int ret;
4222 ret = WSAStartup(0x0101, &WSAData);
4223 switch (ret) {
4224 case 0: /* No error */
4225 Py_AtExit(os_cleanup);
4226 return 1; /* Success */
4227 case WSASYSNOTREADY:
4228 PyErr_SetString(PyExc_ImportError,
4229 "WSAStartup failed: network not ready");
4230 break;
4231 case WSAVERNOTSUPPORTED:
4232 case WSAEINVAL:
4233 PyErr_SetString(
4234 PyExc_ImportError,
4235 "WSAStartup failed: requested version not supported");
4236 break;
4237 default:
4238 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
4239 break;
4240 }
4241 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004242}
4243
Guido van Rossum8d665e61996-06-26 18:22:49 +00004244#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004245
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004246
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004247#ifdef PYOS_OS2
4248#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004249
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004250/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004251
4252static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004253os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004254{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004255#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 if (rc == 0) {
4259 return 1; /* Success */
4260 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004265#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 /* No need to initialise sockets with GCC/EMX */
4267 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004268#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004269}
4270
4271#endif /* PYOS_OS2 */
4272
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004273
4274#ifndef OS_INIT_DEFINED
4275static int
4276os_init(void)
4277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004279}
4280#endif
4281
4282
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004283/* C API table - always add new things to the end for binary
4284 compatibility. */
4285static
4286PySocketModule_APIObject PySocketModuleAPI =
4287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 &sock_type,
4289 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004290};
4291
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004292
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004293/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004294
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004295 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004296 "socket.py" which implements some additional functionality.
4297 The import of "_socket" may fail with an ImportError exception if
4298 os-specific initialization fails. On Windows, this does WINSOCK
4299 initialization. When WINSOCK is initialized succesfully, a call to
4300 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004301*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004303PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004304"Implementation module for socket operations.\n\
4305\n\
4306See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004307
Martin v. Löwis1a214512008-06-11 05:26:20 +00004308static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004309 PyModuleDef_HEAD_INIT,
4310 PySocket_MODULE_NAME,
4311 socket_doc,
4312 -1,
4313 socket_methods,
4314 NULL,
4315 NULL,
4316 NULL,
4317 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004318};
4319
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004320PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004321PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 if (!os_init())
4326 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 Py_TYPE(&sock_type) = &PyType_Type;
4329 m = PyModule_Create(&socketmodule);
4330 if (m == NULL)
4331 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 socket_error = PyErr_NewException("socket.error",
4334 PyExc_IOError, NULL);
4335 if (socket_error == NULL)
4336 return NULL;
4337 PySocketModuleAPI.error = socket_error;
4338 Py_INCREF(socket_error);
4339 PyModule_AddObject(m, "error", socket_error);
4340 socket_herror = PyErr_NewException("socket.herror",
4341 socket_error, NULL);
4342 if (socket_herror == NULL)
4343 return NULL;
4344 Py_INCREF(socket_herror);
4345 PyModule_AddObject(m, "herror", socket_herror);
4346 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4347 NULL);
4348 if (socket_gaierror == NULL)
4349 return NULL;
4350 Py_INCREF(socket_gaierror);
4351 PyModule_AddObject(m, "gaierror", socket_gaierror);
4352 socket_timeout = PyErr_NewException("socket.timeout",
4353 socket_error, NULL);
4354 if (socket_timeout == NULL)
4355 return NULL;
4356 Py_INCREF(socket_timeout);
4357 PyModule_AddObject(m, "timeout", socket_timeout);
4358 Py_INCREF((PyObject *)&sock_type);
4359 if (PyModule_AddObject(m, "SocketType",
4360 (PyObject *)&sock_type) != 0)
4361 return NULL;
4362 Py_INCREF((PyObject *)&sock_type);
4363 if (PyModule_AddObject(m, "socket",
4364 (PyObject *)&sock_type) != 0)
4365 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00004366
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004367#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004369#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 Py_INCREF(has_ipv6);
4373 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004375 /* Export C API */
4376 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4377 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4378 ) != 0)
4379 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004382#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004386#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004388#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004389#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004391#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004392#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 /* Amateur Radio AX.25 */
4394 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004395#endif
4396#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004398#endif
4399#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004400 /* Appletalk DDP */
4401 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004402#endif
4403#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 /* Amateur radio NetROM */
4405 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004406#endif
4407#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 /* Multiprotocol bridge */
4409 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004410#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004411#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 /* ATM PVCs */
4413 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004414#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004415#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 /* Reserved for Werner's ATM */
4417 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004418#endif
4419#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 /* Reserved for X.25 project */
4421 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004422#endif
4423#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004425#endif
4426#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 /* Amateur Radio X.25 PLP */
4428 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004429#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004430#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 /* Reserved for DECnet project */
4432 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004433#endif
4434#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 /* Reserved for 802.2LLC project */
4436 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004437#endif
4438#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 /* Security callback pseudo AF */
4440 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004441#endif
4442#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 /* PF_KEY key management API */
4444 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004445#endif
4446#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 /* */
4448 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4449 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004450#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004452#endif
4453#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4457 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004458#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004460#endif
4461#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004463#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004464#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004466#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004467#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004469#endif
4470#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004474#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004475 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004476#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004477#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004479#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004480#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004481#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 /* Alias to emulate 4.4BSD */
4483 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004484#endif
4485#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 /* Ash */
4487 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004488#endif
4489#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 /* Acorn Econet */
4491 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004492#endif
4493#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 /* ATM SVCs */
4495 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004496#endif
4497#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 /* Linux SNA Project (nutters!) */
4499 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004500#endif
4501#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 /* IRDA sockets */
4503 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004504#endif
4505#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 /* PPPoX sockets */
4507 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004508#endif
4509#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 /* Wanpipe API Sockets */
4511 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004512#endif
4513#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 /* Linux LLC */
4515 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004516#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004517
Hye-Shik Chang81268602004-02-02 06:05:24 +00004518#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4520 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4521 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4522 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
4523 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004524#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
4526 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4527 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4530 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4531 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004532#endif
4533
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004534#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4536 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4537 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4538 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4539 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4540 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4541 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4542 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4543 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004544#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004545
Christian Heimes043d6f62008-01-07 17:19:16 +00004546#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00004548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 /* for addresses */
4550 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4551 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4552 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00004553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4555 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4556 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00004557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 /* for setsockopt() */
4559 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4560 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4561 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4562 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4563 TIPC_DEST_DROPPABLE);
4564 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00004565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4567 TIPC_LOW_IMPORTANCE);
4568 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4569 TIPC_MEDIUM_IMPORTANCE);
4570 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4571 TIPC_HIGH_IMPORTANCE);
4572 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4573 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00004574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 /* for subscriptions */
4576 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4577 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00004578#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 /* doesn't seem to be available everywhere */
4580 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00004581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4583 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4584 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4585 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4586 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4587 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00004588#endif
4589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 /* Socket types */
4591 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4592 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004593/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4595 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004596#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004598#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600#ifdef SO_DEBUG
4601 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603#ifdef SO_ACCEPTCONN
4604 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606#ifdef SO_REUSEADDR
4607 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004608#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004609#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004611#endif
4612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613#ifdef SO_KEEPALIVE
4614 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616#ifdef SO_DONTROUTE
4617 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619#ifdef SO_BROADCAST
4620 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622#ifdef SO_USELOOPBACK
4623 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625#ifdef SO_LINGER
4626 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628#ifdef SO_OOBINLINE
4629 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631#ifdef SO_REUSEPORT
4632 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634#ifdef SO_SNDBUF
4635 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637#ifdef SO_RCVBUF
4638 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640#ifdef SO_SNDLOWAT
4641 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643#ifdef SO_RCVLOWAT
4644 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646#ifdef SO_SNDTIMEO
4647 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004648#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004649#ifdef SO_RCVTIMEO
4650 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004651#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652#ifdef SO_ERROR
4653 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004654#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655#ifdef SO_TYPE
4656 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658#ifdef SO_SETFIB
4659 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00004660#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 /* Maximum number of connections for "listen" */
4663#ifdef SOMAXCONN
4664 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004665#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004667#endif
4668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 /* Flags for send, recv */
4670#ifdef MSG_OOB
4671 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673#ifdef MSG_PEEK
4674 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676#ifdef MSG_DONTROUTE
4677 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679#ifdef MSG_DONTWAIT
4680 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004681#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682#ifdef MSG_EOR
4683 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685#ifdef MSG_TRUNC
4686 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688#ifdef MSG_CTRUNC
4689 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691#ifdef MSG_WAITALL
4692 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694#ifdef MSG_BTAG
4695 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004696#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697#ifdef MSG_ETAG
4698 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004699#endif
4700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 /* Protocol level and numbers, usable for [gs]etsockopt */
4702#ifdef SOL_SOCKET
4703 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705#ifdef SOL_IP
4706 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004707#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710#ifdef SOL_IPX
4711 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004712#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713#ifdef SOL_AX25
4714 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004716#ifdef SOL_ATALK
4717 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004719#ifdef SOL_NETROM
4720 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722#ifdef SOL_ROSE
4723 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725#ifdef SOL_TCP
4726 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730#ifdef SOL_UDP
4731 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004732#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735#ifdef IPPROTO_IP
4736 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004737#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740#ifdef IPPROTO_HOPOPTS
4741 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743#ifdef IPPROTO_ICMP
4744 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004745#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748#ifdef IPPROTO_IGMP
4749 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751#ifdef IPPROTO_GGP
4752 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754#ifdef IPPROTO_IPV4
4755 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757#ifdef IPPROTO_IPV6
4758 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760#ifdef IPPROTO_IPIP
4761 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763#ifdef IPPROTO_TCP
4764 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004765#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768#ifdef IPPROTO_EGP
4769 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771#ifdef IPPROTO_PUP
4772 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774#ifdef IPPROTO_UDP
4775 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004776#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779#ifdef IPPROTO_IDP
4780 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782#ifdef IPPROTO_HELLO
4783 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785#ifdef IPPROTO_ND
4786 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788#ifdef IPPROTO_TP
4789 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791#ifdef IPPROTO_IPV6
4792 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794#ifdef IPPROTO_ROUTING
4795 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797#ifdef IPPROTO_FRAGMENT
4798 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800#ifdef IPPROTO_RSVP
4801 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803#ifdef IPPROTO_GRE
4804 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806#ifdef IPPROTO_ESP
4807 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809#ifdef IPPROTO_AH
4810 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004811#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812#ifdef IPPROTO_MOBILE
4813 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004814#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815#ifdef IPPROTO_ICMPV6
4816 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818#ifdef IPPROTO_NONE
4819 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821#ifdef IPPROTO_DSTOPTS
4822 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824#ifdef IPPROTO_XTP
4825 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827#ifdef IPPROTO_EON
4828 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830#ifdef IPPROTO_PIM
4831 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833#ifdef IPPROTO_IPCOMP
4834 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004835#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836#ifdef IPPROTO_VRRP
4837 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839#ifdef IPPROTO_BIP
4840 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004841#endif
4842/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843#ifdef IPPROTO_RAW
4844 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004845#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004846 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848#ifdef IPPROTO_MAX
4849 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004850#endif
4851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 /* Some port configuration */
4853#ifdef IPPORT_RESERVED
4854 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004855#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858#ifdef IPPORT_USERRESERVED
4859 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004860#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004862#endif
4863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 /* Some reserved IP v.4 addresses */
4865#ifdef INADDR_ANY
4866 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004867#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870#ifdef INADDR_BROADCAST
4871 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004872#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875#ifdef INADDR_LOOPBACK
4876 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004877#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880#ifdef INADDR_UNSPEC_GROUP
4881 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004882#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885#ifdef INADDR_ALLHOSTS_GROUP
4886 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4887 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004888#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891#ifdef INADDR_MAX_LOCAL_GROUP
4892 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4893 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004894#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897#ifdef INADDR_NONE
4898 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004899#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004901#endif
4902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 /* IPv4 [gs]etsockopt options */
4904#ifdef IP_OPTIONS
4905 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907#ifdef IP_HDRINCL
4908 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910#ifdef IP_TOS
4911 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913#ifdef IP_TTL
4914 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916#ifdef IP_RECVOPTS
4917 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919#ifdef IP_RECVRETOPTS
4920 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922#ifdef IP_RECVDSTADDR
4923 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004925#ifdef IP_RETOPTS
4926 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928#ifdef IP_MULTICAST_IF
4929 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931#ifdef IP_MULTICAST_TTL
4932 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934#ifdef IP_MULTICAST_LOOP
4935 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937#ifdef IP_ADD_MEMBERSHIP
4938 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940#ifdef IP_DROP_MEMBERSHIP
4941 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943#ifdef IP_DEFAULT_MULTICAST_TTL
4944 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4945 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004946#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947#ifdef IP_DEFAULT_MULTICAST_LOOP
4948 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4949 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951#ifdef IP_MAX_MEMBERSHIPS
4952 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004953#endif
4954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4956#ifdef IPV6_JOIN_GROUP
4957 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959#ifdef IPV6_LEAVE_GROUP
4960 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962#ifdef IPV6_MULTICAST_HOPS
4963 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965#ifdef IPV6_MULTICAST_IF
4966 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968#ifdef IPV6_MULTICAST_LOOP
4969 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971#ifdef IPV6_UNICAST_HOPS
4972 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00004975#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00004979#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004981#endif
4982#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004984#endif
4985#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004987#endif
4988#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004990#endif
4991#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004992 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004993#endif
4994#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004996#endif
4997#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00004999#endif
5000#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005002#endif
5003#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005005#endif
5006#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005008#endif
5009#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005011#endif
5012#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005014#endif
5015#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005017#endif
5018#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005020#endif
5021#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005023#endif
5024#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005026#endif
5027#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005029#endif
5030#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005032#endif
5033#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005035#endif
5036#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005038#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 /* TCP options */
5041#ifdef TCP_NODELAY
5042 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044#ifdef TCP_MAXSEG
5045 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047#ifdef TCP_CORK
5048 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050#ifdef TCP_KEEPIDLE
5051 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053#ifdef TCP_KEEPINTVL
5054 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056#ifdef TCP_KEEPCNT
5057 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059#ifdef TCP_SYNCNT
5060 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005062#ifdef TCP_LINGER2
5063 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065#ifdef TCP_DEFER_ACCEPT
5066 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068#ifdef TCP_WINDOW_CLAMP
5069 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071#ifdef TCP_INFO
5072 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074#ifdef TCP_QUICKACK
5075 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005076#endif
5077
Guido van Rossum09be4091999-08-09 14:40:40 +00005078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 /* IPX options */
5080#ifdef IPX_TYPE
5081 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005082#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005085#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005087#endif
5088#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005090#endif
5091#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005093#endif
5094#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005096#endif
5097#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005099#endif
5100#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005102#endif
5103#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005105#endif
5106#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005108#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005109#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005111#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005112#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005114#endif
5115#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005117#endif
5118#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005120#endif
5121#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005123#endif
5124#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005126#endif
5127#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005129#endif
5130#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005132#endif
5133#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005135#endif
5136#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005138#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005139#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005141#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005142#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005144#endif
5145#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005147#endif
5148#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005150#endif
5151#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005153#endif
5154#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005156#endif
5157#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005159#endif
5160#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005162#endif
5163#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005165#endif
5166#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005168#endif
5169#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005171#endif
5172#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005174#endif
5175#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005177#endif
5178#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005180#endif
5181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005183#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005185#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005187#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005189#endif
5190#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005192#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005194#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005196#endif
5197#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005199#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005201#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005203#endif
5204
Christian Heimesfaf2f632008-01-06 16:59:19 +00005205#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 {
5207 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5208 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5209 int i;
5210 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5211 PyObject *tmp;
5212 tmp = PyLong_FromUnsignedLong(codes[i]);
5213 if (tmp == NULL)
5214 return NULL;
5215 PyModule_AddObject(m, names[i], tmp);
5216 }
5217 }
5218 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5219 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5220 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005221#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005223#endif
5224#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00005226#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00005227#endif /* _MSTCPIP_ */
5228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005230#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005234}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005235
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005236
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005237#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00005238#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005239
5240/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005241/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005242
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005243int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005244inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00005247#if (SIZEOF_INT != 4)
5248#error "Not sure if in_addr_t exists and int is not 32-bits."
5249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 unsigned int packed_addr;
5251 packed_addr = inet_addr(src);
5252 if (packed_addr == INADDR_NONE)
5253 return 0;
5254 memcpy(dst, &packed_addr, 4);
5255 return 1;
5256 }
5257 /* Should set errno to EAFNOSUPPORT */
5258 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005259}
5260
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005261const char *
5262inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 if (af == AF_INET) {
5265 struct in_addr packed_addr;
5266 if (size < 16)
5267 /* Should set errno to ENOSPC. */
5268 return NULL;
5269 memcpy(&packed_addr, src, sizeof(packed_addr));
5270 return strncpy(dst, inet_ntoa(packed_addr), size);
5271 }
5272 /* Should set errno to EAFNOSUPPORT */
5273 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005274}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005275
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005276#endif
Christian Heimesb6150692007-11-15 23:37:07 +00005277#endif