blob: f56e9afd52d0f55fb51748e1b2429338997e1ed1 [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)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000098#undef MAX
99#define MAX(x, y) ((x) < (y) ? (y) : (x))
100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103"socket([family[, type[, proto]]]) -> socket object\n\
104\n\
105Open a socket of the given type. The family argument specifies the\n\
106address family; it defaults to AF_INET. The type argument specifies\n\
107whether this is a stream (SOCK_STREAM, this is the default)\n\
108or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
109specifying the default protocol. Keyword arguments are accepted.\n\
110\n\
111A socket object represents one endpoint of a network connection.\n\
112\n\
113Methods of socket objects (keyword arguments not allowed):\n\
114\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116bind(addr) -- bind the socket to a local address\n\
117close() -- close the socket\n\
118connect(addr) -- connect the socket to a remote address\n\
119connect_ex(addr) -- connect, return an error code instead of an exception\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000120_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121fileno() -- return underlying file descriptor\n\
122getpeername() -- return remote address [*]\n\
123getsockname() -- return local address\n\
124getsockopt(level, optname[, buflen]) -- get socket options\n\
125gettimeout() -- return timeout or None\n\
126listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000130recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132sendall(data[, flags]) -- send all data\n\
133send(data[, flags]) -- send data, may not send all of it\n\
134sendto(data[, flags], addr) -- send data to a given address\n\
135setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
136setsockopt(level, optname, value) -- set socket options\n\
137settimeout(None | float) -- set or clear the timeout\n\
138shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700139if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700140if_nametoindex(name) -- return the corresponding interface index\n\
141if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000144
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000145/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000146 I hope some day someone can clean this up please... */
147
Guido van Rossum9376b741999-09-15 22:01:40 +0000148/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
149 script doesn't get this right, so we hardcode some platform checks below.
150 On the other hand, not all Linux versions agree, so there the settings
151 computed by the configure script are needed! */
152
153#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# undef HAVE_GETHOSTBYNAME_R_3_ARG
155# undef HAVE_GETHOSTBYNAME_R_5_ARG
156# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000157#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000158
Victor Stinner710d27e2011-08-23 10:57:32 +0200159#if defined(__OpenBSD__)
160# include <sys/uio.h>
161#endif
162
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#endif
166
Guido van Rossume7de2061999-03-24 17:24:33 +0000167#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100168# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# define HAVE_GETHOSTBYNAME_R_3_ARG
170# elif defined(__sun) || defined(__sgi)
171# define HAVE_GETHOSTBYNAME_R_5_ARG
172# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# else
175# undef HAVE_GETHOSTBYNAME_R
176# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000177#endif
178
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000179#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
180 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000182#endif
183
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000184/* To use __FreeBSD_version */
185#ifdef HAVE_SYS_PARAM_H
186#include <sys/param.h>
187#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000188/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000189 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#if defined(WITH_THREAD) && (defined(__APPLE__) || \
191 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000192 defined(__OpenBSD__) || defined(__NetBSD__) || \
193 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000194#define USE_GETADDRINFO_LOCK
195#endif
196
197#ifdef USE_GETADDRINFO_LOCK
198#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
199#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
200#else
201#define ACQUIRE_GETADDRINFO_LOCK
202#define RELEASE_GETADDRINFO_LOCK
203#endif
204
205#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000207#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000209#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000210# include <types.h>
211# include <io.h>
212# include <sys/ioctl.h>
213# include <utils.h>
214# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000215#endif
216
Martin v. Löwis9e437302002-12-06 12:57:26 +0000217#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000218# include <ioctl.h>
219#endif
220
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000221#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222# define INCL_DOS
223# define INCL_DOSERRORS
224# define INCL_NOPMAPI
225# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#endif
227
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000229/* make sure that the reentrant (gethostbyaddr_r etc)
230 functions are declared correctly if compiling with
231 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000232
Thomas Wouters477c8d52006-05-27 19:21:47 +0000233/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000234 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000235#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000236#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000237
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000238#undef _XOPEN_SOURCE
239#include <sys/socket.h>
240#include <sys/types.h>
241#include <netinet/in.h>
242#ifdef _SS_ALIGNSIZE
243#define HAVE_GETADDRINFO 1
244#define HAVE_GETNAMEINFO 1
245#endif
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#define HAVE_INET_PTON
248#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249#endif
250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* Irix 6.5 fails to define this variable at all. This is needed
252 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000253 are just busted. Same thing for Solaris. */
254#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000255#define INET_ADDRSTRLEN 16
256#endif
257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700263#ifdef HAVE_SYS_SOCKET_H
264#include <sys/socket.h>
265#endif
266
267#ifdef HAVE_NET_IF_H
268#include <net/if.h>
269#endif
270
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000271/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000273#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Addressing includes */
276
Guido van Rossum6f489d91996-06-28 20:15:15 +0000277#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278
279/* Non-MS WINDOWS includes */
280# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000281# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000282
Guido van Rossum9376b741999-09-15 22:01:40 +0000283/* Headers needed for inet_ntoa() and inet_addr() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000284# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000286typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000296# ifdef HAVE_FCNTL_H
297# include <fcntl.h>
298# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Jeremy Hylton22308652001-02-02 03:23:09 +0000300#endif
301
Skip Montanaro7befb992004-02-10 16:50:21 +0000302#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000303
304#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000306#endif
307
Neal Norwitz39d22e52002-11-02 19:55:21 +0000308#ifndef O_NONBLOCK
309# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000310#endif
311
Trent Micka708d6e2004-09-07 17:48:26 +0000312/* include Python's addrinfo.h unless it causes trouble */
313#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
314 /* Do not include addinfo.h on some newer IRIX versions.
315 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
316 * for example, but not by 6.5.10.
317 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000318#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000319 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
320 * EAI_* constants are defined in (the already included) ws2tcpip.h.
321 */
322#else
323# include "addrinfo.h"
324#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000325
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000326#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000327#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000328int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000329const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000330#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000331#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000332
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000333#ifdef __APPLE__
334/* On OS X, getaddrinfo returns no error indication of lookup
335 failure, so we must use the emulation instead of the libinfo
336 implementation. Unfortunately, performing an autoconf test
337 for this bug would require DNS access for the machine performing
338 the configuration, which is not acceptable. Therefore, we
339 determine the bug just by checking for __APPLE__. If this bug
340 gets ever fixed, perhaps checking for sys/version.h would be
341 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000342#ifndef HAVE_GETNAMEINFO
343/* This bug seems to be fixed in Jaguar. Ths easiest way I could
344 Find to check for Jaguar is that it has getnameinfo(), which
345 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348
349#ifdef HAVE_INET_ATON
350#define USE_INET_ATON_WEAKLINK
351#endif
352
Jack Jansen84262fb2002-07-02 14:40:42 +0000353#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357/* avoid clashes with the C library definition of the symbol. */
358#define getaddrinfo fake_getaddrinfo
359#define gai_strerror fake_gai_strerror
360#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000361#include "getaddrinfo.c"
362#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000364#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000365#include "getnameinfo.c"
366#endif
367
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000368#ifdef MS_WINDOWS
369/* On Windows a socket is really a handle not an fd */
370static SOCKET
371dup_socket(SOCKET handle)
372{
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000373 WSAPROTOCOL_INFO info;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000374
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000375 if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 return INVALID_SOCKET;
Daniel Stutzbach6c765282010-09-03 12:38:33 +0000377
378 return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
379 FROM_PROTOCOL_INFO, &info, 0, 0);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000380}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000381#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000382#else
383/* On Unix we can use dup to duplicate the file descriptor of a socket*/
384#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000385#endif
386
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000387#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000388#define EAFNOSUPPORT WSAEAFNOSUPPORT
389#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000390#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000391
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000392#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000393#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000394#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000395#endif
396
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000397#ifndef SOCKETCLOSE
398#define SOCKETCLOSE close
399#endif
400
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000401#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define USE_BLUETOOTH 1
403#if defined(__FreeBSD__)
404#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
405#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000407#define SOL_HCI SOL_HCI_RAW
408#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define sockaddr_l2 sockaddr_l2cap
410#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000411#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000415#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416#define sockaddr_l2 sockaddr_bt
417#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000418#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000419#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000420#define SOL_HCI BTPROTO_HCI
421#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000425#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000426#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
428#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000429#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000430#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
431#endif
432#endif
433
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434#ifdef __VMS
435/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
436#define SEGMENT_SIZE (32 * 1024 -1)
437#endif
438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439#define SAS2SA(x) ((struct sockaddr *)(x))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440
Martin v. Löwise9416172003-05-03 10:12:45 +0000441/*
442 * Constants for getnameinfo()
443 */
444#if !defined(NI_MAXHOST)
445#define NI_MAXHOST 1025
446#endif
447#if !defined(NI_MAXSERV)
448#define NI_MAXSERV 32
449#endif
450
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000451#ifndef INVALID_SOCKET /* MS defines this */
452#define INVALID_SOCKET (-1)
453#endif
454
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000455/* XXX There's a problem here: *static* functions are not supposed to have
456 a Py prefix (or use CapitalizedWords). Later... */
457
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458/* Global variable holding the exception type for errors detected
459 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000460static PyObject *socket_error;
461static PyObject *socket_herror;
462static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000463static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464
Tim Peters643a7fc2002-02-17 04:13:21 +0000465/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466 The sock_type variable contains pointers to various functions,
467 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000468 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000469static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000470
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#if defined(HAVE_POLL_H)
472#include <poll.h>
473#elif defined(HAVE_SYS_POLL_H)
474#include <sys/poll.h>
475#endif
476
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000477/* Largest value to try to store in a socklen_t (used when handling
478 ancillary data). POSIX requires socklen_t to hold at least
479 (2**31)-1 and recommends against storing larger values, but
480 socklen_t was originally int in the BSD interface, so to be on the
481 safe side we use the smaller of (2**31)-1 and INT_MAX. */
482#if INT_MAX > 0x7fffffff
483#define SOCKLEN_T_LIMIT 0x7fffffff
484#else
485#define SOCKLEN_T_LIMIT INT_MAX
486#endif
487
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200488#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000489/* Instead of select(), we'll use poll() since poll() works on any fd. */
490#define IS_SELECTABLE(s) 1
491/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000492#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200493/* If there's no timeout left, we don't have to call select, so it's a safe,
494 * little white lie. */
495#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000496#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000497
498static PyObject*
499select_error(void)
500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 PyErr_SetString(socket_error, "unable to select on socket");
502 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000503}
504
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000505#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000506#ifndef WSAEAGAIN
507#define WSAEAGAIN WSAEWOULDBLOCK
508#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000509#define CHECK_ERRNO(expected) \
510 (WSAGetLastError() == WSA ## expected)
511#else
512#define CHECK_ERRNO(expected) \
513 (errno == expected)
514#endif
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516/* Convenience function to raise an error according to errno
517 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000522#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 int err_no = WSAGetLastError();
524 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
525 recognizes the error codes used by both GetLastError() and
526 WSAGetLastError */
527 if (err_no)
528 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000529#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000530
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000531#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 if (sock_errno() != NO_ERROR) {
533 APIRET rc;
534 ULONG msglen;
535 char outbuf[100];
536 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 /* Retrieve socket-related error message from MPTN.MSG file */
539 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
540 myerrorcode - SOCBASEERR + 26,
541 "mptn.msg",
542 &msglen);
543 if (rc == NO_ERROR) {
544 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* OS/2 doesn't guarantee a terminator */
547 outbuf[msglen] = '\0';
548 if (strlen(outbuf) > 0) {
549 /* If non-empty msg, trim CRLF */
550 char *lastc = &outbuf[ strlen(outbuf)-1 ];
551 while (lastc > outbuf &&
552 isspace(Py_CHARMASK(*lastc))) {
553 /* Trim trailing whitespace (CRLF) */
554 *lastc-- = '\0';
555 }
556 }
557 v = Py_BuildValue("(is)", myerrorcode, outbuf);
558 if (v != NULL) {
559 PyErr_SetObject(socket_error, v);
560 Py_DECREF(v);
561 }
562 return NULL;
563 }
564 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000565#endif
566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568}
569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000572set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575
576#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (v != NULL) {
582 PyErr_SetObject(socket_herror, v);
583 Py_DECREF(v);
584 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587}
588
589
590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000591set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594
Martin v. Löwis272cb402002-03-01 08:31:07 +0000595#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 /* EAI_SYSTEM is not available on Windows XP. */
597 if (error == EAI_SYSTEM)
598 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000599#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000601#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000603#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (v != NULL) {
607 PyErr_SetObject(socket_gaierror, v);
608 Py_DECREF(v);
609 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612}
613
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000614#ifdef __VMS
615/* Function to send in segments */
616static int
617sendsegmented(int sock_fd, char *buf, int len, int flags)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 int n = 0;
620 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 while (remaining > 0) {
623 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
626 n = send(sock_fd, buf, segment, flags);
627 if (n < 0) {
628 return n;
629 }
630 remaining -= segment;
631 buf += segment;
632 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635}
636#endif
637
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000638/* Function to perform the setting of socket blocking mode
639 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640static int
641internal_setblocking(PySocketSockObject *s, int block)
642{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000646#ifdef SOCK_NONBLOCK
647 if (block)
648 s->sock_type &= (~SOCK_NONBLOCK);
649 else
650 s->sock_type |= SOCK_NONBLOCK;
651#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#ifndef MS_WINDOWS
655#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 block = !block;
657 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000658#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 block = !block;
660 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000661#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
663 if (block)
664 delay_flag &= (~O_NONBLOCK);
665 else
666 delay_flag |= O_NONBLOCK;
667 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668#endif /* !PYOS_OS2 */
669#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 block = !block;
671 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* Since these don't return anything */
676 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677}
678
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000680 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000681 This does not raise an exception; we'll let our caller do that
682 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000684static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Nothing to do unless we're in timeout mode (not non-blocking) */
690 if (s->sock_timeout <= 0.0)
691 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 /* Guard against closed socket */
694 if (s->sock_fd < 0)
695 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000696
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000697 /* Handling this condition here simplifies the select loops */
698 if (interval < 0.0)
699 return 1;
700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 /* Prefer poll, if available, since you can poll() any fd
702 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 {
705 struct pollfd pollfd;
706 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 pollfd.fd = s->sock_fd;
709 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000712 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 n = poll(&pollfd, 1, timeout);
714 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 {
717 /* Construct the arguments to select */
718 fd_set fds;
719 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000720 tv.tv_sec = (int)interval;
721 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 FD_ZERO(&fds);
723 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 /* See if the socket is ready */
726 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000727 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
728 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000730 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
731 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (n < 0)
736 return -1;
737 if (n == 0)
738 return 1;
739 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000740}
741
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000742static int
743internal_select(PySocketSockObject *s, int writing)
744{
745 return internal_select_ex(s, writing, s->sock_timeout);
746}
747
748/*
749 Two macros for automatic retry of select() in case of false positives
750 (for example, select() could indicate a socket is ready for reading
751 but the data then discarded by the OS because of a wrong checksum).
752 Here is an example of use:
753
754 BEGIN_SELECT_LOOP(s)
755 Py_BEGIN_ALLOW_THREADS
756 timeout = internal_select_ex(s, 0, interval);
757 if (!timeout)
758 outlen = recv(s->sock_fd, cbuf, len, flags);
759 Py_END_ALLOW_THREADS
760 if (timeout == 1) {
761 PyErr_SetString(socket_timeout, "timed out");
762 return -1;
763 }
764 END_SELECT_LOOP(s)
765*/
766
767#define BEGIN_SELECT_LOOP(s) \
768 { \
769 _PyTime_timeval now, deadline = {0, 0}; \
770 double interval = s->sock_timeout; \
771 int has_timeout = s->sock_timeout > 0.0; \
772 if (has_timeout) { \
773 _PyTime_gettimeofday(&now); \
774 deadline = now; \
775 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
776 } \
777 while (1) { \
778 errno = 0; \
779
780#define END_SELECT_LOOP(s) \
781 if (!has_timeout || \
782 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
783 break; \
784 _PyTime_gettimeofday(&now); \
785 interval = _PyTime_INTERVAL(now, deadline); \
786 } \
787 } \
788
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000789/* Initialize a new socket object. */
790
Tim Petersa12b4cf2002-07-18 22:38:44 +0000791static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000792
Martin v. Löwis1a214512008-06-11 05:26:20 +0000793static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000794init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 s->sock_fd = fd;
798 s->sock_family = family;
799 s->sock_type = type;
800 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000803#ifdef SOCK_NONBLOCK
804 if (type & SOCK_NONBLOCK)
805 s->sock_timeout = 0.0;
806 else
807#endif
808 {
809 s->sock_timeout = defaulttimeout;
810 if (defaulttimeout >= 0.0)
811 internal_setblocking(s, 0);
812 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000813
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000814}
815
816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817/* Create a new socket object.
818 This just creates the object and initializes it.
819 If the creation fails, return NULL and set an exception (implicit
820 in NEWOBJ()). */
821
Guido van Rossum73624e91994-10-10 17:59:00 +0000822static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000823new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 PySocketSockObject *s;
826 s = (PySocketSockObject *)
827 PyType_GenericNew(&sock_type, NULL, NULL);
828 if (s != NULL)
829 init_sockobject(s, fd, family, type, proto);
830 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossum48a680c2001-03-02 06:34:14 +0000834/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000835 thread to be in gethostbyname or getaddrinfo */
836#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
837PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000838#endif
839
840
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841/* Convert a string specifying a host name or one of a few symbolic
842 names to a numeric IP address. This usually calls gethostbyname()
843 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000844 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 an error occurred; then an exception is raised. */
846
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000848setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 struct addrinfo hints, *res;
851 int error;
852 int d1, d2, d3, d4;
853 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
856 if (name[0] == '\0') {
857 int siz;
858 memset(&hints, 0, sizeof(hints));
859 hints.ai_family = af;
860 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
861 hints.ai_flags = AI_PASSIVE;
862 Py_BEGIN_ALLOW_THREADS
863 ACQUIRE_GETADDRINFO_LOCK
864 error = getaddrinfo(NULL, "0", &hints, &res);
865 Py_END_ALLOW_THREADS
866 /* We assume that those thread-unsafe getaddrinfo() versions
867 *are* safe regarding their return value, ie. that a
868 subsequent call to getaddrinfo() does not destroy the
869 outcome of the first call. */
870 RELEASE_GETADDRINFO_LOCK
871 if (error) {
872 set_gaierror(error);
873 return -1;
874 }
875 switch (res->ai_family) {
876 case AF_INET:
877 siz = 4;
878 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000879#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 case AF_INET6:
881 siz = 16;
882 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 default:
885 freeaddrinfo(res);
886 PyErr_SetString(socket_error,
887 "unsupported address family");
888 return -1;
889 }
890 if (res->ai_next) {
891 freeaddrinfo(res);
892 PyErr_SetString(socket_error,
893 "wildcard resolved to multiple address");
894 return -1;
895 }
896 if (res->ai_addrlen < addr_ret_size)
897 addr_ret_size = res->ai_addrlen;
898 memcpy(addr_ret, res->ai_addr, addr_ret_size);
899 freeaddrinfo(res);
900 return siz;
901 }
902 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
903 struct sockaddr_in *sin;
904 if (af != AF_INET && af != AF_UNSPEC) {
905 PyErr_SetString(socket_error,
906 "address family mismatched");
907 return -1;
908 }
909 sin = (struct sockaddr_in *)addr_ret;
910 memset((void *) sin, '\0', sizeof(*sin));
911 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000912#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 sin->sin_addr.s_addr = INADDR_BROADCAST;
916 return sizeof(sin->sin_addr);
917 }
918 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
919 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
920 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
921 struct sockaddr_in *sin;
922 sin = (struct sockaddr_in *)addr_ret;
923 sin->sin_addr.s_addr = htonl(
924 ((long) d1 << 24) | ((long) d2 << 16) |
925 ((long) d3 << 8) | ((long) d4 << 0));
926 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000927#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 return 4;
931 }
932 memset(&hints, 0, sizeof(hints));
933 hints.ai_family = af;
934 Py_BEGIN_ALLOW_THREADS
935 ACQUIRE_GETADDRINFO_LOCK
936 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000937#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (error == EAI_NONAME && af == AF_UNSPEC) {
939 /* On Tru64 V5.1, numeric-to-addr conversion fails
940 if no address family is given. Assume IPv4 for now.*/
941 hints.ai_family = AF_INET;
942 error = getaddrinfo(name, NULL, &hints, &res);
943 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 Py_END_ALLOW_THREADS
946 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
947 if (error) {
948 set_gaierror(error);
949 return -1;
950 }
951 if (res->ai_addrlen < addr_ret_size)
952 addr_ret_size = res->ai_addrlen;
953 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
954 freeaddrinfo(res);
955 switch (addr_ret->sa_family) {
956 case AF_INET:
957 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000958#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case AF_INET6:
960 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 default:
963 PyErr_SetString(socket_error, "unknown address family");
964 return -1;
965 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966}
967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969/* Create a string object representing an IP address.
970 This is always a string of the form 'dd.dd.dd.dd' (with variable
971 size numbers). */
972
Guido van Rossum73624e91994-10-10 17:59:00 +0000973static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000974makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 char buf[NI_MAXHOST];
977 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
980 NI_NUMERICHOST);
981 if (error) {
982 set_gaierror(error);
983 return NULL;
984 }
985 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986}
987
988
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000989#ifdef USE_BLUETOOTH
990/* Convert a string representation of a Bluetooth address into a numeric
991 address. Returns the length (6), or raises an exception and returns -1 if
992 an error occurred. */
993
994static int
995setbdaddr(char *name, bdaddr_t *bdaddr)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 unsigned int b0, b1, b2, b3, b4, b5;
998 char ch;
999 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1002 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1003 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1004 bdaddr->b[0] = b0;
1005 bdaddr->b[1] = b1;
1006 bdaddr->b[2] = b2;
1007 bdaddr->b[3] = b3;
1008 bdaddr->b[4] = b4;
1009 bdaddr->b[5] = b5;
1010 return 6;
1011 } else {
1012 PyErr_SetString(socket_error, "bad bluetooth address");
1013 return -1;
1014 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001015}
1016
1017/* Create a string representation of the Bluetooth address. This is always a
1018 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1019 value (zero padded if necessary). */
1020
1021static PyObject *
1022makebdaddr(bdaddr_t *bdaddr)
1023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1027 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1028 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1029 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001030}
1031#endif
1032
1033
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034/* Create an object representing the given socket address,
1035 suitable for passing it back to bind(), connect() etc.
1036 The family field of the sockaddr structure is inspected
1037 to determine what kind of address it really is. */
1038
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001041makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (addrlen == 0) {
1044 /* No address -- may be recvfrom() from known socket */
1045 Py_INCREF(Py_None);
1046 return Py_None;
1047 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case AF_INET:
1052 {
1053 struct sockaddr_in *a;
1054 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1055 PyObject *ret = NULL;
1056 if (addrobj) {
1057 a = (struct sockaddr_in *)addr;
1058 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1059 Py_DECREF(addrobj);
1060 }
1061 return ret;
1062 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001064#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case AF_UNIX:
1066 {
1067 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1070 addrlen -= offsetof(struct sockaddr_un, sun_path);
1071 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1072 }
1073 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 {
1076 /* regular NULL-terminated string */
1077 return PyUnicode_FromString(a->sun_path);
1078 }
1079 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001080#endif /* AF_UNIX */
1081
Martin v. Löwis11017b12006-01-14 18:12:57 +00001082#if defined(AF_NETLINK)
1083 case AF_NETLINK:
1084 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1086 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001087 }
1088#endif /* AF_NETLINK */
1089
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001090#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case AF_INET6:
1092 {
1093 struct sockaddr_in6 *a;
1094 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1095 PyObject *ret = NULL;
1096 if (addrobj) {
1097 a = (struct sockaddr_in6 *)addr;
1098 ret = Py_BuildValue("Oiii",
1099 addrobj,
1100 ntohs(a->sin6_port),
1101 a->sin6_flowinfo,
1102 a->sin6_scope_id);
1103 Py_DECREF(addrobj);
1104 }
1105 return ret;
1106 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001107#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 case AF_BLUETOOTH:
1111 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 case BTPROTO_L2CAP:
1114 {
1115 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1116 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1117 PyObject *ret = NULL;
1118 if (addrobj) {
1119 ret = Py_BuildValue("Oi",
1120 addrobj,
1121 _BT_L2_MEMB(a, psm));
1122 Py_DECREF(addrobj);
1123 }
1124 return ret;
1125 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 case BTPROTO_RFCOMM:
1128 {
1129 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1130 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1131 PyObject *ret = NULL;
1132 if (addrobj) {
1133 ret = Py_BuildValue("Oi",
1134 addrobj,
1135 _BT_RC_MEMB(a, channel));
1136 Py_DECREF(addrobj);
1137 }
1138 return ret;
1139 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 case BTPROTO_HCI:
1142 {
1143 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001144#if defined(__NetBSD__) || defined(__DragonFly__)
1145 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 PyObject *ret = NULL;
1148 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1149 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001152
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 case BTPROTO_SCO:
1155 {
1156 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1157 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1158 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159#endif
1160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 default:
1162 PyErr_SetString(PyExc_ValueError,
1163 "Unknown Bluetooth protocol");
1164 return NULL;
1165 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166#endif
1167
Antoine Pitroub156a462010-10-27 20:13:57 +00001168#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 case AF_PACKET:
1170 {
1171 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1172 char *ifname = "";
1173 struct ifreq ifr;
1174 /* need to look up interface name give index */
1175 if (a->sll_ifindex) {
1176 ifr.ifr_ifindex = a->sll_ifindex;
1177 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1178 ifname = ifr.ifr_name;
1179 }
1180 return Py_BuildValue("shbhy#",
1181 ifname,
1182 ntohs(a->sll_protocol),
1183 a->sll_pkttype,
1184 a->sll_hatype,
1185 a->sll_addr,
1186 a->sll_halen);
1187 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001188#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001189
Christian Heimes043d6f62008-01-07 17:19:16 +00001190#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_TIPC:
1192 {
1193 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1194 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1195 return Py_BuildValue("IIIII",
1196 a->addrtype,
1197 a->addr.nameseq.type,
1198 a->addr.nameseq.lower,
1199 a->addr.nameseq.upper,
1200 a->scope);
1201 } else if (a->addrtype == TIPC_ADDR_NAME) {
1202 return Py_BuildValue("IIIII",
1203 a->addrtype,
1204 a->addr.name.name.type,
1205 a->addr.name.name.instance,
1206 a->addr.name.name.instance,
1207 a->scope);
1208 } else if (a->addrtype == TIPC_ADDR_ID) {
1209 return Py_BuildValue("IIIII",
1210 a->addrtype,
1211 a->addr.id.node,
1212 a->addr.id.ref,
1213 0,
1214 a->scope);
1215 } else {
1216 PyErr_SetString(PyExc_ValueError,
1217 "Invalid address type");
1218 return NULL;
1219 }
1220 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001221#endif
1222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 default:
1226 /* If we don't know the address family, don't raise an
1227 exception -- return it as an (int, bytes) tuple. */
1228 return Py_BuildValue("iy#",
1229 addr->sa_family,
1230 addr->sa_data,
1231 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001234}
1235
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236
1237/* Parse a socket address argument according to the socket object's
1238 address family. Return 1 if the address was in the proper format,
1239 0 of not. The address is returned through addr_ret, its length
1240 through len_ret. */
1241
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001242static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001243getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001247
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001248#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 case AF_UNIX:
1250 {
1251 struct sockaddr_un* addr;
1252 char *path;
1253 int len;
1254 if (!PyArg_Parse(args, "s#", &path, &len))
1255 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001258#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (len > 0 && path[0] == 0) {
1260 /* Linux abstract namespace extension */
1261 if (len > sizeof addr->sun_path) {
1262 PyErr_SetString(socket_error,
1263 "AF_UNIX path too long");
1264 return 0;
1265 }
1266 }
1267 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001268#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 {
1270 /* regular NULL-terminated string */
1271 if (len >= sizeof addr->sun_path) {
1272 PyErr_SetString(socket_error,
1273 "AF_UNIX path too long");
1274 return 0;
1275 }
1276 addr->sun_path[len] = 0;
1277 }
1278 addr->sun_family = s->sock_family;
1279 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001280#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 return 1;
1286 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001287#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288
Martin v. Löwis11017b12006-01-14 18:12:57 +00001289#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 case AF_NETLINK:
1291 {
1292 struct sockaddr_nl* addr;
1293 int pid, groups;
1294 addr = (struct sockaddr_nl *)addr_ret;
1295 if (!PyTuple_Check(args)) {
1296 PyErr_Format(
1297 PyExc_TypeError,
1298 "getsockaddrarg: "
1299 "AF_NETLINK address must be tuple, not %.500s",
1300 Py_TYPE(args)->tp_name);
1301 return 0;
1302 }
1303 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1304 return 0;
1305 addr->nl_family = AF_NETLINK;
1306 addr->nl_pid = pid;
1307 addr->nl_groups = groups;
1308 *len_ret = sizeof(*addr);
1309 return 1;
1310 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001311#endif
1312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 case AF_INET:
1314 {
1315 struct sockaddr_in* addr;
1316 char *host;
1317 int port, result;
1318 if (!PyTuple_Check(args)) {
1319 PyErr_Format(
1320 PyExc_TypeError,
1321 "getsockaddrarg: "
1322 "AF_INET address must be tuple, not %.500s",
1323 Py_TYPE(args)->tp_name);
1324 return 0;
1325 }
1326 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1327 "idna", &host, &port))
1328 return 0;
1329 addr=(struct sockaddr_in*)addr_ret;
1330 result = setipaddr(host, (struct sockaddr *)addr,
1331 sizeof(*addr), AF_INET);
1332 PyMem_Free(host);
1333 if (result < 0)
1334 return 0;
1335 if (port < 0 || port > 0xffff) {
1336 PyErr_SetString(
1337 PyExc_OverflowError,
1338 "getsockaddrarg: port must be 0-65535.");
1339 return 0;
1340 }
1341 addr->sin_family = AF_INET;
1342 addr->sin_port = htons((short)port);
1343 *len_ret = sizeof *addr;
1344 return 1;
1345 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001347#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 case AF_INET6:
1349 {
1350 struct sockaddr_in6* addr;
1351 char *host;
1352 int port, flowinfo, scope_id, result;
1353 flowinfo = scope_id = 0;
1354 if (!PyTuple_Check(args)) {
1355 PyErr_Format(
1356 PyExc_TypeError,
1357 "getsockaddrarg: "
1358 "AF_INET6 address must be tuple, not %.500s",
1359 Py_TYPE(args)->tp_name);
1360 return 0;
1361 }
1362 if (!PyArg_ParseTuple(args, "eti|ii",
1363 "idna", &host, &port, &flowinfo,
1364 &scope_id)) {
1365 return 0;
1366 }
1367 addr = (struct sockaddr_in6*)addr_ret;
1368 result = setipaddr(host, (struct sockaddr *)addr,
1369 sizeof(*addr), AF_INET6);
1370 PyMem_Free(host);
1371 if (result < 0)
1372 return 0;
1373 if (port < 0 || port > 0xffff) {
1374 PyErr_SetString(
1375 PyExc_OverflowError,
1376 "getsockaddrarg: port must be 0-65535.");
1377 return 0;
1378 }
1379 addr->sin6_family = s->sock_family;
1380 addr->sin6_port = htons((short)port);
1381 addr->sin6_flowinfo = flowinfo;
1382 addr->sin6_scope_id = scope_id;
1383 *len_ret = sizeof *addr;
1384 return 1;
1385 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001386#endif
1387
Hye-Shik Chang81268602004-02-02 06:05:24 +00001388#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 case AF_BLUETOOTH:
1390 {
1391 switch (s->sock_proto) {
1392 case BTPROTO_L2CAP:
1393 {
1394 struct sockaddr_l2 *addr;
1395 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 addr = (struct sockaddr_l2 *)addr_ret;
1398 memset(addr, 0, sizeof(struct sockaddr_l2));
1399 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1400 if (!PyArg_ParseTuple(args, "si", &straddr,
1401 &_BT_L2_MEMB(addr, psm))) {
1402 PyErr_SetString(socket_error, "getsockaddrarg: "
1403 "wrong format");
1404 return 0;
1405 }
1406 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1407 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 *len_ret = sizeof *addr;
1410 return 1;
1411 }
1412 case BTPROTO_RFCOMM:
1413 {
1414 struct sockaddr_rc *addr;
1415 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 addr = (struct sockaddr_rc *)addr_ret;
1418 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1419 if (!PyArg_ParseTuple(args, "si", &straddr,
1420 &_BT_RC_MEMB(addr, channel))) {
1421 PyErr_SetString(socket_error, "getsockaddrarg: "
1422 "wrong format");
1423 return 0;
1424 }
1425 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1426 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 *len_ret = sizeof *addr;
1429 return 1;
1430 }
1431 case BTPROTO_HCI:
1432 {
1433 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001434#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001435 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001436
Alexander Belopolskye239d232010-12-08 23:31:48 +00001437 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001438 if (straddr == NULL) {
1439 PyErr_SetString(socket_error, "getsockaddrarg: "
1440 "wrong format");
1441 return 0;
1442 }
1443 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1444 return 0;
1445#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1447 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1448 PyErr_SetString(socket_error, "getsockaddrarg: "
1449 "wrong format");
1450 return 0;
1451 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 *len_ret = sizeof *addr;
1454 return 1;
1455 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001456#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 case BTPROTO_SCO:
1458 {
1459 struct sockaddr_sco *addr;
1460 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 addr = (struct sockaddr_sco *)addr_ret;
1463 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1464 if (!PyBytes_Check(args)) {
1465 PyErr_SetString(socket_error, "getsockaddrarg: "
1466 "wrong format");
1467 return 0;
1468 }
1469 straddr = PyBytes_AS_STRING(args);
1470 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1471 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 *len_ret = sizeof *addr;
1474 return 1;
1475 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 default:
1478 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1479 return 0;
1480 }
1481 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001482#endif
1483
Antoine Pitroub156a462010-10-27 20:13:57 +00001484#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 case AF_PACKET:
1486 {
1487 struct sockaddr_ll* addr;
1488 struct ifreq ifr;
1489 char *interfaceName;
1490 int protoNumber;
1491 int hatype = 0;
1492 int pkttype = 0;
1493 char *haddr = NULL;
1494 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 if (!PyTuple_Check(args)) {
1497 PyErr_Format(
1498 PyExc_TypeError,
1499 "getsockaddrarg: "
1500 "AF_PACKET address must be tuple, not %.500s",
1501 Py_TYPE(args)->tp_name);
1502 return 0;
1503 }
1504 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1505 &protoNumber, &pkttype, &hatype,
1506 &haddr, &halen))
1507 return 0;
1508 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1509 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1510 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1511 s->errorhandler();
1512 return 0;
1513 }
1514 if (halen > 8) {
1515 PyErr_SetString(PyExc_ValueError,
1516 "Hardware address must be 8 bytes or less");
1517 return 0;
1518 }
1519 if (protoNumber < 0 || protoNumber > 0xffff) {
1520 PyErr_SetString(
1521 PyExc_OverflowError,
1522 "getsockaddrarg: protoNumber must be 0-65535.");
1523 return 0;
1524 }
1525 addr = (struct sockaddr_ll*)addr_ret;
1526 addr->sll_family = AF_PACKET;
1527 addr->sll_protocol = htons((short)protoNumber);
1528 addr->sll_ifindex = ifr.ifr_ifindex;
1529 addr->sll_pkttype = pkttype;
1530 addr->sll_hatype = hatype;
1531 if (halen != 0) {
1532 memcpy(&addr->sll_addr, haddr, halen);
1533 }
1534 addr->sll_halen = halen;
1535 *len_ret = sizeof *addr;
1536 return 1;
1537 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001538#endif
1539
Christian Heimes043d6f62008-01-07 17:19:16 +00001540#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 case AF_TIPC:
1542 {
1543 unsigned int atype, v1, v2, v3;
1544 unsigned int scope = TIPC_CLUSTER_SCOPE;
1545 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 if (!PyTuple_Check(args)) {
1548 PyErr_Format(
1549 PyExc_TypeError,
1550 "getsockaddrarg: "
1551 "AF_TIPC address must be tuple, not %.500s",
1552 Py_TYPE(args)->tp_name);
1553 return 0;
1554 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 if (!PyArg_ParseTuple(args,
1557 "IIII|I;Invalid TIPC address format",
1558 &atype, &v1, &v2, &v3, &scope))
1559 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 addr = (struct sockaddr_tipc *) addr_ret;
1562 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 addr->family = AF_TIPC;
1565 addr->scope = scope;
1566 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 if (atype == TIPC_ADDR_NAMESEQ) {
1569 addr->addr.nameseq.type = v1;
1570 addr->addr.nameseq.lower = v2;
1571 addr->addr.nameseq.upper = v3;
1572 } else if (atype == TIPC_ADDR_NAME) {
1573 addr->addr.name.name.type = v1;
1574 addr->addr.name.name.instance = v2;
1575 } else if (atype == TIPC_ADDR_ID) {
1576 addr->addr.id.node = v1;
1577 addr->addr.id.ref = v2;
1578 } else {
1579 /* Shouldn't happen */
1580 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1581 return 0;
1582 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 return 1;
1587 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001588#endif
1589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 default:
1593 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1594 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597}
1598
Guido van Rossum30a685f1991-06-27 15:51:29 +00001599
Guido van Rossum48a680c2001-03-02 06:34:14 +00001600/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001601 Return 1 if the family is known, 0 otherwise. The length is returned
1602 through len_ret. */
1603
1604static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001605getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001608
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001609#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 case AF_UNIX:
1611 {
1612 *len_ret = sizeof (struct sockaddr_un);
1613 return 1;
1614 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001615#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001616#if defined(AF_NETLINK)
1617 case AF_NETLINK:
1618 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 *len_ret = sizeof (struct sockaddr_nl);
1620 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001621 }
1622#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 case AF_INET:
1625 {
1626 *len_ret = sizeof (struct sockaddr_in);
1627 return 1;
1628 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001629
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001630#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 case AF_INET6:
1632 {
1633 *len_ret = sizeof (struct sockaddr_in6);
1634 return 1;
1635 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001636#endif
1637
Hye-Shik Chang81268602004-02-02 06:05:24 +00001638#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 case AF_BLUETOOTH:
1640 {
1641 switch(s->sock_proto)
1642 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 case BTPROTO_L2CAP:
1645 *len_ret = sizeof (struct sockaddr_l2);
1646 return 1;
1647 case BTPROTO_RFCOMM:
1648 *len_ret = sizeof (struct sockaddr_rc);
1649 return 1;
1650 case BTPROTO_HCI:
1651 *len_ret = sizeof (struct sockaddr_hci);
1652 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001653#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 case BTPROTO_SCO:
1655 *len_ret = sizeof (struct sockaddr_sco);
1656 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 default:
1659 PyErr_SetString(socket_error, "getsockaddrlen: "
1660 "unknown BT protocol");
1661 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 }
1664 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001665#endif
1666
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001667#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 case AF_PACKET:
1669 {
1670 *len_ret = sizeof (struct sockaddr_ll);
1671 return 1;
1672 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001673#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001674
Christian Heimes043d6f62008-01-07 17:19:16 +00001675#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 case AF_TIPC:
1677 {
1678 *len_ret = sizeof (struct sockaddr_tipc);
1679 return 1;
1680 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001681#endif
1682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 default:
1686 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1687 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001690}
1691
1692
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001693/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1694 Currently, these methods are only compiled if the RFC 2292/3542
1695 CMSG_LEN() macro is available. Older systems seem to have used
1696 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1697 it may be possible to define CMSG_LEN() that way if it's not
1698 provided. Some architectures might need extra padding after the
1699 cmsghdr, however, and CMSG_LEN() would have to take account of
1700 this. */
1701#ifdef CMSG_LEN
1702/* If length is in range, set *result to CMSG_LEN(length) and return
1703 true; otherwise, return false. */
1704static int
1705get_CMSG_LEN(size_t length, size_t *result)
1706{
1707 size_t tmp;
1708
1709 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1710 return 0;
1711 tmp = CMSG_LEN(length);
1712 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1713 return 0;
1714 *result = tmp;
1715 return 1;
1716}
1717
1718#ifdef CMSG_SPACE
1719/* If length is in range, set *result to CMSG_SPACE(length) and return
1720 true; otherwise, return false. */
1721static int
1722get_CMSG_SPACE(size_t length, size_t *result)
1723{
1724 size_t tmp;
1725
1726 /* Use CMSG_SPACE(1) here in order to take account of the padding
1727 necessary before *and* after the data. */
1728 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1729 return 0;
1730 tmp = CMSG_SPACE(length);
1731 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1732 return 0;
1733 *result = tmp;
1734 return 1;
1735}
1736#endif
1737
1738/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1739 pointer in msg->msg_control with at least "space" bytes after it,
1740 and its cmsg_len member inside the buffer. */
1741static int
1742cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1743{
1744 size_t cmsg_offset;
1745 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1746 sizeof(cmsgh->cmsg_len));
1747
Charles-François Natalib09f25e2011-08-24 20:07:54 +02001748 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001749 return 0;
1750 if (space < cmsg_len_end)
1751 space = cmsg_len_end;
1752 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1753 return (cmsg_offset <= (size_t)-1 - space &&
1754 cmsg_offset + space <= msg->msg_controllen);
1755}
1756
1757/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1758 *space to number of bytes following it in the buffer and return
1759 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1760 msg->msg_controllen are valid. */
1761static int
1762get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1763{
1764 size_t data_offset;
1765 char *data_ptr;
1766
1767 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1768 return 0;
1769 data_offset = data_ptr - (char *)msg->msg_control;
1770 if (data_offset > msg->msg_controllen)
1771 return 0;
1772 *space = msg->msg_controllen - data_offset;
1773 return 1;
1774}
1775
1776/* If cmsgh is invalid or not contained in the buffer pointed to by
1777 msg->msg_control, return -1. If cmsgh is valid and its associated
1778 data is entirely contained in the buffer, set *data_len to the
1779 length of the associated data and return 0. If only part of the
1780 associated data is contained in the buffer but cmsgh is otherwise
1781 valid, set *data_len to the length contained in the buffer and
1782 return 1. */
1783static int
1784get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1785{
1786 size_t space, cmsg_data_len;
1787
1788 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1789 cmsgh->cmsg_len < CMSG_LEN(0))
1790 return -1;
1791 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1792 if (!get_cmsg_data_space(msg, cmsgh, &space))
1793 return -1;
1794 if (space >= cmsg_data_len) {
1795 *data_len = cmsg_data_len;
1796 return 0;
1797 }
1798 *data_len = space;
1799 return 1;
1800}
1801#endif /* CMSG_LEN */
1802
1803
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001804/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001805
Guido van Rossum73624e91994-10-10 17:59:00 +00001806static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001807sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 sock_addr_t addrbuf;
1810 SOCKET_T newfd = INVALID_SOCKET;
1811 socklen_t addrlen;
1812 PyObject *sock = NULL;
1813 PyObject *addr = NULL;
1814 PyObject *res = NULL;
1815 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 if (!getsockaddrlen(s, &addrlen))
1817 return NULL;
1818 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 if (!IS_SELECTABLE(s))
1821 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001822
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001823 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001825 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001826 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001828 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 if (timeout == 1) {
1832 PyErr_SetString(socket_timeout, "timed out");
1833 return NULL;
1834 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001835 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 if (newfd == INVALID_SOCKET)
1838 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 sock = PyLong_FromSocket_t(newfd);
1841 if (sock == NULL) {
1842 SOCKETCLOSE(newfd);
1843 goto finally;
1844 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1847 addrlen, s->sock_proto);
1848 if (addr == NULL)
1849 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001852
Guido van Rossum67f7a382002-06-06 21:08:16 +00001853finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 Py_XDECREF(sock);
1855 Py_XDECREF(addr);
1856 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001857}
1858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001860"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001861\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001862Wait for an incoming connection. Return a new socket file descriptor\n\
1863representing the connection, and the address of the client.\n\
1864For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001865
Guido van Rossum11ba0942002-06-13 15:07:44 +00001866/* s.setblocking(flag) method. Argument:
1867 False -- non-blocking mode; same as settimeout(0)
1868 True -- blocking mode; same as settimeout(None)
1869*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001870
Guido van Rossum73624e91994-10-10 17:59:00 +00001871static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001872sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 block = PyLong_AsLong(arg);
1877 if (block == -1 && PyErr_Occurred())
1878 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 s->sock_timeout = block ? -1.0 : 0.0;
1881 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 Py_INCREF(Py_None);
1884 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001885}
Guido van Rossume4485b01994-09-07 14:32:49 +00001886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001887PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001888"setblocking(flag)\n\
1889\n\
1890Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001891setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001892setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001893
Guido van Rossum11ba0942002-06-13 15:07:44 +00001894/* s.settimeout(timeout) method. Argument:
1895 None -- no timeout, blocking mode; same as setblocking(True)
1896 0.0 -- non-blocking mode; same as setblocking(False)
1897 > 0 -- timeout mode; operations time out after timeout seconds
1898 < 0 -- illegal; raises an exception
1899*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001901sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 if (arg == Py_None)
1906 timeout = -1.0;
1907 else {
1908 timeout = PyFloat_AsDouble(arg);
1909 if (timeout < 0.0) {
1910 if (!PyErr_Occurred())
1911 PyErr_SetString(PyExc_ValueError,
1912 "Timeout value out of range");
1913 return NULL;
1914 }
1915 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 s->sock_timeout = timeout;
1918 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 Py_INCREF(Py_None);
1921 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001922}
1923
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001924PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001925"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001926\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001927Set a timeout on socket operations. 'timeout' can be a float,\n\
1928giving in seconds, or None. Setting a timeout of None disables\n\
1929the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001930Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001931
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001932/* s.gettimeout() method.
1933 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001934static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001935sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 if (s->sock_timeout < 0.0) {
1938 Py_INCREF(Py_None);
1939 return Py_None;
1940 }
1941 else
1942 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001943}
1944
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001945PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001946"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001947\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03001948Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001949operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001951
Guido van Rossumaee08791992-09-08 09:05:33 +00001952/* s.setsockopt() method.
1953 With an integer third argument, sets an integer option.
1954 With a string third argument, sets an option from a buffer;
1955 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001956
Guido van Rossum73624e91994-10-10 17:59:00 +00001957static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001958sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001959{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 int level;
1961 int optname;
1962 int res;
1963 char *buf;
1964 int buflen;
1965 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 if (PyArg_ParseTuple(args, "iii:setsockopt",
1968 &level, &optname, &flag)) {
1969 buf = (char *) &flag;
1970 buflen = sizeof flag;
1971 }
1972 else {
1973 PyErr_Clear();
1974 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
1975 &level, &optname, &buf, &buflen))
1976 return NULL;
1977 }
1978 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1979 if (res < 0)
1980 return s->errorhandler();
1981 Py_INCREF(Py_None);
1982 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001983}
1984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001985PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001986"setsockopt(level, option, value)\n\
1987\n\
1988Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001989The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001991
Guido van Rossumaee08791992-09-08 09:05:33 +00001992/* s.getsockopt() method.
1993 With two arguments, retrieves an integer option.
1994 With a third integer argument, retrieves a string buffer of that size;
1995 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001996
Guido van Rossum73624e91994-10-10 17:59:00 +00001997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 int level;
2001 int optname;
2002 int res;
2003 PyObject *buf;
2004 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2007 &level, &optname, &buflen))
2008 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 if (buflen == 0) {
2011 int flag = 0;
2012 socklen_t flagsize = sizeof flag;
2013 res = getsockopt(s->sock_fd, level, optname,
2014 (void *)&flag, &flagsize);
2015 if (res < 0)
2016 return s->errorhandler();
2017 return PyLong_FromLong(flag);
2018 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002019#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 /* socklen_t is unsigned so no negative test is needed,
2021 test buflen == 0 is previously done */
2022 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002023#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 PyErr_SetString(socket_error,
2027 "getsockopt buflen out of range");
2028 return NULL;
2029 }
2030 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2031 if (buf == NULL)
2032 return NULL;
2033 res = getsockopt(s->sock_fd, level, optname,
2034 (void *)PyBytes_AS_STRING(buf), &buflen);
2035 if (res < 0) {
2036 Py_DECREF(buf);
2037 return s->errorhandler();
2038 }
2039 _PyBytes_Resize(&buf, buflen);
2040 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002041}
2042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002043PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002044"getsockopt(level, option[, buffersize]) -> value\n\
2045\n\
2046Get a socket option. See the Unix manual for level and option.\n\
2047If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002048string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002049
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002050
Fred Drake728819a2000-07-01 03:40:12 +00002051/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002052
Guido van Rossum73624e91994-10-10 17:59:00 +00002053static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002054sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 sock_addr_t addrbuf;
2057 int addrlen;
2058 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2061 return NULL;
2062 Py_BEGIN_ALLOW_THREADS
2063 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2064 Py_END_ALLOW_THREADS
2065 if (res < 0)
2066 return s->errorhandler();
2067 Py_INCREF(Py_None);
2068 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002069}
2070
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002071PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002072"bind(address)\n\
2073\n\
2074Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002075pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002076sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002077
Guido van Rossum30a685f1991-06-27 15:51:29 +00002078
2079/* s.close() method.
2080 Set the file descriptor to -1 so operations tried subsequently
2081 will surely fail. */
2082
Guido van Rossum73624e91994-10-10 17:59:00 +00002083static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002084sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 if ((fd = s->sock_fd) != -1) {
2089 s->sock_fd = -1;
2090 Py_BEGIN_ALLOW_THREADS
2091 (void) SOCKETCLOSE(fd);
2092 Py_END_ALLOW_THREADS
2093 }
2094 Py_INCREF(Py_None);
2095 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002096}
2097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002098PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002099"close()\n\
2100\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002101Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002102
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002103static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002104sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002105{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002106 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002107 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002108 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002109}
2110
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002111PyDoc_STRVAR(detach_doc,
2112"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002113\n\
2114Close the socket object without closing the underlying file descriptor.\
2115The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002116can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002117
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002118static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002119internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 timeout = 0;
2125 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002126
2127#ifdef MS_WINDOWS
2128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 if (s->sock_timeout > 0.0) {
2130 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2131 IS_SELECTABLE(s)) {
2132 /* This is a mess. Best solution: trust select */
2133 fd_set fds;
2134 fd_set fds_exc;
2135 struct timeval tv;
2136 tv.tv_sec = (int)s->sock_timeout;
2137 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2138 FD_ZERO(&fds);
2139 FD_SET(s->sock_fd, &fds);
2140 FD_ZERO(&fds_exc);
2141 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002142 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2143 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 if (res == 0) {
2145 res = WSAEWOULDBLOCK;
2146 timeout = 1;
2147 } else if (res > 0) {
2148 if (FD_ISSET(s->sock_fd, &fds))
2149 /* The socket is in the writable set - this
2150 means connected */
2151 res = 0;
2152 else {
2153 /* As per MS docs, we need to call getsockopt()
2154 to get the underlying error */
2155 int res_size = sizeof res;
2156 /* It must be in the exception set */
2157 assert(FD_ISSET(s->sock_fd, &fds_exc));
2158 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2159 (char *)&res, &res_size))
2160 /* getsockopt also clears WSAGetLastError,
2161 so reset it back. */
2162 WSASetLastError(res);
2163 else
2164 res = WSAGetLastError();
2165 }
2166 }
2167 /* else if (res < 0) an error occurred */
2168 }
2169 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 if (res < 0)
2172 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002173
2174#else
2175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 if (s->sock_timeout > 0.0) {
2177 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2178 timeout = internal_select(s, 1);
2179 if (timeout == 0) {
2180 /* Bug #1019808: in case of an EINPROGRESS,
2181 use getsockopt(SO_ERROR) to get the real
2182 error. */
2183 socklen_t res_size = sizeof res;
2184 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2185 SO_ERROR, &res, &res_size);
2186 if (res == EISCONN)
2187 res = 0;
2188 errno = res;
2189 }
2190 else if (timeout == -1) {
2191 res = errno; /* had error */
2192 }
2193 else
2194 res = EWOULDBLOCK; /* timed out */
2195 }
2196 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 if (res < 0)
2199 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002200
2201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002205}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002206
Fred Drake728819a2000-07-01 03:40:12 +00002207/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002208
Guido van Rossum73624e91994-10-10 17:59:00 +00002209static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002210sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 sock_addr_t addrbuf;
2213 int addrlen;
2214 int res;
2215 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2218 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 Py_BEGIN_ALLOW_THREADS
2221 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2222 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 if (timeout == 1) {
2225 PyErr_SetString(socket_timeout, "timed out");
2226 return NULL;
2227 }
2228 if (res != 0)
2229 return s->errorhandler();
2230 Py_INCREF(Py_None);
2231 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002232}
2233
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002234PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002235"connect(address)\n\
2236\n\
2237Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002238is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002239
Guido van Rossum30a685f1991-06-27 15:51:29 +00002240
Fred Drake728819a2000-07-01 03:40:12 +00002241/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002242
2243static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002244sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 sock_addr_t addrbuf;
2247 int addrlen;
2248 int res;
2249 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2252 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 Py_BEGIN_ALLOW_THREADS
2255 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2256 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 /* Signals are not errors (though they may raise exceptions). Adapted
2259 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002260#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 if (res == EINTR && PyErr_CheckSignals())
2262 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002263#endif
2264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002266}
2267
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002268PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002269"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002270\n\
2271This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002272instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002273
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002274
Guido van Rossumed233a51992-06-23 09:07:03 +00002275/* s.fileno() method */
2276
Guido van Rossum73624e91994-10-10 17:59:00 +00002277static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002278sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002281}
2282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002283PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002284"fileno() -> integer\n\
2285\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002286Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002287
Guido van Rossumed233a51992-06-23 09:07:03 +00002288
Guido van Rossumc89705d1992-11-26 08:54:07 +00002289/* s.getsockname() method */
2290
Guido van Rossum73624e91994-10-10 17:59:00 +00002291static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002292sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 sock_addr_t addrbuf;
2295 int res;
2296 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 if (!getsockaddrlen(s, &addrlen))
2299 return NULL;
2300 memset(&addrbuf, 0, addrlen);
2301 Py_BEGIN_ALLOW_THREADS
2302 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2303 Py_END_ALLOW_THREADS
2304 if (res < 0)
2305 return s->errorhandler();
2306 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2307 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002308}
2309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002310PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002311"getsockname() -> address info\n\
2312\n\
2313Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002314info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002315
Guido van Rossumc89705d1992-11-26 08:54:07 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002318/* s.getpeername() method */
2319
Guido van Rossum73624e91994-10-10 17:59:00 +00002320static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002321sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 sock_addr_t addrbuf;
2324 int res;
2325 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 if (!getsockaddrlen(s, &addrlen))
2328 return NULL;
2329 memset(&addrbuf, 0, addrlen);
2330 Py_BEGIN_ALLOW_THREADS
2331 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2332 Py_END_ALLOW_THREADS
2333 if (res < 0)
2334 return s->errorhandler();
2335 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2336 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002337}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002338
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002339PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002340"getpeername() -> address info\n\
2341\n\
2342Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344
Guido van Rossumb6775db1994-08-01 11:34:53 +00002345#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002346
2347
Guido van Rossum30a685f1991-06-27 15:51:29 +00002348/* s.listen(n) method */
2349
Guido van Rossum73624e91994-10-10 17:59:00 +00002350static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002351sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 int backlog;
2354 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 backlog = PyLong_AsLong(arg);
2357 if (backlog == -1 && PyErr_Occurred())
2358 return NULL;
2359 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002360 /* To avoid problems on systems that don't allow a negative backlog
2361 * (which doesn't make sense anyway) we force a minimum value of 0. */
2362 if (backlog < 0)
2363 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 res = listen(s->sock_fd, backlog);
2365 Py_END_ALLOW_THREADS
2366 if (res < 0)
2367 return s->errorhandler();
2368 Py_INCREF(Py_None);
2369 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002370}
2371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002372PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002373"listen(backlog)\n\
2374\n\
2375Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002376least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2377unaccepted connections that the system will allow before refusing new\n\
2378connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002379
2380
Thomas Wouters477c8d52006-05-27 19:21:47 +00002381/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002382 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002383 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002384 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002385 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002386 * also possible that we return a number of bytes smaller than the request
2387 * bytes.
2388 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002389
Antoine Pitrou19467d22010-08-17 19:33:30 +00002390static Py_ssize_t
2391sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002392{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002393 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002395#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 int remaining;
2397 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002398#endif
2399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 if (!IS_SELECTABLE(s)) {
2401 select_error();
2402 return -1;
2403 }
2404 if (len == 0) {
2405 /* If 0 bytes were requested, do nothing. */
2406 return 0;
2407 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002408
2409#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002410 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002412 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 if (!timeout)
2414 outlen = recv(s->sock_fd, cbuf, len, flags);
2415 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 if (timeout == 1) {
2418 PyErr_SetString(socket_timeout, "timed out");
2419 return -1;
2420 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002421 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 if (outlen < 0) {
2423 /* Note: the call to errorhandler() ALWAYS indirectly returned
2424 NULL, so ignore its return value */
2425 s->errorhandler();
2426 return -1;
2427 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002428#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 read_buf = cbuf;
2430 remaining = len;
2431 while (remaining != 0) {
2432 unsigned int segment;
2433 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 segment = remaining /SEGMENT_SIZE;
2436 if (segment != 0) {
2437 segment = SEGMENT_SIZE;
2438 }
2439 else {
2440 segment = remaining;
2441 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002442
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002443 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002445 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 if (!timeout)
2447 nread = recv(s->sock_fd, read_buf, segment, flags);
2448 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 if (timeout == 1) {
2450 PyErr_SetString(socket_timeout, "timed out");
2451 return -1;
2452 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002453 END_SELECT_LOOP(s)
2454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 if (nread < 0) {
2456 s->errorhandler();
2457 return -1;
2458 }
2459 if (nread != remaining) {
2460 read_buf += nread;
2461 break;
2462 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 remaining -= segment;
2465 read_buf += segment;
2466 }
2467 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002468#endif /* !__VMS */
2469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002471}
2472
Guido van Rossum48a680c2001-03-02 06:34:14 +00002473
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002474/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002475
Guido van Rossum73624e91994-10-10 17:59:00 +00002476static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002477sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002478{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002479 Py_ssize_t recvlen, outlen;
2480 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002482
Antoine Pitrou19467d22010-08-17 19:33:30 +00002483 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 if (recvlen < 0) {
2487 PyErr_SetString(PyExc_ValueError,
2488 "negative buffersize in recv");
2489 return NULL;
2490 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 /* Allocate a new string. */
2493 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2494 if (buf == NULL)
2495 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 /* Call the guts */
2498 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2499 if (outlen < 0) {
2500 /* An error occurred, release the string and return an
2501 error. */
2502 Py_DECREF(buf);
2503 return NULL;
2504 }
2505 if (outlen != recvlen) {
2506 /* We did not read as many bytes as we anticipated, resize the
2507 string if possible and be successful. */
2508 _PyBytes_Resize(&buf, outlen);
2509 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002512}
2513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515"recv(buffersize[, flags]) -> data\n\
2516\n\
2517Receive up to buffersize bytes from the socket. For the optional flags\n\
2518argument, see the Unix manual. When no data is available, block until\n\
2519at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002520the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002521
Guido van Rossum30a685f1991-06-27 15:51:29 +00002522
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002523/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002524
Thomas Wouters477c8d52006-05-27 19:21:47 +00002525static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002526sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002529
Antoine Pitrou19467d22010-08-17 19:33:30 +00002530 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 Py_buffer pbuf;
2532 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002533 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002536 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 &pbuf, &recvlen, &flags))
2538 return NULL;
2539 buf = pbuf.buf;
2540 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (recvlen < 0) {
2543 PyBuffer_Release(&pbuf);
2544 PyErr_SetString(PyExc_ValueError,
2545 "negative buffersize in recv_into");
2546 return NULL;
2547 }
2548 if (recvlen == 0) {
2549 /* If nbytes was not specified, use the buffer's length */
2550 recvlen = buflen;
2551 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 /* Check if the buffer is large enough */
2554 if (buflen < recvlen) {
2555 PyBuffer_Release(&pbuf);
2556 PyErr_SetString(PyExc_ValueError,
2557 "buffer too small for requested bytes");
2558 return NULL;
2559 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 /* Call the guts */
2562 readlen = sock_recv_guts(s, buf, recvlen, flags);
2563 if (readlen < 0) {
2564 /* Return an error. */
2565 PyBuffer_Release(&pbuf);
2566 return NULL;
2567 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 PyBuffer_Release(&pbuf);
2570 /* Return the number of bytes read. Note that we do not do anything
2571 special here in the case that readlen < recvlen. */
2572 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002573}
2574
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002575PyDoc_STRVAR(recv_into_doc,
2576"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002577\n\
2578A version of recv() that stores its data into a buffer rather than creating \n\
2579a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2580is not specified (or 0), receive up to the size available in the given buffer.\n\
2581\n\
2582See recv() for documentation about the flags.");
2583
2584
2585/*
Christian Heimes99170a52007-12-19 02:07:34 +00002586 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2587 * into a char buffer. If you have any inc/def ref to do to the objects that
2588 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002589 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002590 * that it is also possible that we return a number of bytes smaller than the
2591 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592 *
2593 * 'addr' is a return value for the address object. Note that you must decref
2594 * it yourself.
2595 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002596static Py_ssize_t
2597sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 sock_addr_t addrbuf;
2601 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002602 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 if (!getsockaddrlen(s, &addrlen))
2608 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 if (!IS_SELECTABLE(s)) {
2611 select_error();
2612 return -1;
2613 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002614
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002615 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 Py_BEGIN_ALLOW_THREADS
2617 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002618 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002620#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002621#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 n = recvfrom(s->sock_fd, cbuf, len, flags,
2623 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 n = recvfrom(s->sock_fd, cbuf, len, flags,
2626 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002627#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002628#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 n = recvfrom(s->sock_fd, cbuf, len, flags,
2630 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 }
2633 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 if (timeout == 1) {
2636 PyErr_SetString(socket_timeout, "timed out");
2637 return -1;
2638 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002639 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 if (n < 0) {
2641 s->errorhandler();
2642 return -1;
2643 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2646 addrlen, s->sock_proto)))
2647 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002650}
2651
2652/* s.recvfrom(nbytes [,flags]) method */
2653
2654static PyObject *
2655sock_recvfrom(PySocketSockObject *s, PyObject *args)
2656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 PyObject *buf = NULL;
2658 PyObject *addr = NULL;
2659 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002660 int flags = 0;
2661 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002662
Antoine Pitrou19467d22010-08-17 19:33:30 +00002663 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 if (recvlen < 0) {
2667 PyErr_SetString(PyExc_ValueError,
2668 "negative buffersize in recvfrom");
2669 return NULL;
2670 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2673 if (buf == NULL)
2674 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2677 recvlen, flags, &addr);
2678 if (outlen < 0) {
2679 goto finally;
2680 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 if (outlen != recvlen) {
2683 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002684 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002686 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 goto finally;
2688 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002691
2692finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 Py_XDECREF(buf);
2694 Py_XDECREF(addr);
2695 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002696}
2697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002699"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2700\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002701Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002702
Thomas Wouters477c8d52006-05-27 19:21:47 +00002703
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002704/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002705
2706static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002707sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002710
Antoine Pitrou19467d22010-08-17 19:33:30 +00002711 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 Py_buffer pbuf;
2713 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002714 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002717
Antoine Pitrou19467d22010-08-17 19:33:30 +00002718 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 kwlist, &pbuf,
2720 &recvlen, &flags))
2721 return NULL;
2722 buf = pbuf.buf;
2723 buflen = pbuf.len;
2724 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 if (recvlen < 0) {
2727 PyBuffer_Release(&pbuf);
2728 PyErr_SetString(PyExc_ValueError,
2729 "negative buffersize in recvfrom_into");
2730 return NULL;
2731 }
2732 if (recvlen == 0) {
2733 /* If nbytes was not specified, use the buffer's length */
2734 recvlen = buflen;
2735 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2738 if (readlen < 0) {
2739 PyBuffer_Release(&pbuf);
2740 /* Return an error */
2741 Py_XDECREF(addr);
2742 return NULL;
2743 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 PyBuffer_Release(&pbuf);
2746 /* Return the number of bytes read and the address. Note that we do
2747 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002748 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002749}
2750
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002751PyDoc_STRVAR(recvfrom_into_doc,
2752"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002753\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002754Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002755
2756
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002757/* The sendmsg() and recvmsg[_into]() methods require a working
2758 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2759#ifdef CMSG_LEN
2760/*
2761 * Call recvmsg() with the supplied iovec structures, flags, and
2762 * ancillary data buffer size (controllen). Returns the tuple return
2763 * value for recvmsg() or recvmsg_into(), with the first item provided
2764 * by the supplied makeval() function. makeval() will be called with
2765 * the length read and makeval_data as arguments, and must return a
2766 * new reference (which will be decrefed if there is a subsequent
2767 * error). On error, closes any file descriptors received via
2768 * SCM_RIGHTS.
2769 */
2770static PyObject *
2771sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2772 int flags, Py_ssize_t controllen,
2773 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2774{
2775 ssize_t bytes_received = -1;
2776 int timeout;
2777 sock_addr_t addrbuf;
2778 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002779 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002780 PyObject *cmsg_list = NULL, *retval = NULL;
2781 void *controlbuf = NULL;
2782 struct cmsghdr *cmsgh;
2783 size_t cmsgdatalen = 0;
2784 int cmsg_status;
2785
2786 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2787 ignored" when the socket is connected (Linux fills them in
2788 anyway for AF_UNIX sockets at least). Normally msg_namelen
2789 seems to be set to 0 if there's no address, but try to
2790 initialize msg_name to something that won't be mistaken for a
2791 real address if that doesn't happen. */
2792 if (!getsockaddrlen(s, &addrbuflen))
2793 return NULL;
2794 memset(&addrbuf, 0, addrbuflen);
2795 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2796
2797 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2798 PyErr_SetString(PyExc_ValueError,
2799 "invalid ancillary data buffer length");
2800 return NULL;
2801 }
2802 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2803 return PyErr_NoMemory();
2804
2805 /* Make the system call. */
2806 if (!IS_SELECTABLE(s)) {
2807 select_error();
2808 goto finally;
2809 }
2810
2811 BEGIN_SELECT_LOOP(s)
2812 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002813 msg.msg_name = SAS2SA(&addrbuf);
2814 msg.msg_namelen = addrbuflen;
2815 msg.msg_iov = iov;
2816 msg.msg_iovlen = iovlen;
2817 msg.msg_control = controlbuf;
2818 msg.msg_controllen = controllen;
2819 timeout = internal_select_ex(s, 0, interval);
2820 if (!timeout)
2821 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2822 Py_END_ALLOW_THREADS;
2823 if (timeout == 1) {
2824 PyErr_SetString(socket_timeout, "timed out");
2825 goto finally;
2826 }
2827 END_SELECT_LOOP(s)
2828
2829 if (bytes_received < 0) {
2830 s->errorhandler();
2831 goto finally;
2832 }
2833
2834 /* Make list of (level, type, data) tuples from control messages. */
2835 if ((cmsg_list = PyList_New(0)) == NULL)
2836 goto err_closefds;
2837 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2838 implementations didn't do so. */
2839 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2840 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2841 PyObject *bytes, *tuple;
2842 int tmp;
2843
2844 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2845 if (cmsg_status != 0) {
2846 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2847 "received malformed or improperly-truncated "
2848 "ancillary data", 1) == -1)
2849 goto err_closefds;
2850 }
2851 if (cmsg_status < 0)
2852 break;
2853 if (cmsgdatalen > PY_SSIZE_T_MAX) {
2854 PyErr_SetString(socket_error, "control message too long");
2855 goto err_closefds;
2856 }
2857
2858 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2859 cmsgdatalen);
2860 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2861 (int)cmsgh->cmsg_type, bytes);
2862 if (tuple == NULL)
2863 goto err_closefds;
2864 tmp = PyList_Append(cmsg_list, tuple);
2865 Py_DECREF(tuple);
2866 if (tmp != 0)
2867 goto err_closefds;
2868
2869 if (cmsg_status != 0)
2870 break;
2871 }
2872
2873 retval = Py_BuildValue("NOiN",
2874 (*makeval)(bytes_received, makeval_data),
2875 cmsg_list,
2876 (int)msg.msg_flags,
2877 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2878 ((msg.msg_namelen > addrbuflen) ?
2879 addrbuflen : msg.msg_namelen),
2880 s->sock_proto));
2881 if (retval == NULL)
2882 goto err_closefds;
2883
2884finally:
2885 Py_XDECREF(cmsg_list);
2886 PyMem_Free(controlbuf);
2887 return retval;
2888
2889err_closefds:
2890#ifdef SCM_RIGHTS
2891 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2892 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2893 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2894 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2895 if (cmsg_status < 0)
2896 break;
2897 if (cmsgh->cmsg_level == SOL_SOCKET &&
2898 cmsgh->cmsg_type == SCM_RIGHTS) {
2899 size_t numfds;
2900 int *fdp;
2901
2902 numfds = cmsgdatalen / sizeof(int);
2903 fdp = (int *)CMSG_DATA(cmsgh);
2904 while (numfds-- > 0)
2905 close(*fdp++);
2906 }
2907 if (cmsg_status != 0)
2908 break;
2909 }
2910#endif /* SCM_RIGHTS */
2911 goto finally;
2912}
2913
2914
2915static PyObject *
2916makeval_recvmsg(ssize_t received, void *data)
2917{
2918 PyObject **buf = data;
2919
2920 if (received < PyBytes_GET_SIZE(*buf))
2921 _PyBytes_Resize(buf, received);
2922 Py_XINCREF(*buf);
2923 return *buf;
2924}
2925
2926/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
2927
2928static PyObject *
2929sock_recvmsg(PySocketSockObject *s, PyObject *args)
2930{
2931 Py_ssize_t bufsize, ancbufsize = 0;
2932 int flags = 0;
2933 struct iovec iov;
2934 PyObject *buf = NULL, *retval = NULL;
2935
2936 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
2937 return NULL;
2938
2939 if (bufsize < 0) {
2940 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
2941 return NULL;
2942 }
2943 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
2944 return NULL;
2945 iov.iov_base = PyBytes_AS_STRING(buf);
2946 iov.iov_len = bufsize;
2947
2948 /* Note that we're passing a pointer to *our pointer* to the bytes
2949 object here (&buf); makeval_recvmsg() may incref the object, or
2950 deallocate it and set our pointer to NULL. */
2951 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
2952 &makeval_recvmsg, &buf);
2953 Py_XDECREF(buf);
2954 return retval;
2955}
2956
2957PyDoc_STRVAR(recvmsg_doc,
2958"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
2959\n\
2960Receive normal data (up to bufsize bytes) and ancillary data from the\n\
2961socket. The ancbufsize argument sets the size in bytes of the\n\
2962internal buffer used to receive the ancillary data; it defaults to 0,\n\
2963meaning that no ancillary data will be received. Appropriate buffer\n\
2964sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
2965CMSG_LEN(), and items which do not fit into the buffer might be\n\
2966truncated or discarded. The flags argument defaults to 0 and has the\n\
2967same meaning as for recv().\n\
2968\n\
2969The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
2970The data item is a bytes object holding the non-ancillary data\n\
2971received. The ancdata item is a list of zero or more tuples\n\
2972(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
2973(control messages) received: cmsg_level and cmsg_type are integers\n\
2974specifying the protocol level and protocol-specific type respectively,\n\
2975and cmsg_data is a bytes object holding the associated data. The\n\
2976msg_flags item is the bitwise OR of various flags indicating\n\
2977conditions on the received message; see your system documentation for\n\
2978details. If the receiving socket is unconnected, address is the\n\
2979address of the sending socket, if available; otherwise, its value is\n\
2980unspecified.\n\
2981\n\
2982If recvmsg() raises an exception after the system call returns, it\n\
2983will first attempt to close any file descriptors received via the\n\
2984SCM_RIGHTS mechanism.");
2985
2986
2987static PyObject *
2988makeval_recvmsg_into(ssize_t received, void *data)
2989{
2990 return PyLong_FromSsize_t(received);
2991}
2992
2993/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
2994
2995static PyObject *
2996sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
2997{
2998 Py_ssize_t ancbufsize = 0;
2999 int flags = 0;
3000 struct iovec *iovs = NULL;
3001 Py_ssize_t i, nitems, nbufs = 0;
3002 Py_buffer *bufs = NULL;
3003 PyObject *buffers_arg, *fast, *retval = NULL;
3004
3005 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3006 &buffers_arg, &ancbufsize, &flags))
3007 return NULL;
3008
3009 if ((fast = PySequence_Fast(buffers_arg,
3010 "recvmsg_into() argument 1 must be an "
3011 "iterable")) == NULL)
3012 return NULL;
3013 nitems = PySequence_Fast_GET_SIZE(fast);
3014 if (nitems > INT_MAX) {
3015 PyErr_SetString(socket_error, "recvmsg_into() argument 1 is too long");
3016 goto finally;
3017 }
3018
3019 /* Fill in an iovec for each item, and save the Py_buffer
3020 structs to release afterwards. */
3021 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3022 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3023 PyErr_NoMemory();
3024 goto finally;
3025 }
3026 for (; nbufs < nitems; nbufs++) {
3027 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3028 "w*;recvmsg_into() argument 1 must be an iterable "
3029 "of single-segment read-write buffers",
3030 &bufs[nbufs]))
3031 goto finally;
3032 iovs[nbufs].iov_base = bufs[nbufs].buf;
3033 iovs[nbufs].iov_len = bufs[nbufs].len;
3034 }
3035
3036 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3037 &makeval_recvmsg_into, NULL);
3038finally:
3039 for (i = 0; i < nbufs; i++)
3040 PyBuffer_Release(&bufs[i]);
3041 PyMem_Free(bufs);
3042 PyMem_Free(iovs);
3043 Py_DECREF(fast);
3044 return retval;
3045}
3046
3047PyDoc_STRVAR(recvmsg_into_doc,
3048"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3049\n\
3050Receive normal data and ancillary data from the socket, scattering the\n\
3051non-ancillary data into a series of buffers. The buffers argument\n\
3052must be an iterable of objects that export writable buffers\n\
3053(e.g. bytearray objects); these will be filled with successive chunks\n\
3054of the non-ancillary data until it has all been written or there are\n\
3055no more buffers. The ancbufsize argument sets the size in bytes of\n\
3056the internal buffer used to receive the ancillary data; it defaults to\n\
30570, meaning that no ancillary data will be received. Appropriate\n\
3058buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3059or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3060truncated or discarded. The flags argument defaults to 0 and has the\n\
3061same meaning as for recv().\n\
3062\n\
3063The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3064The nbytes item is the total number of bytes of non-ancillary data\n\
3065written into the buffers. The ancdata item is a list of zero or more\n\
3066tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3067data (control messages) received: cmsg_level and cmsg_type are\n\
3068integers specifying the protocol level and protocol-specific type\n\
3069respectively, and cmsg_data is a bytes object holding the associated\n\
3070data. The msg_flags item is the bitwise OR of various flags\n\
3071indicating conditions on the received message; see your system\n\
3072documentation for details. If the receiving socket is unconnected,\n\
3073address is the address of the sending socket, if available; otherwise,\n\
3074its value is unspecified.\n\
3075\n\
3076If recvmsg_into() raises an exception after the system call returns,\n\
3077it will first attempt to close any file descriptors received via the\n\
3078SCM_RIGHTS mechanism.");
3079#endif /* CMSG_LEN */
3080
3081
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003082/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003083
Guido van Rossum73624e91994-10-10 17:59:00 +00003084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003085sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003088 Py_ssize_t len, n = -1;
3089 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3093 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 if (!IS_SELECTABLE(s)) {
3096 PyBuffer_Release(&pbuf);
3097 return select_error();
3098 }
3099 buf = pbuf.buf;
3100 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003101
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003102 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003104 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003106#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003108#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003113 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 PyErr_SetString(socket_timeout, "timed out");
3115 return NULL;
3116 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003117 END_SELECT_LOOP(s)
3118
3119 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 if (n < 0)
3121 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003122 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003123}
3124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003126"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003127\n\
3128Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003129argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003130sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003131
3132
3133/* s.sendall(data [,flags]) method */
3134
3135static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003136sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003139 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003140 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3144 return NULL;
3145 buf = pbuf.buf;
3146 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 if (!IS_SELECTABLE(s)) {
3149 PyBuffer_Release(&pbuf);
3150 return select_error();
3151 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003154 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 timeout = internal_select(s, 1);
3156 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003157 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003158#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003159 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003160#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003161 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003162#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003163 }
3164 Py_END_ALLOW_THREADS
3165 if (timeout == 1) {
3166 PyBuffer_Release(&pbuf);
3167 PyErr_SetString(socket_timeout, "timed out");
3168 return NULL;
3169 }
3170 /* PyErr_CheckSignals() might change errno */
3171 saved_errno = errno;
3172 /* We must run our signal handlers before looping again.
3173 send() can return a successful partial write when it is
3174 interrupted, so we can't restrict ourselves to EINTR. */
3175 if (PyErr_CheckSignals()) {
3176 PyBuffer_Release(&pbuf);
3177 return NULL;
3178 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003180 /* If interrupted, try again */
3181 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003183 else
3184 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 }
3186 buf += n;
3187 len -= n;
3188 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 if (n < 0)
3192 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 Py_INCREF(Py_None);
3195 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003196}
3197
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003198PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003199"sendall(data[, flags])\n\
3200\n\
3201Send a data string to the socket. For the optional flags\n\
3202argument, see the Unix manual. This calls send() repeatedly\n\
3203until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003204to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003205
Guido van Rossum30a685f1991-06-27 15:51:29 +00003206
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003207/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003208
Guido van Rossum73624e91994-10-10 17:59:00 +00003209static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003210sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 Py_buffer pbuf;
3213 PyObject *addro;
3214 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003215 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 sock_addr_t addrbuf;
3217 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003220 arglen = PyTuple_Size(args);
3221 switch (arglen) {
3222 case 2:
3223 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3224 break;
3225 case 3:
3226 PyArg_ParseTuple(args, "y*iO:sendto",
3227 &pbuf, &flags, &addro);
3228 break;
3229 default:
3230 PyErr_Format(PyExc_TypeError,
3231 "sendto() takes 2 or 3 arguments (%d given)",
3232 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003233 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003235 if (PyErr_Occurred())
3236 return NULL;
3237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 buf = pbuf.buf;
3239 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (!IS_SELECTABLE(s)) {
3242 PyBuffer_Release(&pbuf);
3243 return select_error();
3244 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3247 PyBuffer_Release(&pbuf);
3248 return NULL;
3249 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003250
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003251 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003253 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 if (!timeout)
3255 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3256 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003259 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 PyErr_SetString(socket_timeout, "timed out");
3261 return NULL;
3262 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003263 END_SELECT_LOOP(s)
3264 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 if (n < 0)
3266 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003267 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003268}
3269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003270PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003271"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003272\n\
3273Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003274For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003275
Guido van Rossum30a685f1991-06-27 15:51:29 +00003276
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277/* The sendmsg() and recvmsg[_into]() methods require a working
3278 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3279#ifdef CMSG_LEN
3280/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3281
3282static PyObject *
3283sock_sendmsg(PySocketSockObject *s, PyObject *args)
3284{
3285 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3286 Py_buffer *databufs = NULL;
3287 struct iovec *iovs = NULL;
3288 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003289 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003290 struct cmsginfo {
3291 int level;
3292 int type;
3293 Py_buffer data;
3294 } *cmsgs = NULL;
3295 void *controlbuf = NULL;
3296 size_t controllen, controllen_last;
3297 ssize_t bytes_sent = -1;
3298 int addrlen, timeout, flags = 0;
3299 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3300 *cmsg_fast = NULL, *retval = NULL;
3301
3302 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3303 &data_arg, &cmsg_arg, &flags, &addr_arg))
3304 return NULL;
3305
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003306 /* Parse destination address. */
3307 if (addr_arg != NULL && addr_arg != Py_None) {
3308 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3309 goto finally;
3310 msg.msg_name = &addrbuf;
3311 msg.msg_namelen = addrlen;
3312 }
3313
3314 /* Fill in an iovec for each message part, and save the Py_buffer
3315 structs to release afterwards. */
3316 if ((data_fast = PySequence_Fast(data_arg,
3317 "sendmsg() argument 1 must be an "
3318 "iterable")) == NULL)
3319 goto finally;
3320 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3321 if (ndataparts > INT_MAX) {
3322 PyErr_SetString(socket_error, "sendmsg() argument 1 is too long");
3323 goto finally;
3324 }
3325 msg.msg_iovlen = ndataparts;
3326 if (ndataparts > 0 &&
3327 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3328 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3329 PyErr_NoMemory();
3330 goto finally;
3331 }
3332 for (; ndatabufs < ndataparts; ndatabufs++) {
3333 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3334 "y*;sendmsg() argument 1 must be an iterable of "
3335 "buffer-compatible objects",
3336 &databufs[ndatabufs]))
3337 goto finally;
3338 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3339 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3340 }
3341
3342 if (cmsg_arg == NULL)
3343 ncmsgs = 0;
3344 else {
3345 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3346 "sendmsg() argument 2 must be an "
3347 "iterable")) == NULL)
3348 goto finally;
3349 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3350 }
3351
3352#ifndef CMSG_SPACE
3353 if (ncmsgs > 1) {
3354 PyErr_SetString(socket_error,
3355 "sending multiple control messages is not supported "
3356 "on this system");
3357 goto finally;
3358 }
3359#endif
3360 /* Save level, type and Py_buffer for each control message,
3361 and calculate total size. */
3362 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3363 PyErr_NoMemory();
3364 goto finally;
3365 }
3366 controllen = controllen_last = 0;
3367 while (ncmsgbufs < ncmsgs) {
3368 size_t bufsize, space;
3369
3370 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3371 "(iiy*):[sendmsg() ancillary data items]",
3372 &cmsgs[ncmsgbufs].level,
3373 &cmsgs[ncmsgbufs].type,
3374 &cmsgs[ncmsgbufs].data))
3375 goto finally;
3376 bufsize = cmsgs[ncmsgbufs++].data.len;
3377
3378#ifdef CMSG_SPACE
3379 if (!get_CMSG_SPACE(bufsize, &space)) {
3380#else
3381 if (!get_CMSG_LEN(bufsize, &space)) {
3382#endif
3383 PyErr_SetString(socket_error, "ancillary data item too large");
3384 goto finally;
3385 }
3386 controllen += space;
3387 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
3388 PyErr_SetString(socket_error, "too much ancillary data");
3389 goto finally;
3390 }
3391 controllen_last = controllen;
3392 }
3393
3394 /* Construct ancillary data block from control message info. */
3395 if (ncmsgbufs > 0) {
3396 struct cmsghdr *cmsgh = NULL;
3397
3398 if ((msg.msg_control = controlbuf =
3399 PyMem_Malloc(controllen)) == NULL) {
3400 PyErr_NoMemory();
3401 goto finally;
3402 }
3403 msg.msg_controllen = controllen;
3404
3405 /* Need to zero out the buffer as a workaround for glibc's
3406 CMSG_NXTHDR() implementation. After getting the pointer to
3407 the next header, it checks its (uninitialized) cmsg_len
3408 member to see if the "message" fits in the buffer, and
3409 returns NULL if it doesn't. Zero-filling the buffer
3410 ensures that that doesn't happen. */
3411 memset(controlbuf, 0, controllen);
3412
3413 for (i = 0; i < ncmsgbufs; i++) {
3414 size_t msg_len, data_len = cmsgs[i].data.len;
3415 int enough_space = 0;
3416
3417 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3418 if (cmsgh == NULL) {
3419 PyErr_Format(PyExc_RuntimeError,
3420 "unexpected NULL result from %s()",
3421 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3422 goto finally;
3423 }
3424 if (!get_CMSG_LEN(data_len, &msg_len)) {
3425 PyErr_SetString(PyExc_RuntimeError,
3426 "item size out of range for CMSG_LEN()");
3427 goto finally;
3428 }
3429 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3430 size_t space;
3431
3432 cmsgh->cmsg_len = msg_len;
3433 if (get_cmsg_data_space(&msg, cmsgh, &space))
3434 enough_space = (space >= data_len);
3435 }
3436 if (!enough_space) {
3437 PyErr_SetString(PyExc_RuntimeError,
3438 "ancillary data does not fit in calculated "
3439 "space");
3440 goto finally;
3441 }
3442 cmsgh->cmsg_level = cmsgs[i].level;
3443 cmsgh->cmsg_type = cmsgs[i].type;
3444 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3445 }
3446 }
3447
3448 /* Make the system call. */
3449 if (!IS_SELECTABLE(s)) {
3450 select_error();
3451 goto finally;
3452 }
3453
3454 BEGIN_SELECT_LOOP(s)
3455 Py_BEGIN_ALLOW_THREADS;
3456 timeout = internal_select_ex(s, 1, interval);
3457 if (!timeout)
3458 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3459 Py_END_ALLOW_THREADS;
3460 if (timeout == 1) {
3461 PyErr_SetString(socket_timeout, "timed out");
3462 goto finally;
3463 }
3464 END_SELECT_LOOP(s)
3465
3466 if (bytes_sent < 0) {
3467 s->errorhandler();
3468 goto finally;
3469 }
3470 retval = PyLong_FromSsize_t(bytes_sent);
3471
3472finally:
3473 PyMem_Free(controlbuf);
3474 for (i = 0; i < ncmsgbufs; i++)
3475 PyBuffer_Release(&cmsgs[i].data);
3476 PyMem_Free(cmsgs);
3477 Py_XDECREF(cmsg_fast);
3478 for (i = 0; i < ndatabufs; i++)
3479 PyBuffer_Release(&databufs[i]);
3480 PyMem_Free(databufs);
3481 PyMem_Free(iovs);
3482 Py_XDECREF(data_fast);
3483 return retval;
3484}
3485
3486PyDoc_STRVAR(sendmsg_doc,
3487"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3488\n\
3489Send normal and ancillary data to the socket, gathering the\n\
3490non-ancillary data from a series of buffers and concatenating it into\n\
3491a single message. The buffers argument specifies the non-ancillary\n\
3492data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3493The ancdata argument specifies the ancillary data (control messages)\n\
3494as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3495cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3496protocol level and protocol-specific type respectively, and cmsg_data\n\
3497is a buffer-compatible object holding the associated data. The flags\n\
3498argument defaults to 0 and has the same meaning as for send(). If\n\
3499address is supplied and not None, it sets a destination address for\n\
3500the message. The return value is the number of bytes of non-ancillary\n\
3501data sent.");
3502#endif /* CMSG_LEN */
3503
3504
Guido van Rossum30a685f1991-06-27 15:51:29 +00003505/* s.shutdown(how) method */
3506
Guido van Rossum73624e91994-10-10 17:59:00 +00003507static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003508sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 int how;
3511 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 how = PyLong_AsLong(arg);
3514 if (how == -1 && PyErr_Occurred())
3515 return NULL;
3516 Py_BEGIN_ALLOW_THREADS
3517 res = shutdown(s->sock_fd, how);
3518 Py_END_ALLOW_THREADS
3519 if (res < 0)
3520 return s->errorhandler();
3521 Py_INCREF(Py_None);
3522 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003523}
3524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003525PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003526"shutdown(flag)\n\
3527\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003528Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3529of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003530
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003531#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003532static PyObject*
3533sock_ioctl(PySocketSockObject *s, PyObject *arg)
3534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 unsigned long cmd = SIO_RCVALL;
3536 PyObject *argO;
3537 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003539 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3540 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 switch (cmd) {
3543 case SIO_RCVALL: {
3544 unsigned int option = RCVALL_ON;
3545 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3546 return NULL;
3547 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3548 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3549 return set_error();
3550 }
3551 return PyLong_FromUnsignedLong(recv); }
3552 case SIO_KEEPALIVE_VALS: {
3553 struct tcp_keepalive ka;
3554 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3555 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3556 return NULL;
3557 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3558 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3559 return set_error();
3560 }
3561 return PyLong_FromUnsignedLong(recv); }
3562 default:
3563 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3564 return NULL;
3565 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003566}
3567PyDoc_STRVAR(sock_ioctl_doc,
3568"ioctl(cmd, option) -> long\n\
3569\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003570Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3571SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3572SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003573
3574#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003575
3576/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003577
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003578static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3580 accept_doc},
3581 {"bind", (PyCFunction)sock_bind, METH_O,
3582 bind_doc},
3583 {"close", (PyCFunction)sock_close, METH_NOARGS,
3584 close_doc},
3585 {"connect", (PyCFunction)sock_connect, METH_O,
3586 connect_doc},
3587 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3588 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003589 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3590 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3592 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003593#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 {"getpeername", (PyCFunction)sock_getpeername,
3595 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 {"getsockname", (PyCFunction)sock_getsockname,
3598 METH_NOARGS, getsockname_doc},
3599 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3600 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003601#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3603 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 {"listen", (PyCFunction)sock_listen, METH_O,
3606 listen_doc},
3607 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3608 recv_doc},
3609 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3610 recv_into_doc},
3611 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3612 recvfrom_doc},
3613 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3614 recvfrom_into_doc},
3615 {"send", (PyCFunction)sock_send, METH_VARARGS,
3616 send_doc},
3617 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3618 sendall_doc},
3619 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3620 sendto_doc},
3621 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3622 setblocking_doc},
3623 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3624 settimeout_doc},
3625 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3626 gettimeout_doc},
3627 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3628 setsockopt_doc},
3629 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3630 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003631#ifdef CMSG_LEN
3632 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3633 recvmsg_doc},
3634 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3635 recvmsg_into_doc,},
3636 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3637 sendmsg_doc},
3638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003640};
3641
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003642/* SockObject members */
3643static PyMemberDef sock_memberlist[] = {
3644 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3645 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3646 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3647 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3648 {0},
3649};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003650
Guido van Rossum73624e91994-10-10 17:59:00 +00003651/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003652 First close the file description. */
3653
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003654static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003655sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003656{
Antoine Pitroue033e062010-10-29 10:38:18 +00003657 if (s->sock_fd != -1) {
3658 PyObject *exc, *val, *tb;
3659 Py_ssize_t old_refcount = Py_REFCNT(s);
3660 ++Py_REFCNT(s);
3661 PyErr_Fetch(&exc, &val, &tb);
3662 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3663 "unclosed %R", s))
3664 /* Spurious errors can appear at shutdown */
3665 if (PyErr_ExceptionMatches(PyExc_Warning))
3666 PyErr_WriteUnraisable((PyObject *) s);
3667 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003669 Py_REFCNT(s) = old_refcount;
3670 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003671 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003672}
3673
Guido van Rossum30a685f1991-06-27 15:51:29 +00003674
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003675static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003676sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003677{
Fred Drakea04eaad2000-06-30 02:46:07 +00003678#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 if (s->sock_fd > LONG_MAX) {
3680 /* this can occur on Win64, and actually there is a special
3681 ugly printf formatter for decimal pointer length integer
3682 printing, only bother if necessary*/
3683 PyErr_SetString(PyExc_OverflowError,
3684 "no printf formatter to display "
3685 "the socket descriptor in decimal");
3686 return NULL;
3687 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 return PyUnicode_FromFormat(
3690 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3691 (long)s->sock_fd, s->sock_family,
3692 s->sock_type,
3693 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003694}
3695
3696
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003697/* Create a new, uninitialized socket object. */
3698
3699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003700sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003704 new = type->tp_alloc(type, 0);
3705 if (new != NULL) {
3706 ((PySocketSockObject *)new)->sock_fd = -1;
3707 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3708 ((PySocketSockObject *)new)->errorhandler = &set_error;
3709 }
3710 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003711}
3712
3713
3714/* Initialize a new socket object. */
3715
3716/*ARGSUSED*/
3717static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003718sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 PySocketSockObject *s = (PySocketSockObject *)self;
3721 PyObject *fdobj = NULL;
3722 SOCKET_T fd = INVALID_SOCKET;
3723 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3724 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3727 "|iiiO:socket", keywords,
3728 &family, &type, &proto, &fdobj))
3729 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 if (fdobj != NULL && fdobj != Py_None) {
3732 fd = PyLong_AsSocket_t(fdobj);
3733 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3734 return -1;
3735 if (fd == INVALID_SOCKET) {
3736 PyErr_SetString(PyExc_ValueError,
3737 "can't use invalid socket value");
3738 return -1;
3739 }
3740 }
3741 else {
3742 Py_BEGIN_ALLOW_THREADS
3743 fd = socket(family, type, proto);
3744 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 if (fd == INVALID_SOCKET) {
3747 set_error();
3748 return -1;
3749 }
3750 }
3751 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003753 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003754
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003755}
3756
3757
Guido van Rossumb6775db1994-08-01 11:34:53 +00003758/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003759
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003760static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3762 "_socket.socket", /* tp_name */
3763 sizeof(PySocketSockObject), /* tp_basicsize */
3764 0, /* tp_itemsize */
3765 (destructor)sock_dealloc, /* tp_dealloc */
3766 0, /* tp_print */
3767 0, /* tp_getattr */
3768 0, /* tp_setattr */
3769 0, /* tp_reserved */
3770 (reprfunc)sock_repr, /* tp_repr */
3771 0, /* tp_as_number */
3772 0, /* tp_as_sequence */
3773 0, /* tp_as_mapping */
3774 0, /* tp_hash */
3775 0, /* tp_call */
3776 0, /* tp_str */
3777 PyObject_GenericGetAttr, /* tp_getattro */
3778 0, /* tp_setattro */
3779 0, /* tp_as_buffer */
3780 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3781 sock_doc, /* tp_doc */
3782 0, /* tp_traverse */
3783 0, /* tp_clear */
3784 0, /* tp_richcompare */
3785 0, /* tp_weaklistoffset */
3786 0, /* tp_iter */
3787 0, /* tp_iternext */
3788 sock_methods, /* tp_methods */
3789 sock_memberlist, /* tp_members */
3790 0, /* tp_getset */
3791 0, /* tp_base */
3792 0, /* tp_dict */
3793 0, /* tp_descr_get */
3794 0, /* tp_descr_set */
3795 0, /* tp_dictoffset */
3796 sock_initobj, /* tp_init */
3797 PyType_GenericAlloc, /* tp_alloc */
3798 sock_new, /* tp_new */
3799 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003800};
3801
Guido van Rossum30a685f1991-06-27 15:51:29 +00003802
Guido van Rossum81194471991-07-27 21:42:02 +00003803/* Python interface to gethostname(). */
3804
3805/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003806static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003807socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003808{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003809#ifdef MS_WINDOWS
3810 /* Don't use winsock's gethostname, as this returns the ANSI
3811 version of the hostname, whereas we need a Unicode string.
3812 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003813 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
3814 DWORD size = sizeof(buf) / sizeof(wchar_t);
3815 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003816 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3817 if (GetLastError() == ERROR_MORE_DATA) {
3818 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003819 if (size == 0) /* XXX: I'm not sure how to handle this */
3820 return PyUnicode_FromUnicode(NULL, 0);
3821 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003822 if (!result)
3823 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003824 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3825 PyUnicode_AS_UNICODE(result),
3826 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003827 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003828 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003829 }
3830 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3831 }
Victor Stinner77af1722011-05-26 14:05:59 +02003832 return PyUnicode_FromUnicode(buf, size);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003833#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 char buf[1024];
3835 int res;
3836 Py_BEGIN_ALLOW_THREADS
3837 res = gethostname(buf, (int) sizeof buf - 1);
3838 Py_END_ALLOW_THREADS
3839 if (res < 0)
3840 return set_error();
3841 buf[sizeof buf - 1] = '\0';
3842 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003843#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003844}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003845
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003846PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003847"gethostname() -> string\n\
3848\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003849Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003850
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003851#ifdef HAVE_SETHOSTNAME
3852PyDoc_STRVAR(sethostname_doc,
3853"sethostname(name)\n\n\
3854Sets the hostname to name.");
3855
3856static PyObject *
3857socket_sethostname(PyObject *self, PyObject *args)
3858{
3859 PyObject *hnobj;
3860 Py_buffer buf;
3861 int res, flag = 0;
3862
3863 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3864 PyErr_Clear();
3865 if (!PyArg_ParseTuple(args, "O&:sethostname",
3866 PyUnicode_FSConverter, &hnobj))
3867 return NULL;
3868 flag = 1;
3869 }
3870 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3871 if (!res) {
3872 res = sethostname(buf.buf, buf.len);
3873 PyBuffer_Release(&buf);
3874 }
3875 if (flag)
3876 Py_DECREF(hnobj);
3877 if (res)
3878 return set_error();
3879 Py_RETURN_NONE;
3880}
3881#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003882
Guido van Rossum30a685f1991-06-27 15:51:29 +00003883/* Python interface to gethostbyname(name). */
3884
3885/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003886static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003887socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 char *name;
3890 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003891 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003892
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003893 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003894 return NULL;
3895 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003896 goto finally;
3897 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3898finally:
3899 PyMem_Free(name);
3900 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003901}
3902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003903PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003904"gethostbyname(host) -> address\n\
3905\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003906Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003907
3908
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003909/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3910
3911static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003912gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 char **pch;
3915 PyObject *rtn_tuple = (PyObject *)NULL;
3916 PyObject *name_list = (PyObject *)NULL;
3917 PyObject *addr_list = (PyObject *)NULL;
3918 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 if (h == NULL) {
3921 /* Let's get real error message to return */
3922 set_herror(h_errno);
3923 return NULL;
3924 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003926 if (h->h_addrtype != af) {
3927 /* Let's get real error message to return */
3928 PyErr_SetString(socket_error,
3929 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00003930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 return NULL;
3932 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003934 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 case AF_INET:
3937 if (alen < sizeof(struct sockaddr_in))
3938 return NULL;
3939 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003940
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003941#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 case AF_INET6:
3943 if (alen < sizeof(struct sockaddr_in6))
3944 return NULL;
3945 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003946#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 if ((name_list = PyList_New(0)) == NULL)
3951 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 if ((addr_list = PyList_New(0)) == NULL)
3954 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 /* SF #1511317: h_aliases can be NULL */
3957 if (h->h_aliases) {
3958 for (pch = h->h_aliases; *pch != NULL; pch++) {
3959 int status;
3960 tmp = PyUnicode_FromString(*pch);
3961 if (tmp == NULL)
3962 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 status = PyList_Append(name_list, tmp);
3965 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 if (status)
3968 goto err;
3969 }
3970 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3973 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003975 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 case AF_INET:
3978 {
3979 struct sockaddr_in sin;
3980 memset(&sin, 0, sizeof(sin));
3981 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003982#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3986 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 if (pch == h->h_addr_list && alen >= sizeof(sin))
3989 memcpy((char *) addr, &sin, sizeof(sin));
3990 break;
3991 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003992
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003993#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 case AF_INET6:
3995 {
3996 struct sockaddr_in6 sin6;
3997 memset(&sin6, 0, sizeof(sin6));
3998 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003999#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004002 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4003 tmp = makeipaddr((struct sockaddr *)&sin6,
4004 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4007 memcpy((char *) addr, &sin6, sizeof(sin6));
4008 break;
4009 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004010#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004012 default: /* can't happen */
4013 PyErr_SetString(socket_error,
4014 "unsupported address family");
4015 return NULL;
4016 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 if (tmp == NULL)
4019 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 status = PyList_Append(addr_list, tmp);
4022 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004024 if (status)
4025 goto err;
4026 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004029
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004030 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 Py_XDECREF(name_list);
4032 Py_XDECREF(addr_list);
4033 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004034}
4035
4036
4037/* Python interface to gethostbyname_ex(name). */
4038
4039/*ARGSUSED*/
4040static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004041socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 char *name;
4044 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004045#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004047#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004050 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004051 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004052#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004054#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004056#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004057 char buf[16384];
4058 int buf_len = (sizeof buf) - 1;
4059 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004060#endif
4061#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004063#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004064#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004065
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004066 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 return NULL;
4068 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004069 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004071#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004072#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4074 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004075#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004077#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 memset((void *) &data, '\0', sizeof(data));
4079 result = gethostbyname_r(name, &hp_allocated, &data);
4080 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004081#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004082#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004083#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004087#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 Py_END_ALLOW_THREADS
4089 /* Some C libraries would require addr.__ss_family instead of
4090 addr.ss_family.
4091 Therefore, we cast the sockaddr_storage into sockaddr to
4092 access sa_family. */
4093 sa = (struct sockaddr*)&addr;
4094 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4095 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004096#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004097 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004098#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004099finally:
4100 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004102}
4103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004104PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004105"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4106\n\
4107Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004108for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004109
4110
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004111/* Python interface to gethostbyaddr(IP). */
4112
4113/*ARGSUSED*/
4114static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004115socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004116{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004117#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004119#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 struct sockaddr *sa = (struct sockaddr *)&addr;
4123 char *ip_num;
4124 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004125 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004126#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004128#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004130#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 /* glibcs up to 2.10 assume that the buf argument to
4132 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4133 does not ensure. The attribute below instructs the compiler
4134 to maintain this alignment. */
4135 char buf[16384] Py_ALIGNED(8);
4136 int buf_len = (sizeof buf) - 1;
4137 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004138#endif
4139#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004141#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004142#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 char *ap;
4144 int al;
4145 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004146
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004147 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004148 return NULL;
4149 af = AF_UNSPEC;
4150 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004151 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 af = sa->sa_family;
4153 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004154 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 switch (af) {
4156 case AF_INET:
4157 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4158 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4159 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004160#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 case AF_INET6:
4162 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4163 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4164 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166 default:
4167 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004168 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 }
4170 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004171#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004172#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 result = gethostbyaddr_r(ap, al, af,
4174 &hp_allocated, buf, buf_len,
4175 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004176#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 h = gethostbyaddr_r(ap, al, af,
4178 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004179#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 memset((void *) &data, '\0', sizeof(data));
4181 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4182 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004183#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004184#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004185#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004188 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004189#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 Py_END_ALLOW_THREADS
4191 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004192#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004194#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004195finally:
4196 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004198}
4199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004200PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004201"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4202\n\
4203Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004204for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004205
Guido van Rossum30a685f1991-06-27 15:51:29 +00004206
4207/* Python interface to getservbyname(name).
4208 This only returns the port number, since the other info is already
4209 known or not useful (like the list of aliases). */
4210
4211/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004212static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004213socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 char *name, *proto=NULL;
4216 struct servent *sp;
4217 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4218 return NULL;
4219 Py_BEGIN_ALLOW_THREADS
4220 sp = getservbyname(name, proto);
4221 Py_END_ALLOW_THREADS
4222 if (sp == NULL) {
4223 PyErr_SetString(socket_error, "service/proto not found");
4224 return NULL;
4225 }
4226 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004227}
4228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004229PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004230"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004231\n\
4232Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004233The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4234otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004235
Guido van Rossum30a685f1991-06-27 15:51:29 +00004236
Barry Warsaw11b91a02004-06-28 00:50:43 +00004237/* Python interface to getservbyport(port).
4238 This only returns the service name, since the other info is already
4239 known or not useful (like the list of aliases). */
4240
4241/*ARGSUSED*/
4242static PyObject *
4243socket_getservbyport(PyObject *self, PyObject *args)
4244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 int port;
4246 char *proto=NULL;
4247 struct servent *sp;
4248 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4249 return NULL;
4250 if (port < 0 || port > 0xffff) {
4251 PyErr_SetString(
4252 PyExc_OverflowError,
4253 "getservbyport: port must be 0-65535.");
4254 return NULL;
4255 }
4256 Py_BEGIN_ALLOW_THREADS
4257 sp = getservbyport(htons((short)port), proto);
4258 Py_END_ALLOW_THREADS
4259 if (sp == NULL) {
4260 PyErr_SetString(socket_error, "port/proto not found");
4261 return NULL;
4262 }
4263 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004264}
4265
4266PyDoc_STRVAR(getservbyport_doc,
4267"getservbyport(port[, protocolname]) -> string\n\
4268\n\
4269Return the service name from a port number and protocol name.\n\
4270The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4271otherwise any protocol will match.");
4272
Guido van Rossum3901d851996-12-19 16:35:04 +00004273/* Python interface to getprotobyname(name).
4274 This only returns the protocol number, since the other info is
4275 already known or not useful (like the list of aliases). */
4276
4277/*ARGSUSED*/
4278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004279socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 char *name;
4282 struct protoent *sp;
4283 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4284 return NULL;
4285 Py_BEGIN_ALLOW_THREADS
4286 sp = getprotobyname(name);
4287 Py_END_ALLOW_THREADS
4288 if (sp == NULL) {
4289 PyErr_SetString(socket_error, "protocol not found");
4290 return NULL;
4291 }
4292 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004293}
4294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004295PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004296"getprotobyname(name) -> integer\n\
4297\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004298Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004299
Guido van Rossum3901d851996-12-19 16:35:04 +00004300
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004301#ifndef NO_DUP
4302/* dup() function for socket fds */
4303
4304static PyObject *
4305socket_dup(PyObject *self, PyObject *fdobj)
4306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004307 SOCKET_T fd, newfd;
4308 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004309
4310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 fd = PyLong_AsSocket_t(fdobj);
4312 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4313 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 newfd = dup_socket(fd);
4316 if (newfd == INVALID_SOCKET)
4317 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 newfdobj = PyLong_FromSocket_t(newfd);
4320 if (newfdobj == NULL)
4321 SOCKETCLOSE(newfd);
4322 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004323}
4324
4325PyDoc_STRVAR(dup_doc,
4326"dup(integer) -> integer\n\
4327\n\
4328Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4329sockets; on some platforms os.dup() won't work for socket file descriptors.");
4330#endif
4331
4332
Dave Cole331708b2004-08-09 04:51:41 +00004333#ifdef HAVE_SOCKETPAIR
4334/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004335 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004336 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004337
4338/*ARGSUSED*/
4339static PyObject *
4340socket_socketpair(PyObject *self, PyObject *args)
4341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 PySocketSockObject *s0 = NULL, *s1 = NULL;
4343 SOCKET_T sv[2];
4344 int family, type = SOCK_STREAM, proto = 0;
4345 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004346
4347#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4353 &family, &type, &proto))
4354 return NULL;
4355 /* Create a pair of socket fds */
4356 if (socketpair(family, type, proto, sv) < 0)
4357 return set_error();
4358 s0 = new_sockobject(sv[0], family, type, proto);
4359 if (s0 == NULL)
4360 goto finally;
4361 s1 = new_sockobject(sv[1], family, type, proto);
4362 if (s1 == NULL)
4363 goto finally;
4364 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004365
4366finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 if (res == NULL) {
4368 if (s0 == NULL)
4369 SOCKETCLOSE(sv[0]);
4370 if (s1 == NULL)
4371 SOCKETCLOSE(sv[1]);
4372 }
4373 Py_XDECREF(s0);
4374 Py_XDECREF(s1);
4375 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004376}
4377
4378PyDoc_STRVAR(socketpair_doc,
4379"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4380\n\
4381Create a pair of socket objects from the sockets returned by the platform\n\
4382socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004383The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004384AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004385
4386#endif /* HAVE_SOCKETPAIR */
4387
4388
Guido van Rossum006bf911996-06-12 04:04:55 +00004389static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004390socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4395 return NULL;
4396 }
4397 if (x1 < 0) {
4398 PyErr_SetString(PyExc_OverflowError,
4399 "can't convert negative number to unsigned long");
4400 return NULL;
4401 }
4402 x2 = (unsigned int)ntohs((unsigned short)x1);
4403 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004404}
4405
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004406PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004407"ntohs(integer) -> integer\n\
4408\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004409Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004410
4411
Guido van Rossum006bf911996-06-12 04:04:55 +00004412static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004413socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 if (PyLong_Check(arg)) {
4418 x = PyLong_AsUnsignedLong(arg);
4419 if (x == (unsigned long) -1 && PyErr_Occurred())
4420 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004421#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 {
4423 unsigned long y;
4424 /* only want the trailing 32 bits */
4425 y = x & 0xFFFFFFFFUL;
4426 if (y ^ x)
4427 return PyErr_Format(PyExc_OverflowError,
4428 "long int larger than 32 bits");
4429 x = y;
4430 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 }
4433 else
4434 return PyErr_Format(PyExc_TypeError,
4435 "expected int/long, %s found",
4436 Py_TYPE(arg)->tp_name);
4437 if (x == (unsigned long) -1 && PyErr_Occurred())
4438 return NULL;
4439 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004440}
4441
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004442PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004443"ntohl(integer) -> integer\n\
4444\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004445Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004446
4447
Guido van Rossum006bf911996-06-12 04:04:55 +00004448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004449socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4454 return NULL;
4455 }
4456 if (x1 < 0) {
4457 PyErr_SetString(PyExc_OverflowError,
4458 "can't convert negative number to unsigned long");
4459 return NULL;
4460 }
4461 x2 = (unsigned int)htons((unsigned short)x1);
4462 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004463}
4464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004465PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004466"htons(integer) -> integer\n\
4467\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004468Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004469
4470
Guido van Rossum006bf911996-06-12 04:04:55 +00004471static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004472socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 if (PyLong_Check(arg)) {
4477 x = PyLong_AsUnsignedLong(arg);
4478 if (x == (unsigned long) -1 && PyErr_Occurred())
4479 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004480#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 {
4482 unsigned long y;
4483 /* only want the trailing 32 bits */
4484 y = x & 0xFFFFFFFFUL;
4485 if (y ^ x)
4486 return PyErr_Format(PyExc_OverflowError,
4487 "long int larger than 32 bits");
4488 x = y;
4489 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 }
4492 else
4493 return PyErr_Format(PyExc_TypeError,
4494 "expected int/long, %s found",
4495 Py_TYPE(arg)->tp_name);
4496 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004497}
4498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004499PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004500"htonl(integer) -> integer\n\
4501\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004502Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004503
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004504/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004506PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004507"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004508\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004509Convert 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 +00004510binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004511
4512static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004513socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004514{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004515#ifndef INADDR_NONE
4516#define INADDR_NONE (-1)
4517#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004518#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004520#endif
4521
4522#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004523#if (SIZEOF_INT != 4)
4524#error "Not sure if in_addr_t exists and int is not 32-bits."
4525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 /* Have to use inet_addr() instead */
4527 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4532 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004533
Tim Peters1df9fdd2003-02-13 03:13:40 +00004534
4535#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004536
4537#ifdef USE_INET_ATON_WEAKLINK
4538 if (inet_aton != NULL) {
4539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 if (inet_aton(ip_addr, &buf))
4541 return PyBytes_FromStringAndSize((char *)(&buf),
4542 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004544 PyErr_SetString(socket_error,
4545 "illegal IP address string passed to inet_aton");
4546 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004547
Thomas Wouters477c8d52006-05-27 19:21:47 +00004548#ifdef USE_INET_ATON_WEAKLINK
4549 } else {
4550#endif
4551
4552#endif
4553
4554#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 /* special-case this address as inet_addr might return INADDR_NONE
4557 * for this */
4558 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4559 packed_addr = 0xFFFFFFFF;
4560 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 if (packed_addr == INADDR_NONE) { /* invalid address */
4565 PyErr_SetString(socket_error,
4566 "illegal IP address string passed to inet_aton");
4567 return NULL;
4568 }
4569 }
4570 return PyBytes_FromStringAndSize((char *) &packed_addr,
4571 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004572
4573#ifdef USE_INET_ATON_WEAKLINK
4574 }
4575#endif
4576
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004577#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004578}
4579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004580PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004581"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004582\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004583Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004584
4585static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004586socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 char *packed_str;
4589 int addr_len;
4590 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4593 return NULL;
4594 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 if (addr_len != sizeof(packed_addr)) {
4597 PyErr_SetString(socket_error,
4598 "packed IP wrong length for inet_ntoa");
4599 return NULL;
4600 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004605}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004607#ifdef HAVE_INET_PTON
4608
4609PyDoc_STRVAR(inet_pton_doc,
4610"inet_pton(af, ip) -> packed IP address string\n\
4611\n\
4612Convert an IP address from string format to a packed string suitable\n\
4613for use with low-level network functions.");
4614
4615static PyObject *
4616socket_inet_pton(PyObject *self, PyObject *args)
4617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 int af;
4619 char* ip;
4620 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004621#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004623#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4627 return NULL;
4628 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004629
Martin v. Löwis04697e82004-06-02 12:35:29 +00004630#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 if(af == AF_INET6) {
4632 PyErr_SetString(socket_error,
4633 "can't use AF_INET6, IPv6 is disabled");
4634 return NULL;
4635 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004636#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 retval = inet_pton(af, ip, packed);
4639 if (retval < 0) {
4640 PyErr_SetFromErrno(socket_error);
4641 return NULL;
4642 } else if (retval == 0) {
4643 PyErr_SetString(socket_error,
4644 "illegal IP address string passed to inet_pton");
4645 return NULL;
4646 } else if (af == AF_INET) {
4647 return PyBytes_FromStringAndSize(packed,
4648 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004649#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 } else if (af == AF_INET6) {
4651 return PyBytes_FromStringAndSize(packed,
4652 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 } else {
4655 PyErr_SetString(socket_error, "unknown address family");
4656 return NULL;
4657 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004658}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004659
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004660PyDoc_STRVAR(inet_ntop_doc,
4661"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4662\n\
4663Convert a packed IP address of the given family to string format.");
4664
4665static PyObject *
4666socket_inet_ntop(PyObject *self, PyObject *args)
4667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 int af;
4669 char* packed;
4670 int len;
4671 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004672#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004674#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004676#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4679 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4682 return NULL;
4683 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 if (af == AF_INET) {
4686 if (len != sizeof(struct in_addr)) {
4687 PyErr_SetString(PyExc_ValueError,
4688 "invalid length of packed IP address string");
4689 return NULL;
4690 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004691#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 } else if (af == AF_INET6) {
4693 if (len != sizeof(struct in6_addr)) {
4694 PyErr_SetString(PyExc_ValueError,
4695 "invalid length of packed IP address string");
4696 return NULL;
4697 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 } else {
4700 PyErr_Format(PyExc_ValueError,
4701 "unknown address family %d", af);
4702 return NULL;
4703 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 retval = inet_ntop(af, packed, ip, sizeof(ip));
4706 if (!retval) {
4707 PyErr_SetFromErrno(socket_error);
4708 return NULL;
4709 } else {
4710 return PyUnicode_FromString(retval);
4711 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 /* NOTREACHED */
4714 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4715 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004716}
4717
4718#endif /* HAVE_INET_PTON */
4719
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004720/* Python interface to getaddrinfo(host, port). */
4721
4722/*ARGSUSED*/
4723static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004724socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004725{
Victor Stinner77af1722011-05-26 14:05:59 +02004726 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004727 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 struct addrinfo hints, *res;
4729 struct addrinfo *res0 = NULL;
4730 PyObject *hobj = NULL;
4731 PyObject *pobj = (PyObject *)NULL;
4732 char pbuf[30];
4733 char *hptr, *pptr;
4734 int family, socktype, protocol, flags;
4735 int error;
4736 PyObject *all = (PyObject *)NULL;
4737 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 family = socktype = protocol = flags = 0;
4740 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004741 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004742 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 &protocol, &flags)) {
4744 return NULL;
4745 }
4746 if (hobj == Py_None) {
4747 hptr = NULL;
4748 } else if (PyUnicode_Check(hobj)) {
4749 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4750 if (!idna)
4751 return NULL;
4752 assert(PyBytes_Check(idna));
4753 hptr = PyBytes_AS_STRING(idna);
4754 } else if (PyBytes_Check(hobj)) {
4755 hptr = PyBytes_AsString(hobj);
4756 } else {
4757 PyErr_SetString(PyExc_TypeError,
4758 "getaddrinfo() argument 1 must be string or None");
4759 return NULL;
4760 }
4761 if (PyLong_CheckExact(pobj)) {
4762 long value = PyLong_AsLong(pobj);
4763 if (value == -1 && PyErr_Occurred())
4764 goto err;
4765 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4766 pptr = pbuf;
4767 } else if (PyUnicode_Check(pobj)) {
4768 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004769 if (pptr == NULL)
4770 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004772 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 } else if (pobj == Py_None) {
4774 pptr = (char *)NULL;
4775 } else {
4776 PyErr_SetString(socket_error, "Int or String expected");
4777 goto err;
4778 }
4779 memset(&hints, 0, sizeof(hints));
4780 hints.ai_family = family;
4781 hints.ai_socktype = socktype;
4782 hints.ai_protocol = protocol;
4783 hints.ai_flags = flags;
4784 Py_BEGIN_ALLOW_THREADS
4785 ACQUIRE_GETADDRINFO_LOCK
4786 error = getaddrinfo(hptr, pptr, &hints, &res0);
4787 Py_END_ALLOW_THREADS
4788 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4789 if (error) {
4790 set_gaierror(error);
4791 goto err;
4792 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 if ((all = PyList_New(0)) == NULL)
4795 goto err;
4796 for (res = res0; res; res = res->ai_next) {
4797 PyObject *single;
4798 PyObject *addr =
4799 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4800 if (addr == NULL)
4801 goto err;
4802 single = Py_BuildValue("iiisO", res->ai_family,
4803 res->ai_socktype, res->ai_protocol,
4804 res->ai_canonname ? res->ai_canonname : "",
4805 addr);
4806 Py_DECREF(addr);
4807 if (single == NULL)
4808 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 if (PyList_Append(all, single))
4811 goto err;
4812 Py_XDECREF(single);
4813 }
4814 Py_XDECREF(idna);
4815 if (res0)
4816 freeaddrinfo(res0);
4817 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004818 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 Py_XDECREF(all);
4820 Py_XDECREF(idna);
4821 if (res0)
4822 freeaddrinfo(res0);
4823 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004824}
4825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004826PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004827"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4828 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004829\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004830Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004831
4832/* Python interface to getnameinfo(sa, flags). */
4833
4834/*ARGSUSED*/
4835static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004836socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 PyObject *sa = (PyObject *)NULL;
4839 int flags;
4840 char *hostp;
4841 int port, flowinfo, scope_id;
4842 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4843 struct addrinfo hints, *res = NULL;
4844 int error;
4845 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 flags = flowinfo = scope_id = 0;
4848 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4849 return NULL;
4850 if (!PyTuple_Check(sa)) {
4851 PyErr_SetString(PyExc_TypeError,
4852 "getnameinfo() argument 1 must be a tuple");
4853 return NULL;
4854 }
4855 if (!PyArg_ParseTuple(sa, "si|ii",
4856 &hostp, &port, &flowinfo, &scope_id))
4857 return NULL;
4858 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4859 memset(&hints, 0, sizeof(hints));
4860 hints.ai_family = AF_UNSPEC;
4861 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004862 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 Py_BEGIN_ALLOW_THREADS
4864 ACQUIRE_GETADDRINFO_LOCK
4865 error = getaddrinfo(hostp, pbuf, &hints, &res);
4866 Py_END_ALLOW_THREADS
4867 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4868 if (error) {
4869 set_gaierror(error);
4870 goto fail;
4871 }
4872 if (res->ai_next) {
4873 PyErr_SetString(socket_error,
4874 "sockaddr resolved to multiple addresses");
4875 goto fail;
4876 }
4877 switch (res->ai_family) {
4878 case AF_INET:
4879 {
4880 if (PyTuple_GET_SIZE(sa) != 2) {
4881 PyErr_SetString(socket_error,
4882 "IPv4 sockaddr must be 2 tuple");
4883 goto fail;
4884 }
4885 break;
4886 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004887#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 case AF_INET6:
4889 {
4890 struct sockaddr_in6 *sin6;
4891 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4892 sin6->sin6_flowinfo = flowinfo;
4893 sin6->sin6_scope_id = scope_id;
4894 break;
4895 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004898 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4900 if (error) {
4901 set_gaierror(error);
4902 goto fail;
4903 }
4904 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004905
4906fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 if (res)
4908 freeaddrinfo(res);
4909 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004910}
4911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004912PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004913"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004914\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004915Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004916
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004917
4918/* Python API to getting and setting the default timeout value. */
4919
4920static PyObject *
4921socket_getdefaulttimeout(PyObject *self)
4922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 if (defaulttimeout < 0.0) {
4924 Py_INCREF(Py_None);
4925 return Py_None;
4926 }
4927 else
4928 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004929}
4930
4931PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004932"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004933\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03004934Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004935A value of None indicates that new socket objects have no timeout.\n\
4936When the socket module is first imported, the default is None.");
4937
4938static PyObject *
4939socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 if (arg == Py_None)
4944 timeout = -1.0;
4945 else {
4946 timeout = PyFloat_AsDouble(arg);
4947 if (timeout < 0.0) {
4948 if (!PyErr_Occurred())
4949 PyErr_SetString(PyExc_ValueError,
4950 "Timeout value out of range");
4951 return NULL;
4952 }
4953 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 Py_INCREF(Py_None);
4958 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004959}
4960
4961PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004962"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004963\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03004964Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004965A value of None indicates that new socket objects have no timeout.\n\
4966When the socket module is first imported, the default is None.");
4967
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004968#ifdef HAVE_IF_NAMEINDEX
4969/* Python API for getting interface indices and names */
4970
4971static PyObject *
4972socket_if_nameindex(PyObject *self, PyObject *arg)
4973{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004974 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02004975 int i;
4976 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02004977
Charles-François Natali60713592011-05-20 16:55:06 +02004978 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004979 if (ni == NULL) {
Charles-François Natali60713592011-05-20 16:55:06 +02004980 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004981 return NULL;
4982 }
4983
4984 list = PyList_New(0);
4985 if (list == NULL) {
4986 if_freenameindex(ni);
4987 return NULL;
4988 }
4989
Charles-François Natali60713592011-05-20 16:55:06 +02004990 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
4991 PyObject *ni_tuple = Py_BuildValue("IO&",
4992 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004993
4994 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
4995 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02004996 Py_DECREF(list);
4997 if_freenameindex(ni);
4998 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004999 }
5000 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005001 }
5002
5003 if_freenameindex(ni);
5004 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005005}
5006
5007PyDoc_STRVAR(if_nameindex_doc,
5008"if_nameindex()\n\
5009\n\
5010Returns a list of network interface information (index, name) tuples.");
5011
Charles-François Natali60713592011-05-20 16:55:06 +02005012static PyObject *
5013socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005014{
Charles-François Natali60713592011-05-20 16:55:06 +02005015 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005016 unsigned long index;
5017
Charles-François Natali60713592011-05-20 16:55:06 +02005018 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5019 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005020 return NULL;
5021
Charles-François Natali60713592011-05-20 16:55:06 +02005022 index = if_nametoindex(PyBytes_AS_STRING(oname));
5023 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005024 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005025 /* if_nametoindex() doesn't set errno */
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005026 PyErr_SetString(socket_error, "no interface with this name");
5027 return NULL;
5028 }
5029
5030 return PyLong_FromUnsignedLong(index);
5031}
5032
5033PyDoc_STRVAR(if_nametoindex_doc,
5034"if_nametoindex(if_name)\n\
5035\n\
5036Returns the interface index corresponding to the interface name if_name.");
5037
Charles-François Natali60713592011-05-20 16:55:06 +02005038static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005039socket_if_indextoname(PyObject *self, PyObject *arg)
5040{
Charles-François Natali60713592011-05-20 16:55:06 +02005041 unsigned long index;
5042 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005043
Charles-François Natali60713592011-05-20 16:55:06 +02005044 index = PyLong_AsUnsignedLong(arg);
5045 if (index == (unsigned long) -1)
5046 return NULL;
5047
5048 if (if_indextoname(index, name) == NULL) {
5049 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005050 return NULL;
5051 }
5052
Charles-François Natali60713592011-05-20 16:55:06 +02005053 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005054}
5055
5056PyDoc_STRVAR(if_indextoname_doc,
5057"if_indextoname(if_index)\n\
5058\n\
5059Returns the interface name corresponding to the interface index if_index.");
5060
5061#endif /* HAVE_IF_NAMEINDEX */
5062
5063
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005064#ifdef CMSG_LEN
5065/* Python interface to CMSG_LEN(length). */
5066
5067static PyObject *
5068socket_CMSG_LEN(PyObject *self, PyObject *args)
5069{
5070 Py_ssize_t length;
5071 size_t result;
5072
5073 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5074 return NULL;
5075 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5076 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5077 return NULL;
5078 }
5079 return PyLong_FromSize_t(result);
5080}
5081
5082PyDoc_STRVAR(CMSG_LEN_doc,
5083"CMSG_LEN(length) -> control message length\n\
5084\n\
5085Return the total length, without trailing padding, of an ancillary\n\
5086data item with associated data of the given length. This value can\n\
5087often be used as the buffer size for recvmsg() to receive a single\n\
5088item of ancillary data, but RFC 3542 requires portable applications to\n\
5089use CMSG_SPACE() and thus include space for padding, even when the\n\
5090item will be the last in the buffer. Raises OverflowError if length\n\
5091is outside the permissible range of values.");
5092
5093
5094#ifdef CMSG_SPACE
5095/* Python interface to CMSG_SPACE(length). */
5096
5097static PyObject *
5098socket_CMSG_SPACE(PyObject *self, PyObject *args)
5099{
5100 Py_ssize_t length;
5101 size_t result;
5102
5103 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5104 return NULL;
5105 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5106 PyErr_SetString(PyExc_OverflowError,
5107 "CMSG_SPACE() argument out of range");
5108 return NULL;
5109 }
5110 return PyLong_FromSize_t(result);
5111}
5112
5113PyDoc_STRVAR(CMSG_SPACE_doc,
5114"CMSG_SPACE(length) -> buffer size\n\
5115\n\
5116Return the buffer size needed for recvmsg() to receive an ancillary\n\
5117data item with associated data of the given length, along with any\n\
5118trailing padding. The buffer space needed to receive multiple items\n\
5119is the sum of the CMSG_SPACE() values for their associated data\n\
5120lengths. Raises OverflowError if length is outside the permissible\n\
5121range of values.");
5122#endif /* CMSG_SPACE */
5123#endif /* CMSG_LEN */
5124
5125
Guido van Rossum30a685f1991-06-27 15:51:29 +00005126/* List of functions exported by this module. */
5127
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005128static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 {"gethostbyname", socket_gethostbyname,
5130 METH_VARARGS, gethostbyname_doc},
5131 {"gethostbyname_ex", socket_gethostbyname_ex,
5132 METH_VARARGS, ghbn_ex_doc},
5133 {"gethostbyaddr", socket_gethostbyaddr,
5134 METH_VARARGS, gethostbyaddr_doc},
5135 {"gethostname", socket_gethostname,
5136 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005137#ifdef HAVE_SETHOSTNAME
5138 {"sethostname", socket_sethostname,
5139 METH_VARARGS, sethostname_doc},
5140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 {"getservbyname", socket_getservbyname,
5142 METH_VARARGS, getservbyname_doc},
5143 {"getservbyport", socket_getservbyport,
5144 METH_VARARGS, getservbyport_doc},
5145 {"getprotobyname", socket_getprotobyname,
5146 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005147#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 {"dup", socket_dup,
5149 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005150#endif
Dave Cole331708b2004-08-09 04:51:41 +00005151#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 {"socketpair", socket_socketpair,
5153 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 {"ntohs", socket_ntohs,
5156 METH_VARARGS, ntohs_doc},
5157 {"ntohl", socket_ntohl,
5158 METH_O, ntohl_doc},
5159 {"htons", socket_htons,
5160 METH_VARARGS, htons_doc},
5161 {"htonl", socket_htonl,
5162 METH_O, htonl_doc},
5163 {"inet_aton", socket_inet_aton,
5164 METH_VARARGS, inet_aton_doc},
5165 {"inet_ntoa", socket_inet_ntoa,
5166 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005167#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 {"inet_pton", socket_inet_pton,
5169 METH_VARARGS, inet_pton_doc},
5170 {"inet_ntop", socket_inet_ntop,
5171 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005172#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005173 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5174 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 {"getnameinfo", socket_getnameinfo,
5176 METH_VARARGS, getnameinfo_doc},
5177 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5178 METH_NOARGS, getdefaulttimeout_doc},
5179 {"setdefaulttimeout", socket_setdefaulttimeout,
5180 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005181#ifdef HAVE_IF_NAMEINDEX
5182 {"if_nameindex", socket_if_nameindex,
5183 METH_NOARGS, if_nameindex_doc},
5184 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005185 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005186 {"if_indextoname", socket_if_indextoname,
5187 METH_O, if_indextoname_doc},
5188#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005189#ifdef CMSG_LEN
5190 {"CMSG_LEN", socket_CMSG_LEN,
5191 METH_VARARGS, CMSG_LEN_doc},
5192#ifdef CMSG_SPACE
5193 {"CMSG_SPACE", socket_CMSG_SPACE,
5194 METH_VARARGS, CMSG_SPACE_doc},
5195#endif
5196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005198};
5199
Guido van Rossum30a685f1991-06-27 15:51:29 +00005200
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005201#ifdef MS_WINDOWS
5202#define OS_INIT_DEFINED
5203
5204/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005205
5206static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005207os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005210}
5211
5212static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005213os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 WSADATA WSAData;
5216 int ret;
5217 ret = WSAStartup(0x0101, &WSAData);
5218 switch (ret) {
5219 case 0: /* No error */
5220 Py_AtExit(os_cleanup);
5221 return 1; /* Success */
5222 case WSASYSNOTREADY:
5223 PyErr_SetString(PyExc_ImportError,
5224 "WSAStartup failed: network not ready");
5225 break;
5226 case WSAVERNOTSUPPORTED:
5227 case WSAEINVAL:
5228 PyErr_SetString(
5229 PyExc_ImportError,
5230 "WSAStartup failed: requested version not supported");
5231 break;
5232 default:
5233 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5234 break;
5235 }
5236 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005237}
5238
Guido van Rossum8d665e61996-06-26 18:22:49 +00005239#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005240
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005241
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005242#ifdef PYOS_OS2
5243#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005244
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005245/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005246
5247static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005248os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005249{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005250#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 if (rc == 0) {
5254 return 1; /* Success */
5255 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005260#else
Ezio Melotti13925002011-03-16 11:05:33 +02005261 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005263#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005264}
5265
5266#endif /* PYOS_OS2 */
5267
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005268
5269#ifndef OS_INIT_DEFINED
5270static int
5271os_init(void)
5272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005274}
5275#endif
5276
5277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005278/* C API table - always add new things to the end for binary
5279 compatibility. */
5280static
5281PySocketModule_APIObject PySocketModuleAPI =
5282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005284 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005286};
5287
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005288
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005289/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005290
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005291 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005292 "socket.py" which implements some additional functionality.
5293 The import of "_socket" may fail with an ImportError exception if
5294 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005295 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005296 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005297*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005299PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005300"Implementation module for socket operations.\n\
5301\n\
5302See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005303
Martin v. Löwis1a214512008-06-11 05:26:20 +00005304static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 PyModuleDef_HEAD_INIT,
5306 PySocket_MODULE_NAME,
5307 socket_doc,
5308 -1,
5309 socket_methods,
5310 NULL,
5311 NULL,
5312 NULL,
5313 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005314};
5315
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005316PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005317PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 if (!os_init())
5322 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 Py_TYPE(&sock_type) = &PyType_Type;
5325 m = PyModule_Create(&socketmodule);
5326 if (m == NULL)
5327 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 socket_error = PyErr_NewException("socket.error",
5330 PyExc_IOError, NULL);
5331 if (socket_error == NULL)
5332 return NULL;
5333 PySocketModuleAPI.error = socket_error;
5334 Py_INCREF(socket_error);
5335 PyModule_AddObject(m, "error", socket_error);
5336 socket_herror = PyErr_NewException("socket.herror",
5337 socket_error, NULL);
5338 if (socket_herror == NULL)
5339 return NULL;
5340 Py_INCREF(socket_herror);
5341 PyModule_AddObject(m, "herror", socket_herror);
5342 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
5343 NULL);
5344 if (socket_gaierror == NULL)
5345 return NULL;
5346 Py_INCREF(socket_gaierror);
5347 PyModule_AddObject(m, "gaierror", socket_gaierror);
5348 socket_timeout = PyErr_NewException("socket.timeout",
5349 socket_error, NULL);
5350 if (socket_timeout == NULL)
5351 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005352 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 Py_INCREF(socket_timeout);
5354 PyModule_AddObject(m, "timeout", socket_timeout);
5355 Py_INCREF((PyObject *)&sock_type);
5356 if (PyModule_AddObject(m, "SocketType",
5357 (PyObject *)&sock_type) != 0)
5358 return NULL;
5359 Py_INCREF((PyObject *)&sock_type);
5360 if (PyModule_AddObject(m, "socket",
5361 (PyObject *)&sock_type) != 0)
5362 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005363
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005364#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005366#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 Py_INCREF(has_ipv6);
5370 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 /* Export C API */
5373 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5374 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5375 ) != 0)
5376 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005379#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005383#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005385#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005386#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005388#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005389#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 /* Amateur Radio AX.25 */
5391 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005392#endif
5393#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005395#endif
5396#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 /* Appletalk DDP */
5398 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005399#endif
5400#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 /* Amateur radio NetROM */
5402 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005403#endif
5404#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 /* Multiprotocol bridge */
5406 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005407#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005408#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 /* ATM PVCs */
5410 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005411#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005412#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 /* Reserved for Werner's ATM */
5414 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005415#endif
5416#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 /* Reserved for X.25 project */
5418 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005419#endif
5420#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005422#endif
5423#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 /* Amateur Radio X.25 PLP */
5425 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005426#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005427#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 /* Reserved for DECnet project */
5429 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005430#endif
5431#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 /* Reserved for 802.2LLC project */
5433 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005434#endif
5435#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 /* Security callback pseudo AF */
5437 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005438#endif
5439#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 /* PF_KEY key management API */
5441 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005442#endif
5443#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 /* */
5445 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5446 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005447#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005449#endif
5450#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5454 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005455#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005457#endif
5458#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005460#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005461#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005463#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005464#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005466#endif
5467#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005471#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005473#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005474#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005476#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005477#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005478#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 /* Alias to emulate 4.4BSD */
5480 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005481#endif
5482#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 /* Ash */
5484 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005485#endif
5486#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 /* Acorn Econet */
5488 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005489#endif
5490#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 /* ATM SVCs */
5492 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005493#endif
5494#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 /* Linux SNA Project (nutters!) */
5496 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005497#endif
5498#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 /* IRDA sockets */
5500 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005501#endif
5502#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 /* PPPoX sockets */
5504 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005505#endif
5506#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 /* Wanpipe API Sockets */
5508 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005509#endif
5510#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 /* Linux LLC */
5512 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005513#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005514
Hye-Shik Chang81268602004-02-02 06:05:24 +00005515#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5517 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5518 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5519 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005520#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005522#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005523#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005524#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5528 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5531 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5532 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005533#endif
5534
Antoine Pitroub156a462010-10-27 20:13:57 +00005535#ifdef AF_PACKET
5536 PyModule_AddIntMacro(m, AF_PACKET);
5537#endif
5538#ifdef PF_PACKET
5539 PyModule_AddIntMacro(m, PF_PACKET);
5540#endif
5541#ifdef PACKET_HOST
5542 PyModule_AddIntMacro(m, PACKET_HOST);
5543#endif
5544#ifdef PACKET_BROADCAST
5545 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5546#endif
5547#ifdef PACKET_MULTICAST
5548 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5549#endif
5550#ifdef PACKET_OTHERHOST
5551 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5552#endif
5553#ifdef PACKET_OUTGOING
5554 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5555#endif
5556#ifdef PACKET_LOOPBACK
5557 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5558#endif
5559#ifdef PACKET_FASTROUTE
5560 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005561#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005562
Christian Heimes043d6f62008-01-07 17:19:16 +00005563#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 /* for addresses */
5567 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5568 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5569 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5572 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5573 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 /* for setsockopt() */
5576 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5577 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5578 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5579 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5580 TIPC_DEST_DROPPABLE);
5581 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5584 TIPC_LOW_IMPORTANCE);
5585 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5586 TIPC_MEDIUM_IMPORTANCE);
5587 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5588 TIPC_HIGH_IMPORTANCE);
5589 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5590 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 /* for subscriptions */
5593 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5594 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005595#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 /* doesn't seem to be available everywhere */
5597 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5600 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5601 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5602 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5603 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5604 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005605#endif
5606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 /* Socket types */
5608 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5609 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005610/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5612 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005613#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005615#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005616#ifdef SOCK_CLOEXEC
5617 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5618#endif
5619#ifdef SOCK_NONBLOCK
5620 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5621#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623#ifdef SO_DEBUG
5624 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626#ifdef SO_ACCEPTCONN
5627 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629#ifdef SO_REUSEADDR
5630 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005631#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005632#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005634#endif
5635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636#ifdef SO_KEEPALIVE
5637 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639#ifdef SO_DONTROUTE
5640 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642#ifdef SO_BROADCAST
5643 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645#ifdef SO_USELOOPBACK
5646 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648#ifdef SO_LINGER
5649 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651#ifdef SO_OOBINLINE
5652 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654#ifdef SO_REUSEPORT
5655 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657#ifdef SO_SNDBUF
5658 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660#ifdef SO_RCVBUF
5661 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663#ifdef SO_SNDLOWAT
5664 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666#ifdef SO_RCVLOWAT
5667 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669#ifdef SO_SNDTIMEO
5670 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005672#ifdef SO_RCVTIMEO
5673 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675#ifdef SO_ERROR
5676 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678#ifdef SO_TYPE
5679 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681#ifdef SO_SETFIB
5682 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005683#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005684#ifdef SO_PASSCRED
5685 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5686#endif
5687#ifdef SO_PEERCRED
5688 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5689#endif
5690#ifdef LOCAL_PEERCRED
5691 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5692#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 /* Maximum number of connections for "listen" */
5695#ifdef SOMAXCONN
5696 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005697#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005699#endif
5700
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005701 /* Ancilliary message types */
5702#ifdef SCM_RIGHTS
5703 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5704#endif
5705#ifdef SCM_CREDENTIALS
5706 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5707#endif
5708#ifdef SCM_CREDS
5709 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5710#endif
5711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 /* Flags for send, recv */
5713#ifdef MSG_OOB
5714 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716#ifdef MSG_PEEK
5717 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719#ifdef MSG_DONTROUTE
5720 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722#ifdef MSG_DONTWAIT
5723 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725#ifdef MSG_EOR
5726 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728#ifdef MSG_TRUNC
5729 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005730#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731#ifdef MSG_CTRUNC
5732 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005733#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734#ifdef MSG_WAITALL
5735 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737#ifdef MSG_BTAG
5738 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740#ifdef MSG_ETAG
5741 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005742#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005743#ifdef MSG_NOSIGNAL
5744 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5745#endif
5746#ifdef MSG_NOTIFICATION
5747 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5748#endif
5749#ifdef MSG_CMSG_CLOEXEC
5750 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5751#endif
5752#ifdef MSG_ERRQUEUE
5753 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5754#endif
5755#ifdef MSG_CONFIRM
5756 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5757#endif
5758#ifdef MSG_MORE
5759 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5760#endif
5761#ifdef MSG_EOF
5762 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5763#endif
5764#ifdef MSG_BCAST
5765 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5766#endif
5767#ifdef MSG_MCAST
5768 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5769#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771 /* Protocol level and numbers, usable for [gs]etsockopt */
5772#ifdef SOL_SOCKET
5773 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775#ifdef SOL_IP
5776 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005777#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780#ifdef SOL_IPX
5781 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783#ifdef SOL_AX25
5784 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786#ifdef SOL_ATALK
5787 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789#ifdef SOL_NETROM
5790 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792#ifdef SOL_ROSE
5793 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795#ifdef SOL_TCP
5796 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005797#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800#ifdef SOL_UDP
5801 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005802#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805#ifdef IPPROTO_IP
5806 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005807#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810#ifdef IPPROTO_HOPOPTS
5811 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813#ifdef IPPROTO_ICMP
5814 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005815#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818#ifdef IPPROTO_IGMP
5819 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821#ifdef IPPROTO_GGP
5822 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824#ifdef IPPROTO_IPV4
5825 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827#ifdef IPPROTO_IPV6
5828 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830#ifdef IPPROTO_IPIP
5831 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833#ifdef IPPROTO_TCP
5834 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005835#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838#ifdef IPPROTO_EGP
5839 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841#ifdef IPPROTO_PUP
5842 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005844#ifdef IPPROTO_UDP
5845 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005846#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849#ifdef IPPROTO_IDP
5850 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852#ifdef IPPROTO_HELLO
5853 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855#ifdef IPPROTO_ND
5856 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858#ifdef IPPROTO_TP
5859 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861#ifdef IPPROTO_IPV6
5862 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864#ifdef IPPROTO_ROUTING
5865 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005867#ifdef IPPROTO_FRAGMENT
5868 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870#ifdef IPPROTO_RSVP
5871 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873#ifdef IPPROTO_GRE
5874 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876#ifdef IPPROTO_ESP
5877 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879#ifdef IPPROTO_AH
5880 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882#ifdef IPPROTO_MOBILE
5883 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885#ifdef IPPROTO_ICMPV6
5886 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888#ifdef IPPROTO_NONE
5889 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891#ifdef IPPROTO_DSTOPTS
5892 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894#ifdef IPPROTO_XTP
5895 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897#ifdef IPPROTO_EON
5898 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900#ifdef IPPROTO_PIM
5901 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903#ifdef IPPROTO_IPCOMP
5904 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906#ifdef IPPROTO_VRRP
5907 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005908#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005909#ifdef IPPROTO_SCTP
5910 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
5911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912#ifdef IPPROTO_BIP
5913 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005914#endif
5915/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916#ifdef IPPROTO_RAW
5917 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005918#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921#ifdef IPPROTO_MAX
5922 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005923#endif
5924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 /* Some port configuration */
5926#ifdef IPPORT_RESERVED
5927 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005928#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931#ifdef IPPORT_USERRESERVED
5932 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005933#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005935#endif
5936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 /* Some reserved IP v.4 addresses */
5938#ifdef INADDR_ANY
5939 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005940#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943#ifdef INADDR_BROADCAST
5944 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005945#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948#ifdef INADDR_LOOPBACK
5949 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005950#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953#ifdef INADDR_UNSPEC_GROUP
5954 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005955#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958#ifdef INADDR_ALLHOSTS_GROUP
5959 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5960 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005961#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964#ifdef INADDR_MAX_LOCAL_GROUP
5965 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5966 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005967#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970#ifdef INADDR_NONE
5971 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005972#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005974#endif
5975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 /* IPv4 [gs]etsockopt options */
5977#ifdef IP_OPTIONS
5978 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980#ifdef IP_HDRINCL
5981 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983#ifdef IP_TOS
5984 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986#ifdef IP_TTL
5987 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989#ifdef IP_RECVOPTS
5990 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992#ifdef IP_RECVRETOPTS
5993 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995#ifdef IP_RECVDSTADDR
5996 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998#ifdef IP_RETOPTS
5999 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001#ifdef IP_MULTICAST_IF
6002 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004#ifdef IP_MULTICAST_TTL
6005 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007#ifdef IP_MULTICAST_LOOP
6008 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010#ifdef IP_ADD_MEMBERSHIP
6011 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013#ifdef IP_DROP_MEMBERSHIP
6014 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016#ifdef IP_DEFAULT_MULTICAST_TTL
6017 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6018 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020#ifdef IP_DEFAULT_MULTICAST_LOOP
6021 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6022 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024#ifdef IP_MAX_MEMBERSHIPS
6025 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006026#endif
6027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6029#ifdef IPV6_JOIN_GROUP
6030 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032#ifdef IPV6_LEAVE_GROUP
6033 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035#ifdef IPV6_MULTICAST_HOPS
6036 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038#ifdef IPV6_MULTICAST_IF
6039 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041#ifdef IPV6_MULTICAST_LOOP
6042 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044#ifdef IPV6_UNICAST_HOPS
6045 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006048#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006052#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006054#endif
6055#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006057#endif
6058#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006060#endif
6061#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006063#endif
6064#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006066#endif
6067#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006069#endif
6070#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006072#endif
6073#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006075#endif
6076#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006078#endif
6079#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006081#endif
6082#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006084#endif
6085#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006087#endif
6088#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006090#endif
6091#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006093#endif
6094#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006096#endif
6097#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006099#endif
6100#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006102#endif
6103#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006105#endif
6106#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006108#endif
6109#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006111#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 /* TCP options */
6114#ifdef TCP_NODELAY
6115 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117#ifdef TCP_MAXSEG
6118 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120#ifdef TCP_CORK
6121 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123#ifdef TCP_KEEPIDLE
6124 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef TCP_KEEPINTVL
6127 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129#ifdef TCP_KEEPCNT
6130 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef TCP_SYNCNT
6133 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135#ifdef TCP_LINGER2
6136 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef TCP_DEFER_ACCEPT
6139 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef TCP_WINDOW_CLAMP
6142 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef TCP_INFO
6145 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef TCP_QUICKACK
6148 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006149#endif
6150
Guido van Rossum09be4091999-08-09 14:40:40 +00006151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 /* IPX options */
6153#ifdef IPX_TYPE
6154 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006155#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006158#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006160#endif
6161#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006163#endif
6164#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006166#endif
6167#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169#endif
6170#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006172#endif
6173#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006175#endif
6176#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006178#endif
6179#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006181#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006182#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006184#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006185#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006187#endif
6188#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006190#endif
6191#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006193#endif
6194#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006196#endif
6197#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006199#endif
6200#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006202#endif
6203#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006205#endif
6206#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006208#endif
6209#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006211#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006212#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006214#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006215#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006217#endif
6218#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006220#endif
6221#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006223#endif
6224#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006226#endif
6227#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006229#endif
6230#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006232#endif
6233#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006235#endif
6236#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006238#endif
6239#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006241#endif
6242#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006244#endif
6245#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006247#endif
6248#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006250#endif
6251#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006253#endif
6254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006256#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006258#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006260#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006262#endif
6263#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006265#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006267#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006269#endif
6270#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006272#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006274#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006276#endif
6277
Christian Heimesfaf2f632008-01-06 16:59:19 +00006278#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 {
6280 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6281 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6282 int i;
6283 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
6284 PyObject *tmp;
6285 tmp = PyLong_FromUnsignedLong(codes[i]);
6286 if (tmp == NULL)
6287 return NULL;
6288 PyModule_AddObject(m, names[i], tmp);
6289 }
6290 }
6291 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6292 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6293 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006294#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006296#endif
6297#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006299#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006300#endif /* _MSTCPIP_ */
6301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006303#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006307}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006308
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006309
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006310#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006311#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006312
6313/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006314/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006315
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006316int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006317inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006320#if (SIZEOF_INT != 4)
6321#error "Not sure if in_addr_t exists and int is not 32-bits."
6322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 unsigned int packed_addr;
6324 packed_addr = inet_addr(src);
6325 if (packed_addr == INADDR_NONE)
6326 return 0;
6327 memcpy(dst, &packed_addr, 4);
6328 return 1;
6329 }
6330 /* Should set errno to EAFNOSUPPORT */
6331 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006332}
6333
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006334const char *
6335inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 if (af == AF_INET) {
6338 struct in_addr packed_addr;
6339 if (size < 16)
6340 /* Should set errno to ENOSPC. */
6341 return NULL;
6342 memcpy(&packed_addr, src, sizeof(packed_addr));
6343 return strncpy(dst, inet_ntoa(packed_addr), size);
6344 }
6345 /* Should set errno to EAFNOSUPPORT */
6346 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006347}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006348
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006349#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006350#endif