blob: 62b3fe9f89ebcf3675c555e5fa6616124cecc3aa [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 Natali466517d2011-08-28 18:23:43 +02001748 /* Note that POSIX allows msg_controllen to be of signed type. */
1749 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001750 return 0;
1751 if (space < cmsg_len_end)
1752 space = cmsg_len_end;
1753 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1754 return (cmsg_offset <= (size_t)-1 - space &&
1755 cmsg_offset + space <= msg->msg_controllen);
1756}
1757
1758/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1759 *space to number of bytes following it in the buffer and return
1760 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1761 msg->msg_controllen are valid. */
1762static int
1763get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1764{
1765 size_t data_offset;
1766 char *data_ptr;
1767
1768 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1769 return 0;
1770 data_offset = data_ptr - (char *)msg->msg_control;
1771 if (data_offset > msg->msg_controllen)
1772 return 0;
1773 *space = msg->msg_controllen - data_offset;
1774 return 1;
1775}
1776
1777/* If cmsgh is invalid or not contained in the buffer pointed to by
1778 msg->msg_control, return -1. If cmsgh is valid and its associated
1779 data is entirely contained in the buffer, set *data_len to the
1780 length of the associated data and return 0. If only part of the
1781 associated data is contained in the buffer but cmsgh is otherwise
1782 valid, set *data_len to the length contained in the buffer and
1783 return 1. */
1784static int
1785get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1786{
1787 size_t space, cmsg_data_len;
1788
1789 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1790 cmsgh->cmsg_len < CMSG_LEN(0))
1791 return -1;
1792 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1793 if (!get_cmsg_data_space(msg, cmsgh, &space))
1794 return -1;
1795 if (space >= cmsg_data_len) {
1796 *data_len = cmsg_data_len;
1797 return 0;
1798 }
1799 *data_len = space;
1800 return 1;
1801}
1802#endif /* CMSG_LEN */
1803
1804
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001805/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001806
Guido van Rossum73624e91994-10-10 17:59:00 +00001807static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001808sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 sock_addr_t addrbuf;
1811 SOCKET_T newfd = INVALID_SOCKET;
1812 socklen_t addrlen;
1813 PyObject *sock = NULL;
1814 PyObject *addr = NULL;
1815 PyObject *res = NULL;
1816 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 if (!getsockaddrlen(s, &addrlen))
1818 return NULL;
1819 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 if (!IS_SELECTABLE(s))
1822 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001823
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001824 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001826 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001827 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001829 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 if (timeout == 1) {
1833 PyErr_SetString(socket_timeout, "timed out");
1834 return NULL;
1835 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001836 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 if (newfd == INVALID_SOCKET)
1839 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 sock = PyLong_FromSocket_t(newfd);
1842 if (sock == NULL) {
1843 SOCKETCLOSE(newfd);
1844 goto finally;
1845 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1848 addrlen, s->sock_proto);
1849 if (addr == NULL)
1850 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001853
Guido van Rossum67f7a382002-06-06 21:08:16 +00001854finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 Py_XDECREF(sock);
1856 Py_XDECREF(addr);
1857 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001858}
1859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001860PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001861"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001862\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001863Wait for an incoming connection. Return a new socket file descriptor\n\
1864representing the connection, and the address of the client.\n\
1865For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001866
Guido van Rossum11ba0942002-06-13 15:07:44 +00001867/* s.setblocking(flag) method. Argument:
1868 False -- non-blocking mode; same as settimeout(0)
1869 True -- blocking mode; same as settimeout(None)
1870*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001871
Guido van Rossum73624e91994-10-10 17:59:00 +00001872static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001873sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 block = PyLong_AsLong(arg);
1878 if (block == -1 && PyErr_Occurred())
1879 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 s->sock_timeout = block ? -1.0 : 0.0;
1882 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 Py_INCREF(Py_None);
1885 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001886}
Guido van Rossume4485b01994-09-07 14:32:49 +00001887
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001888PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001889"setblocking(flag)\n\
1890\n\
1891Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001892setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001893setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001894
Guido van Rossum11ba0942002-06-13 15:07:44 +00001895/* s.settimeout(timeout) method. Argument:
1896 None -- no timeout, blocking mode; same as setblocking(True)
1897 0.0 -- non-blocking mode; same as setblocking(False)
1898 > 0 -- timeout mode; operations time out after timeout seconds
1899 < 0 -- illegal; raises an exception
1900*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001902sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 if (arg == Py_None)
1907 timeout = -1.0;
1908 else {
1909 timeout = PyFloat_AsDouble(arg);
1910 if (timeout < 0.0) {
1911 if (!PyErr_Occurred())
1912 PyErr_SetString(PyExc_ValueError,
1913 "Timeout value out of range");
1914 return NULL;
1915 }
1916 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 s->sock_timeout = timeout;
1919 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 Py_INCREF(Py_None);
1922 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001923}
1924
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001925PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001926"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001927\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001928Set a timeout on socket operations. 'timeout' can be a float,\n\
1929giving in seconds, or None. Setting a timeout of None disables\n\
1930the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001931Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001932
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001933/* s.gettimeout() method.
1934 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001936sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 if (s->sock_timeout < 0.0) {
1939 Py_INCREF(Py_None);
1940 return Py_None;
1941 }
1942 else
1943 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001944}
1945
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001946PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001947"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001948\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03001949Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001950operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001951operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001952
Guido van Rossumaee08791992-09-08 09:05:33 +00001953/* s.setsockopt() method.
1954 With an integer third argument, sets an integer option.
1955 With a string third argument, sets an option from a buffer;
1956 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001957
Guido van Rossum73624e91994-10-10 17:59:00 +00001958static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001959sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 int level;
1962 int optname;
1963 int res;
1964 char *buf;
1965 int buflen;
1966 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 if (PyArg_ParseTuple(args, "iii:setsockopt",
1969 &level, &optname, &flag)) {
1970 buf = (char *) &flag;
1971 buflen = sizeof flag;
1972 }
1973 else {
1974 PyErr_Clear();
1975 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
1976 &level, &optname, &buf, &buflen))
1977 return NULL;
1978 }
1979 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1980 if (res < 0)
1981 return s->errorhandler();
1982 Py_INCREF(Py_None);
1983 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001984}
1985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001986PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001987"setsockopt(level, option, value)\n\
1988\n\
1989Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001992
Guido van Rossumaee08791992-09-08 09:05:33 +00001993/* s.getsockopt() method.
1994 With two arguments, retrieves an integer option.
1995 With a third integer argument, retrieves a string buffer of that size;
1996 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001997
Guido van Rossum73624e91994-10-10 17:59:00 +00001998static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001999sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 int level;
2002 int optname;
2003 int res;
2004 PyObject *buf;
2005 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2008 &level, &optname, &buflen))
2009 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 if (buflen == 0) {
2012 int flag = 0;
2013 socklen_t flagsize = sizeof flag;
2014 res = getsockopt(s->sock_fd, level, optname,
2015 (void *)&flag, &flagsize);
2016 if (res < 0)
2017 return s->errorhandler();
2018 return PyLong_FromLong(flag);
2019 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002020#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* socklen_t is unsigned so no negative test is needed,
2022 test buflen == 0 is previously done */
2023 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002024#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 PyErr_SetString(socket_error,
2028 "getsockopt buflen out of range");
2029 return NULL;
2030 }
2031 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2032 if (buf == NULL)
2033 return NULL;
2034 res = getsockopt(s->sock_fd, level, optname,
2035 (void *)PyBytes_AS_STRING(buf), &buflen);
2036 if (res < 0) {
2037 Py_DECREF(buf);
2038 return s->errorhandler();
2039 }
2040 _PyBytes_Resize(&buf, buflen);
2041 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002042}
2043
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002044PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002045"getsockopt(level, option[, buffersize]) -> value\n\
2046\n\
2047Get a socket option. See the Unix manual for level and option.\n\
2048If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002049string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002050
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002051
Fred Drake728819a2000-07-01 03:40:12 +00002052/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002053
Guido van Rossum73624e91994-10-10 17:59:00 +00002054static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002055sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 sock_addr_t addrbuf;
2058 int addrlen;
2059 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2062 return NULL;
2063 Py_BEGIN_ALLOW_THREADS
2064 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2065 Py_END_ALLOW_THREADS
2066 if (res < 0)
2067 return s->errorhandler();
2068 Py_INCREF(Py_None);
2069 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002070}
2071
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002072PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002073"bind(address)\n\
2074\n\
2075Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002076pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002077sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002078
Guido van Rossum30a685f1991-06-27 15:51:29 +00002079
2080/* s.close() method.
2081 Set the file descriptor to -1 so operations tried subsequently
2082 will surely fail. */
2083
Guido van Rossum73624e91994-10-10 17:59:00 +00002084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002085sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 if ((fd = s->sock_fd) != -1) {
2090 s->sock_fd = -1;
2091 Py_BEGIN_ALLOW_THREADS
2092 (void) SOCKETCLOSE(fd);
2093 Py_END_ALLOW_THREADS
2094 }
2095 Py_INCREF(Py_None);
2096 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002097}
2098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002099PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002100"close()\n\
2101\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002102Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002103
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002104static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002105sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002106{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002107 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002108 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002109 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002110}
2111
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002112PyDoc_STRVAR(detach_doc,
2113"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002114\n\
2115Close the socket object without closing the underlying file descriptor.\
2116The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002117can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002118
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002119static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002120internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 timeout = 0;
2126 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002127
2128#ifdef MS_WINDOWS
2129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 if (s->sock_timeout > 0.0) {
2131 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2132 IS_SELECTABLE(s)) {
2133 /* This is a mess. Best solution: trust select */
2134 fd_set fds;
2135 fd_set fds_exc;
2136 struct timeval tv;
2137 tv.tv_sec = (int)s->sock_timeout;
2138 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2139 FD_ZERO(&fds);
2140 FD_SET(s->sock_fd, &fds);
2141 FD_ZERO(&fds_exc);
2142 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002143 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2144 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 if (res == 0) {
2146 res = WSAEWOULDBLOCK;
2147 timeout = 1;
2148 } else if (res > 0) {
2149 if (FD_ISSET(s->sock_fd, &fds))
2150 /* The socket is in the writable set - this
2151 means connected */
2152 res = 0;
2153 else {
2154 /* As per MS docs, we need to call getsockopt()
2155 to get the underlying error */
2156 int res_size = sizeof res;
2157 /* It must be in the exception set */
2158 assert(FD_ISSET(s->sock_fd, &fds_exc));
2159 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2160 (char *)&res, &res_size))
2161 /* getsockopt also clears WSAGetLastError,
2162 so reset it back. */
2163 WSASetLastError(res);
2164 else
2165 res = WSAGetLastError();
2166 }
2167 }
2168 /* else if (res < 0) an error occurred */
2169 }
2170 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 if (res < 0)
2173 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002174
2175#else
2176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 if (s->sock_timeout > 0.0) {
2178 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2179 timeout = internal_select(s, 1);
2180 if (timeout == 0) {
2181 /* Bug #1019808: in case of an EINPROGRESS,
2182 use getsockopt(SO_ERROR) to get the real
2183 error. */
2184 socklen_t res_size = sizeof res;
2185 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2186 SO_ERROR, &res, &res_size);
2187 if (res == EISCONN)
2188 res = 0;
2189 errno = res;
2190 }
2191 else if (timeout == -1) {
2192 res = errno; /* had error */
2193 }
2194 else
2195 res = EWOULDBLOCK; /* timed out */
2196 }
2197 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 if (res < 0)
2200 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002201
2202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002206}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002207
Fred Drake728819a2000-07-01 03:40:12 +00002208/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002209
Guido van Rossum73624e91994-10-10 17:59:00 +00002210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002211sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 sock_addr_t addrbuf;
2214 int addrlen;
2215 int res;
2216 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2219 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 Py_BEGIN_ALLOW_THREADS
2222 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2223 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 if (timeout == 1) {
2226 PyErr_SetString(socket_timeout, "timed out");
2227 return NULL;
2228 }
2229 if (res != 0)
2230 return s->errorhandler();
2231 Py_INCREF(Py_None);
2232 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002233}
2234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002235PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002236"connect(address)\n\
2237\n\
2238Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002239is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002240
Guido van Rossum30a685f1991-06-27 15:51:29 +00002241
Fred Drake728819a2000-07-01 03:40:12 +00002242/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002243
2244static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002245sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 sock_addr_t addrbuf;
2248 int addrlen;
2249 int res;
2250 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2253 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 Py_BEGIN_ALLOW_THREADS
2256 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2257 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 /* Signals are not errors (though they may raise exceptions). Adapted
2260 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002261#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 if (res == EINTR && PyErr_CheckSignals())
2263 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002264#endif
2265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002267}
2268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002269PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002270"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002271\n\
2272This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002273instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002274
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002275
Guido van Rossumed233a51992-06-23 09:07:03 +00002276/* s.fileno() method */
2277
Guido van Rossum73624e91994-10-10 17:59:00 +00002278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002279sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002282}
2283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002284PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002285"fileno() -> integer\n\
2286\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002287Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002288
Guido van Rossumed233a51992-06-23 09:07:03 +00002289
Guido van Rossumc89705d1992-11-26 08:54:07 +00002290/* s.getsockname() method */
2291
Guido van Rossum73624e91994-10-10 17:59:00 +00002292static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002293sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 sock_addr_t addrbuf;
2296 int res;
2297 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 if (!getsockaddrlen(s, &addrlen))
2300 return NULL;
2301 memset(&addrbuf, 0, addrlen);
2302 Py_BEGIN_ALLOW_THREADS
2303 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2304 Py_END_ALLOW_THREADS
2305 if (res < 0)
2306 return s->errorhandler();
2307 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2308 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002309}
2310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002311PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002312"getsockname() -> address info\n\
2313\n\
2314Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002315info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002316
Guido van Rossumc89705d1992-11-26 08:54:07 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002319/* s.getpeername() method */
2320
Guido van Rossum73624e91994-10-10 17:59:00 +00002321static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002322sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 sock_addr_t addrbuf;
2325 int res;
2326 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 if (!getsockaddrlen(s, &addrlen))
2329 return NULL;
2330 memset(&addrbuf, 0, addrlen);
2331 Py_BEGIN_ALLOW_THREADS
2332 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2333 Py_END_ALLOW_THREADS
2334 if (res < 0)
2335 return s->errorhandler();
2336 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2337 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002338}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002340PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002341"getpeername() -> address info\n\
2342\n\
2343Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002344info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002345
Guido van Rossumb6775db1994-08-01 11:34:53 +00002346#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002347
2348
Guido van Rossum30a685f1991-06-27 15:51:29 +00002349/* s.listen(n) method */
2350
Guido van Rossum73624e91994-10-10 17:59:00 +00002351static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002352sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 int backlog;
2355 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 backlog = PyLong_AsLong(arg);
2358 if (backlog == -1 && PyErr_Occurred())
2359 return NULL;
2360 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002361 /* To avoid problems on systems that don't allow a negative backlog
2362 * (which doesn't make sense anyway) we force a minimum value of 0. */
2363 if (backlog < 0)
2364 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 res = listen(s->sock_fd, backlog);
2366 Py_END_ALLOW_THREADS
2367 if (res < 0)
2368 return s->errorhandler();
2369 Py_INCREF(Py_None);
2370 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002371}
2372
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002373PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002374"listen(backlog)\n\
2375\n\
2376Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002377least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2378unaccepted connections that the system will allow before refusing new\n\
2379connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002380
2381
Thomas Wouters477c8d52006-05-27 19:21:47 +00002382/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002383 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002384 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002385 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002386 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002387 * also possible that we return a number of bytes smaller than the request
2388 * bytes.
2389 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002390
Antoine Pitrou19467d22010-08-17 19:33:30 +00002391static Py_ssize_t
2392sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002393{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002394 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002396#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 int remaining;
2398 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002399#endif
2400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 if (!IS_SELECTABLE(s)) {
2402 select_error();
2403 return -1;
2404 }
2405 if (len == 0) {
2406 /* If 0 bytes were requested, do nothing. */
2407 return 0;
2408 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002409
2410#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002411 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002413 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 if (!timeout)
2415 outlen = recv(s->sock_fd, cbuf, len, flags);
2416 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 if (timeout == 1) {
2419 PyErr_SetString(socket_timeout, "timed out");
2420 return -1;
2421 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002422 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 if (outlen < 0) {
2424 /* Note: the call to errorhandler() ALWAYS indirectly returned
2425 NULL, so ignore its return value */
2426 s->errorhandler();
2427 return -1;
2428 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002429#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 read_buf = cbuf;
2431 remaining = len;
2432 while (remaining != 0) {
2433 unsigned int segment;
2434 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 segment = remaining /SEGMENT_SIZE;
2437 if (segment != 0) {
2438 segment = SEGMENT_SIZE;
2439 }
2440 else {
2441 segment = remaining;
2442 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002443
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002444 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002446 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 if (!timeout)
2448 nread = recv(s->sock_fd, read_buf, segment, flags);
2449 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 if (timeout == 1) {
2451 PyErr_SetString(socket_timeout, "timed out");
2452 return -1;
2453 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002454 END_SELECT_LOOP(s)
2455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 if (nread < 0) {
2457 s->errorhandler();
2458 return -1;
2459 }
2460 if (nread != remaining) {
2461 read_buf += nread;
2462 break;
2463 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 remaining -= segment;
2466 read_buf += segment;
2467 }
2468 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002469#endif /* !__VMS */
2470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002472}
2473
Guido van Rossum48a680c2001-03-02 06:34:14 +00002474
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002475/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002476
Guido van Rossum73624e91994-10-10 17:59:00 +00002477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002478sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002479{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002480 Py_ssize_t recvlen, outlen;
2481 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002483
Antoine Pitrou19467d22010-08-17 19:33:30 +00002484 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 if (recvlen < 0) {
2488 PyErr_SetString(PyExc_ValueError,
2489 "negative buffersize in recv");
2490 return NULL;
2491 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 /* Allocate a new string. */
2494 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2495 if (buf == NULL)
2496 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 /* Call the guts */
2499 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2500 if (outlen < 0) {
2501 /* An error occurred, release the string and return an
2502 error. */
2503 Py_DECREF(buf);
2504 return NULL;
2505 }
2506 if (outlen != recvlen) {
2507 /* We did not read as many bytes as we anticipated, resize the
2508 string if possible and be successful. */
2509 _PyBytes_Resize(&buf, outlen);
2510 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002513}
2514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002516"recv(buffersize[, flags]) -> data\n\
2517\n\
2518Receive up to buffersize bytes from the socket. For the optional flags\n\
2519argument, see the Unix manual. When no data is available, block until\n\
2520at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522
Guido van Rossum30a685f1991-06-27 15:51:29 +00002523
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002524/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002525
Thomas Wouters477c8d52006-05-27 19:21:47 +00002526static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002527sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002530
Antoine Pitrou19467d22010-08-17 19:33:30 +00002531 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 Py_buffer pbuf;
2533 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002534 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002537 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 &pbuf, &recvlen, &flags))
2539 return NULL;
2540 buf = pbuf.buf;
2541 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 if (recvlen < 0) {
2544 PyBuffer_Release(&pbuf);
2545 PyErr_SetString(PyExc_ValueError,
2546 "negative buffersize in recv_into");
2547 return NULL;
2548 }
2549 if (recvlen == 0) {
2550 /* If nbytes was not specified, use the buffer's length */
2551 recvlen = buflen;
2552 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 /* Check if the buffer is large enough */
2555 if (buflen < recvlen) {
2556 PyBuffer_Release(&pbuf);
2557 PyErr_SetString(PyExc_ValueError,
2558 "buffer too small for requested bytes");
2559 return NULL;
2560 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 /* Call the guts */
2563 readlen = sock_recv_guts(s, buf, recvlen, flags);
2564 if (readlen < 0) {
2565 /* Return an error. */
2566 PyBuffer_Release(&pbuf);
2567 return NULL;
2568 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 PyBuffer_Release(&pbuf);
2571 /* Return the number of bytes read. Note that we do not do anything
2572 special here in the case that readlen < recvlen. */
2573 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002574}
2575
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002576PyDoc_STRVAR(recv_into_doc,
2577"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578\n\
2579A version of recv() that stores its data into a buffer rather than creating \n\
2580a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2581is not specified (or 0), receive up to the size available in the given buffer.\n\
2582\n\
2583See recv() for documentation about the flags.");
2584
2585
2586/*
Christian Heimes99170a52007-12-19 02:07:34 +00002587 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2588 * into a char buffer. If you have any inc/def ref to do to the objects that
2589 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002590 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002591 * that it is also possible that we return a number of bytes smaller than the
2592 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002593 *
2594 * 'addr' is a return value for the address object. Note that you must decref
2595 * it yourself.
2596 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002597static Py_ssize_t
2598sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 sock_addr_t addrbuf;
2602 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002603 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 if (!getsockaddrlen(s, &addrlen))
2609 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 if (!IS_SELECTABLE(s)) {
2612 select_error();
2613 return -1;
2614 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002615
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002616 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 Py_BEGIN_ALLOW_THREADS
2618 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002619 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002621#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002622#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 n = recvfrom(s->sock_fd, cbuf, len, flags,
2624 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002625#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 n = recvfrom(s->sock_fd, cbuf, len, flags,
2627 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002628#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002629#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 n = recvfrom(s->sock_fd, cbuf, len, flags,
2631 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 }
2634 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 if (timeout == 1) {
2637 PyErr_SetString(socket_timeout, "timed out");
2638 return -1;
2639 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002640 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 if (n < 0) {
2642 s->errorhandler();
2643 return -1;
2644 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2647 addrlen, s->sock_proto)))
2648 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002651}
2652
2653/* s.recvfrom(nbytes [,flags]) method */
2654
2655static PyObject *
2656sock_recvfrom(PySocketSockObject *s, PyObject *args)
2657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 PyObject *buf = NULL;
2659 PyObject *addr = NULL;
2660 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002661 int flags = 0;
2662 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002663
Antoine Pitrou19467d22010-08-17 19:33:30 +00002664 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 if (recvlen < 0) {
2668 PyErr_SetString(PyExc_ValueError,
2669 "negative buffersize in recvfrom");
2670 return NULL;
2671 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2674 if (buf == NULL)
2675 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2678 recvlen, flags, &addr);
2679 if (outlen < 0) {
2680 goto finally;
2681 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 if (outlen != recvlen) {
2684 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002685 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002687 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 goto finally;
2689 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002692
2693finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 Py_XDECREF(buf);
2695 Py_XDECREF(addr);
2696 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002697}
2698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002700"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2701\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002702Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002703
Thomas Wouters477c8d52006-05-27 19:21:47 +00002704
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002705/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002706
2707static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002708sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002711
Antoine Pitrou19467d22010-08-17 19:33:30 +00002712 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 Py_buffer pbuf;
2714 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002715 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002718
Antoine Pitrou19467d22010-08-17 19:33:30 +00002719 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 kwlist, &pbuf,
2721 &recvlen, &flags))
2722 return NULL;
2723 buf = pbuf.buf;
2724 buflen = pbuf.len;
2725 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (recvlen < 0) {
2728 PyBuffer_Release(&pbuf);
2729 PyErr_SetString(PyExc_ValueError,
2730 "negative buffersize in recvfrom_into");
2731 return NULL;
2732 }
2733 if (recvlen == 0) {
2734 /* If nbytes was not specified, use the buffer's length */
2735 recvlen = buflen;
2736 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2739 if (readlen < 0) {
2740 PyBuffer_Release(&pbuf);
2741 /* Return an error */
2742 Py_XDECREF(addr);
2743 return NULL;
2744 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 PyBuffer_Release(&pbuf);
2747 /* Return the number of bytes read and the address. Note that we do
2748 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002749 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002750}
2751
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002752PyDoc_STRVAR(recvfrom_into_doc,
2753"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002754\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002755Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002756
2757
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002758/* The sendmsg() and recvmsg[_into]() methods require a working
2759 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2760#ifdef CMSG_LEN
2761/*
2762 * Call recvmsg() with the supplied iovec structures, flags, and
2763 * ancillary data buffer size (controllen). Returns the tuple return
2764 * value for recvmsg() or recvmsg_into(), with the first item provided
2765 * by the supplied makeval() function. makeval() will be called with
2766 * the length read and makeval_data as arguments, and must return a
2767 * new reference (which will be decrefed if there is a subsequent
2768 * error). On error, closes any file descriptors received via
2769 * SCM_RIGHTS.
2770 */
2771static PyObject *
2772sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2773 int flags, Py_ssize_t controllen,
2774 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2775{
2776 ssize_t bytes_received = -1;
2777 int timeout;
2778 sock_addr_t addrbuf;
2779 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002780 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002781 PyObject *cmsg_list = NULL, *retval = NULL;
2782 void *controlbuf = NULL;
2783 struct cmsghdr *cmsgh;
2784 size_t cmsgdatalen = 0;
2785 int cmsg_status;
2786
2787 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2788 ignored" when the socket is connected (Linux fills them in
2789 anyway for AF_UNIX sockets at least). Normally msg_namelen
2790 seems to be set to 0 if there's no address, but try to
2791 initialize msg_name to something that won't be mistaken for a
2792 real address if that doesn't happen. */
2793 if (!getsockaddrlen(s, &addrbuflen))
2794 return NULL;
2795 memset(&addrbuf, 0, addrbuflen);
2796 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2797
2798 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2799 PyErr_SetString(PyExc_ValueError,
2800 "invalid ancillary data buffer length");
2801 return NULL;
2802 }
2803 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2804 return PyErr_NoMemory();
2805
2806 /* Make the system call. */
2807 if (!IS_SELECTABLE(s)) {
2808 select_error();
2809 goto finally;
2810 }
2811
2812 BEGIN_SELECT_LOOP(s)
2813 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002814 msg.msg_name = SAS2SA(&addrbuf);
2815 msg.msg_namelen = addrbuflen;
2816 msg.msg_iov = iov;
2817 msg.msg_iovlen = iovlen;
2818 msg.msg_control = controlbuf;
2819 msg.msg_controllen = controllen;
2820 timeout = internal_select_ex(s, 0, interval);
2821 if (!timeout)
2822 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2823 Py_END_ALLOW_THREADS;
2824 if (timeout == 1) {
2825 PyErr_SetString(socket_timeout, "timed out");
2826 goto finally;
2827 }
2828 END_SELECT_LOOP(s)
2829
2830 if (bytes_received < 0) {
2831 s->errorhandler();
2832 goto finally;
2833 }
2834
2835 /* Make list of (level, type, data) tuples from control messages. */
2836 if ((cmsg_list = PyList_New(0)) == NULL)
2837 goto err_closefds;
2838 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2839 implementations didn't do so. */
2840 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2841 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2842 PyObject *bytes, *tuple;
2843 int tmp;
2844
2845 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2846 if (cmsg_status != 0) {
2847 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2848 "received malformed or improperly-truncated "
2849 "ancillary data", 1) == -1)
2850 goto err_closefds;
2851 }
2852 if (cmsg_status < 0)
2853 break;
2854 if (cmsgdatalen > PY_SSIZE_T_MAX) {
2855 PyErr_SetString(socket_error, "control message too long");
2856 goto err_closefds;
2857 }
2858
2859 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2860 cmsgdatalen);
2861 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2862 (int)cmsgh->cmsg_type, bytes);
2863 if (tuple == NULL)
2864 goto err_closefds;
2865 tmp = PyList_Append(cmsg_list, tuple);
2866 Py_DECREF(tuple);
2867 if (tmp != 0)
2868 goto err_closefds;
2869
2870 if (cmsg_status != 0)
2871 break;
2872 }
2873
2874 retval = Py_BuildValue("NOiN",
2875 (*makeval)(bytes_received, makeval_data),
2876 cmsg_list,
2877 (int)msg.msg_flags,
2878 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2879 ((msg.msg_namelen > addrbuflen) ?
2880 addrbuflen : msg.msg_namelen),
2881 s->sock_proto));
2882 if (retval == NULL)
2883 goto err_closefds;
2884
2885finally:
2886 Py_XDECREF(cmsg_list);
2887 PyMem_Free(controlbuf);
2888 return retval;
2889
2890err_closefds:
2891#ifdef SCM_RIGHTS
2892 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2893 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2894 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2895 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2896 if (cmsg_status < 0)
2897 break;
2898 if (cmsgh->cmsg_level == SOL_SOCKET &&
2899 cmsgh->cmsg_type == SCM_RIGHTS) {
2900 size_t numfds;
2901 int *fdp;
2902
2903 numfds = cmsgdatalen / sizeof(int);
2904 fdp = (int *)CMSG_DATA(cmsgh);
2905 while (numfds-- > 0)
2906 close(*fdp++);
2907 }
2908 if (cmsg_status != 0)
2909 break;
2910 }
2911#endif /* SCM_RIGHTS */
2912 goto finally;
2913}
2914
2915
2916static PyObject *
2917makeval_recvmsg(ssize_t received, void *data)
2918{
2919 PyObject **buf = data;
2920
2921 if (received < PyBytes_GET_SIZE(*buf))
2922 _PyBytes_Resize(buf, received);
2923 Py_XINCREF(*buf);
2924 return *buf;
2925}
2926
2927/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
2928
2929static PyObject *
2930sock_recvmsg(PySocketSockObject *s, PyObject *args)
2931{
2932 Py_ssize_t bufsize, ancbufsize = 0;
2933 int flags = 0;
2934 struct iovec iov;
2935 PyObject *buf = NULL, *retval = NULL;
2936
2937 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
2938 return NULL;
2939
2940 if (bufsize < 0) {
2941 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
2942 return NULL;
2943 }
2944 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
2945 return NULL;
2946 iov.iov_base = PyBytes_AS_STRING(buf);
2947 iov.iov_len = bufsize;
2948
2949 /* Note that we're passing a pointer to *our pointer* to the bytes
2950 object here (&buf); makeval_recvmsg() may incref the object, or
2951 deallocate it and set our pointer to NULL. */
2952 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
2953 &makeval_recvmsg, &buf);
2954 Py_XDECREF(buf);
2955 return retval;
2956}
2957
2958PyDoc_STRVAR(recvmsg_doc,
2959"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
2960\n\
2961Receive normal data (up to bufsize bytes) and ancillary data from the\n\
2962socket. The ancbufsize argument sets the size in bytes of the\n\
2963internal buffer used to receive the ancillary data; it defaults to 0,\n\
2964meaning that no ancillary data will be received. Appropriate buffer\n\
2965sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
2966CMSG_LEN(), and items which do not fit into the buffer might be\n\
2967truncated or discarded. The flags argument defaults to 0 and has the\n\
2968same meaning as for recv().\n\
2969\n\
2970The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
2971The data item is a bytes object holding the non-ancillary data\n\
2972received. The ancdata item is a list of zero or more tuples\n\
2973(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
2974(control messages) received: cmsg_level and cmsg_type are integers\n\
2975specifying the protocol level and protocol-specific type respectively,\n\
2976and cmsg_data is a bytes object holding the associated data. The\n\
2977msg_flags item is the bitwise OR of various flags indicating\n\
2978conditions on the received message; see your system documentation for\n\
2979details. If the receiving socket is unconnected, address is the\n\
2980address of the sending socket, if available; otherwise, its value is\n\
2981unspecified.\n\
2982\n\
2983If recvmsg() raises an exception after the system call returns, it\n\
2984will first attempt to close any file descriptors received via the\n\
2985SCM_RIGHTS mechanism.");
2986
2987
2988static PyObject *
2989makeval_recvmsg_into(ssize_t received, void *data)
2990{
2991 return PyLong_FromSsize_t(received);
2992}
2993
2994/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
2995
2996static PyObject *
2997sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
2998{
2999 Py_ssize_t ancbufsize = 0;
3000 int flags = 0;
3001 struct iovec *iovs = NULL;
3002 Py_ssize_t i, nitems, nbufs = 0;
3003 Py_buffer *bufs = NULL;
3004 PyObject *buffers_arg, *fast, *retval = NULL;
3005
3006 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3007 &buffers_arg, &ancbufsize, &flags))
3008 return NULL;
3009
3010 if ((fast = PySequence_Fast(buffers_arg,
3011 "recvmsg_into() argument 1 must be an "
3012 "iterable")) == NULL)
3013 return NULL;
3014 nitems = PySequence_Fast_GET_SIZE(fast);
3015 if (nitems > INT_MAX) {
3016 PyErr_SetString(socket_error, "recvmsg_into() argument 1 is too long");
3017 goto finally;
3018 }
3019
3020 /* Fill in an iovec for each item, and save the Py_buffer
3021 structs to release afterwards. */
3022 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3023 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3024 PyErr_NoMemory();
3025 goto finally;
3026 }
3027 for (; nbufs < nitems; nbufs++) {
3028 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3029 "w*;recvmsg_into() argument 1 must be an iterable "
3030 "of single-segment read-write buffers",
3031 &bufs[nbufs]))
3032 goto finally;
3033 iovs[nbufs].iov_base = bufs[nbufs].buf;
3034 iovs[nbufs].iov_len = bufs[nbufs].len;
3035 }
3036
3037 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3038 &makeval_recvmsg_into, NULL);
3039finally:
3040 for (i = 0; i < nbufs; i++)
3041 PyBuffer_Release(&bufs[i]);
3042 PyMem_Free(bufs);
3043 PyMem_Free(iovs);
3044 Py_DECREF(fast);
3045 return retval;
3046}
3047
3048PyDoc_STRVAR(recvmsg_into_doc,
3049"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3050\n\
3051Receive normal data and ancillary data from the socket, scattering the\n\
3052non-ancillary data into a series of buffers. The buffers argument\n\
3053must be an iterable of objects that export writable buffers\n\
3054(e.g. bytearray objects); these will be filled with successive chunks\n\
3055of the non-ancillary data until it has all been written or there are\n\
3056no more buffers. The ancbufsize argument sets the size in bytes of\n\
3057the internal buffer used to receive the ancillary data; it defaults to\n\
30580, meaning that no ancillary data will be received. Appropriate\n\
3059buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3060or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3061truncated or discarded. The flags argument defaults to 0 and has the\n\
3062same meaning as for recv().\n\
3063\n\
3064The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3065The nbytes item is the total number of bytes of non-ancillary data\n\
3066written into the buffers. The ancdata item is a list of zero or more\n\
3067tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3068data (control messages) received: cmsg_level and cmsg_type are\n\
3069integers specifying the protocol level and protocol-specific type\n\
3070respectively, and cmsg_data is a bytes object holding the associated\n\
3071data. The msg_flags item is the bitwise OR of various flags\n\
3072indicating conditions on the received message; see your system\n\
3073documentation for details. If the receiving socket is unconnected,\n\
3074address is the address of the sending socket, if available; otherwise,\n\
3075its value is unspecified.\n\
3076\n\
3077If recvmsg_into() raises an exception after the system call returns,\n\
3078it will first attempt to close any file descriptors received via the\n\
3079SCM_RIGHTS mechanism.");
3080#endif /* CMSG_LEN */
3081
3082
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003083/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003084
Guido van Rossum73624e91994-10-10 17:59:00 +00003085static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003086sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003089 Py_ssize_t len, n = -1;
3090 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3094 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 if (!IS_SELECTABLE(s)) {
3097 PyBuffer_Release(&pbuf);
3098 return select_error();
3099 }
3100 buf = pbuf.buf;
3101 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003102
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003103 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003105 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003107#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003114 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 PyErr_SetString(socket_timeout, "timed out");
3116 return NULL;
3117 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003118 END_SELECT_LOOP(s)
3119
3120 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 if (n < 0)
3122 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003123 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003124}
3125
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003126PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003127"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003128\n\
3129Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003130argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003131sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003132
3133
3134/* s.sendall(data [,flags]) method */
3135
3136static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003137sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003140 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003141 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3145 return NULL;
3146 buf = pbuf.buf;
3147 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 if (!IS_SELECTABLE(s)) {
3150 PyBuffer_Release(&pbuf);
3151 return select_error();
3152 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003155 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 timeout = internal_select(s, 1);
3157 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003158 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003159#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003160 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003161#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003162 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003163#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003164 }
3165 Py_END_ALLOW_THREADS
3166 if (timeout == 1) {
3167 PyBuffer_Release(&pbuf);
3168 PyErr_SetString(socket_timeout, "timed out");
3169 return NULL;
3170 }
3171 /* PyErr_CheckSignals() might change errno */
3172 saved_errno = errno;
3173 /* We must run our signal handlers before looping again.
3174 send() can return a successful partial write when it is
3175 interrupted, so we can't restrict ourselves to EINTR. */
3176 if (PyErr_CheckSignals()) {
3177 PyBuffer_Release(&pbuf);
3178 return NULL;
3179 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003181 /* If interrupted, try again */
3182 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003184 else
3185 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 }
3187 buf += n;
3188 len -= n;
3189 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 if (n < 0)
3193 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 Py_INCREF(Py_None);
3196 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003197}
3198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003199PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003200"sendall(data[, flags])\n\
3201\n\
3202Send a data string to the socket. For the optional flags\n\
3203argument, see the Unix manual. This calls send() repeatedly\n\
3204until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003205to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003206
Guido van Rossum30a685f1991-06-27 15:51:29 +00003207
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003208/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003209
Guido van Rossum73624e91994-10-10 17:59:00 +00003210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003211sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 Py_buffer pbuf;
3214 PyObject *addro;
3215 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003216 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 sock_addr_t addrbuf;
3218 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003221 arglen = PyTuple_Size(args);
3222 switch (arglen) {
3223 case 2:
3224 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3225 break;
3226 case 3:
3227 PyArg_ParseTuple(args, "y*iO:sendto",
3228 &pbuf, &flags, &addro);
3229 break;
3230 default:
3231 PyErr_Format(PyExc_TypeError,
3232 "sendto() takes 2 or 3 arguments (%d given)",
3233 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003234 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003236 if (PyErr_Occurred())
3237 return NULL;
3238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 buf = pbuf.buf;
3240 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 if (!IS_SELECTABLE(s)) {
3243 PyBuffer_Release(&pbuf);
3244 return select_error();
3245 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3248 PyBuffer_Release(&pbuf);
3249 return NULL;
3250 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003252 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003254 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 if (!timeout)
3256 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3257 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003260 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 PyErr_SetString(socket_timeout, "timed out");
3262 return NULL;
3263 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003264 END_SELECT_LOOP(s)
3265 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 if (n < 0)
3267 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003268 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003269}
3270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003271PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003272"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003273\n\
3274Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003275For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003276
Guido van Rossum30a685f1991-06-27 15:51:29 +00003277
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003278/* The sendmsg() and recvmsg[_into]() methods require a working
3279 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3280#ifdef CMSG_LEN
3281/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3282
3283static PyObject *
3284sock_sendmsg(PySocketSockObject *s, PyObject *args)
3285{
3286 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3287 Py_buffer *databufs = NULL;
3288 struct iovec *iovs = NULL;
3289 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003290 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003291 struct cmsginfo {
3292 int level;
3293 int type;
3294 Py_buffer data;
3295 } *cmsgs = NULL;
3296 void *controlbuf = NULL;
3297 size_t controllen, controllen_last;
3298 ssize_t bytes_sent = -1;
3299 int addrlen, timeout, flags = 0;
3300 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3301 *cmsg_fast = NULL, *retval = NULL;
3302
3303 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3304 &data_arg, &cmsg_arg, &flags, &addr_arg))
3305 return NULL;
3306
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003307 /* Parse destination address. */
3308 if (addr_arg != NULL && addr_arg != Py_None) {
3309 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3310 goto finally;
3311 msg.msg_name = &addrbuf;
3312 msg.msg_namelen = addrlen;
3313 }
3314
3315 /* Fill in an iovec for each message part, and save the Py_buffer
3316 structs to release afterwards. */
3317 if ((data_fast = PySequence_Fast(data_arg,
3318 "sendmsg() argument 1 must be an "
3319 "iterable")) == NULL)
3320 goto finally;
3321 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3322 if (ndataparts > INT_MAX) {
3323 PyErr_SetString(socket_error, "sendmsg() argument 1 is too long");
3324 goto finally;
3325 }
3326 msg.msg_iovlen = ndataparts;
3327 if (ndataparts > 0 &&
3328 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3329 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3330 PyErr_NoMemory();
3331 goto finally;
3332 }
3333 for (; ndatabufs < ndataparts; ndatabufs++) {
3334 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3335 "y*;sendmsg() argument 1 must be an iterable of "
3336 "buffer-compatible objects",
3337 &databufs[ndatabufs]))
3338 goto finally;
3339 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3340 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3341 }
3342
3343 if (cmsg_arg == NULL)
3344 ncmsgs = 0;
3345 else {
3346 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3347 "sendmsg() argument 2 must be an "
3348 "iterable")) == NULL)
3349 goto finally;
3350 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3351 }
3352
3353#ifndef CMSG_SPACE
3354 if (ncmsgs > 1) {
3355 PyErr_SetString(socket_error,
3356 "sending multiple control messages is not supported "
3357 "on this system");
3358 goto finally;
3359 }
3360#endif
3361 /* Save level, type and Py_buffer for each control message,
3362 and calculate total size. */
3363 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3364 PyErr_NoMemory();
3365 goto finally;
3366 }
3367 controllen = controllen_last = 0;
3368 while (ncmsgbufs < ncmsgs) {
3369 size_t bufsize, space;
3370
3371 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3372 "(iiy*):[sendmsg() ancillary data items]",
3373 &cmsgs[ncmsgbufs].level,
3374 &cmsgs[ncmsgbufs].type,
3375 &cmsgs[ncmsgbufs].data))
3376 goto finally;
3377 bufsize = cmsgs[ncmsgbufs++].data.len;
3378
3379#ifdef CMSG_SPACE
3380 if (!get_CMSG_SPACE(bufsize, &space)) {
3381#else
3382 if (!get_CMSG_LEN(bufsize, &space)) {
3383#endif
3384 PyErr_SetString(socket_error, "ancillary data item too large");
3385 goto finally;
3386 }
3387 controllen += space;
3388 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
3389 PyErr_SetString(socket_error, "too much ancillary data");
3390 goto finally;
3391 }
3392 controllen_last = controllen;
3393 }
3394
3395 /* Construct ancillary data block from control message info. */
3396 if (ncmsgbufs > 0) {
3397 struct cmsghdr *cmsgh = NULL;
3398
3399 if ((msg.msg_control = controlbuf =
3400 PyMem_Malloc(controllen)) == NULL) {
3401 PyErr_NoMemory();
3402 goto finally;
3403 }
3404 msg.msg_controllen = controllen;
3405
3406 /* Need to zero out the buffer as a workaround for glibc's
3407 CMSG_NXTHDR() implementation. After getting the pointer to
3408 the next header, it checks its (uninitialized) cmsg_len
3409 member to see if the "message" fits in the buffer, and
3410 returns NULL if it doesn't. Zero-filling the buffer
3411 ensures that that doesn't happen. */
3412 memset(controlbuf, 0, controllen);
3413
3414 for (i = 0; i < ncmsgbufs; i++) {
3415 size_t msg_len, data_len = cmsgs[i].data.len;
3416 int enough_space = 0;
3417
3418 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3419 if (cmsgh == NULL) {
3420 PyErr_Format(PyExc_RuntimeError,
3421 "unexpected NULL result from %s()",
3422 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3423 goto finally;
3424 }
3425 if (!get_CMSG_LEN(data_len, &msg_len)) {
3426 PyErr_SetString(PyExc_RuntimeError,
3427 "item size out of range for CMSG_LEN()");
3428 goto finally;
3429 }
3430 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3431 size_t space;
3432
3433 cmsgh->cmsg_len = msg_len;
3434 if (get_cmsg_data_space(&msg, cmsgh, &space))
3435 enough_space = (space >= data_len);
3436 }
3437 if (!enough_space) {
3438 PyErr_SetString(PyExc_RuntimeError,
3439 "ancillary data does not fit in calculated "
3440 "space");
3441 goto finally;
3442 }
3443 cmsgh->cmsg_level = cmsgs[i].level;
3444 cmsgh->cmsg_type = cmsgs[i].type;
3445 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3446 }
3447 }
3448
3449 /* Make the system call. */
3450 if (!IS_SELECTABLE(s)) {
3451 select_error();
3452 goto finally;
3453 }
3454
3455 BEGIN_SELECT_LOOP(s)
3456 Py_BEGIN_ALLOW_THREADS;
3457 timeout = internal_select_ex(s, 1, interval);
3458 if (!timeout)
3459 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3460 Py_END_ALLOW_THREADS;
3461 if (timeout == 1) {
3462 PyErr_SetString(socket_timeout, "timed out");
3463 goto finally;
3464 }
3465 END_SELECT_LOOP(s)
3466
3467 if (bytes_sent < 0) {
3468 s->errorhandler();
3469 goto finally;
3470 }
3471 retval = PyLong_FromSsize_t(bytes_sent);
3472
3473finally:
3474 PyMem_Free(controlbuf);
3475 for (i = 0; i < ncmsgbufs; i++)
3476 PyBuffer_Release(&cmsgs[i].data);
3477 PyMem_Free(cmsgs);
3478 Py_XDECREF(cmsg_fast);
3479 for (i = 0; i < ndatabufs; i++)
3480 PyBuffer_Release(&databufs[i]);
3481 PyMem_Free(databufs);
3482 PyMem_Free(iovs);
3483 Py_XDECREF(data_fast);
3484 return retval;
3485}
3486
3487PyDoc_STRVAR(sendmsg_doc,
3488"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3489\n\
3490Send normal and ancillary data to the socket, gathering the\n\
3491non-ancillary data from a series of buffers and concatenating it into\n\
3492a single message. The buffers argument specifies the non-ancillary\n\
3493data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3494The ancdata argument specifies the ancillary data (control messages)\n\
3495as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3496cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3497protocol level and protocol-specific type respectively, and cmsg_data\n\
3498is a buffer-compatible object holding the associated data. The flags\n\
3499argument defaults to 0 and has the same meaning as for send(). If\n\
3500address is supplied and not None, it sets a destination address for\n\
3501the message. The return value is the number of bytes of non-ancillary\n\
3502data sent.");
3503#endif /* CMSG_LEN */
3504
3505
Guido van Rossum30a685f1991-06-27 15:51:29 +00003506/* s.shutdown(how) method */
3507
Guido van Rossum73624e91994-10-10 17:59:00 +00003508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003509sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 int how;
3512 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 how = PyLong_AsLong(arg);
3515 if (how == -1 && PyErr_Occurred())
3516 return NULL;
3517 Py_BEGIN_ALLOW_THREADS
3518 res = shutdown(s->sock_fd, how);
3519 Py_END_ALLOW_THREADS
3520 if (res < 0)
3521 return s->errorhandler();
3522 Py_INCREF(Py_None);
3523 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003524}
3525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003526PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003527"shutdown(flag)\n\
3528\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003529Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3530of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003531
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003532#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003533static PyObject*
3534sock_ioctl(PySocketSockObject *s, PyObject *arg)
3535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 unsigned long cmd = SIO_RCVALL;
3537 PyObject *argO;
3538 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3541 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 switch (cmd) {
3544 case SIO_RCVALL: {
3545 unsigned int option = RCVALL_ON;
3546 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3547 return NULL;
3548 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3549 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3550 return set_error();
3551 }
3552 return PyLong_FromUnsignedLong(recv); }
3553 case SIO_KEEPALIVE_VALS: {
3554 struct tcp_keepalive ka;
3555 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3556 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3557 return NULL;
3558 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3559 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3560 return set_error();
3561 }
3562 return PyLong_FromUnsignedLong(recv); }
3563 default:
3564 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3565 return NULL;
3566 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003567}
3568PyDoc_STRVAR(sock_ioctl_doc,
3569"ioctl(cmd, option) -> long\n\
3570\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003571Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3572SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3573SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003574
3575#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003576
3577/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003578
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003579static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3581 accept_doc},
3582 {"bind", (PyCFunction)sock_bind, METH_O,
3583 bind_doc},
3584 {"close", (PyCFunction)sock_close, METH_NOARGS,
3585 close_doc},
3586 {"connect", (PyCFunction)sock_connect, METH_O,
3587 connect_doc},
3588 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3589 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003590 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3591 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3593 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003594#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 {"getpeername", (PyCFunction)sock_getpeername,
3596 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 {"getsockname", (PyCFunction)sock_getsockname,
3599 METH_NOARGS, getsockname_doc},
3600 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3601 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003602#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3604 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 {"listen", (PyCFunction)sock_listen, METH_O,
3607 listen_doc},
3608 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3609 recv_doc},
3610 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3611 recv_into_doc},
3612 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3613 recvfrom_doc},
3614 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3615 recvfrom_into_doc},
3616 {"send", (PyCFunction)sock_send, METH_VARARGS,
3617 send_doc},
3618 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3619 sendall_doc},
3620 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3621 sendto_doc},
3622 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3623 setblocking_doc},
3624 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3625 settimeout_doc},
3626 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3627 gettimeout_doc},
3628 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3629 setsockopt_doc},
3630 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3631 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003632#ifdef CMSG_LEN
3633 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3634 recvmsg_doc},
3635 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3636 recvmsg_into_doc,},
3637 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3638 sendmsg_doc},
3639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003641};
3642
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003643/* SockObject members */
3644static PyMemberDef sock_memberlist[] = {
3645 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3646 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3647 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3648 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3649 {0},
3650};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003651
Guido van Rossum73624e91994-10-10 17:59:00 +00003652/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003653 First close the file description. */
3654
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003655static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003656sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003657{
Antoine Pitroue033e062010-10-29 10:38:18 +00003658 if (s->sock_fd != -1) {
3659 PyObject *exc, *val, *tb;
3660 Py_ssize_t old_refcount = Py_REFCNT(s);
3661 ++Py_REFCNT(s);
3662 PyErr_Fetch(&exc, &val, &tb);
3663 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3664 "unclosed %R", s))
3665 /* Spurious errors can appear at shutdown */
3666 if (PyErr_ExceptionMatches(PyExc_Warning))
3667 PyErr_WriteUnraisable((PyObject *) s);
3668 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003670 Py_REFCNT(s) = old_refcount;
3671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003673}
3674
Guido van Rossum30a685f1991-06-27 15:51:29 +00003675
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003677sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003678{
Fred Drakea04eaad2000-06-30 02:46:07 +00003679#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 if (s->sock_fd > LONG_MAX) {
3681 /* this can occur on Win64, and actually there is a special
3682 ugly printf formatter for decimal pointer length integer
3683 printing, only bother if necessary*/
3684 PyErr_SetString(PyExc_OverflowError,
3685 "no printf formatter to display "
3686 "the socket descriptor in decimal");
3687 return NULL;
3688 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 return PyUnicode_FromFormat(
3691 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3692 (long)s->sock_fd, s->sock_family,
3693 s->sock_type,
3694 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003695}
3696
3697
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003698/* Create a new, uninitialized socket object. */
3699
3700static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003701sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003705 new = type->tp_alloc(type, 0);
3706 if (new != NULL) {
3707 ((PySocketSockObject *)new)->sock_fd = -1;
3708 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3709 ((PySocketSockObject *)new)->errorhandler = &set_error;
3710 }
3711 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003712}
3713
3714
3715/* Initialize a new socket object. */
3716
3717/*ARGSUSED*/
3718static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003719sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 PySocketSockObject *s = (PySocketSockObject *)self;
3722 PyObject *fdobj = NULL;
3723 SOCKET_T fd = INVALID_SOCKET;
3724 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3725 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003727 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3728 "|iiiO:socket", keywords,
3729 &family, &type, &proto, &fdobj))
3730 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 if (fdobj != NULL && fdobj != Py_None) {
3733 fd = PyLong_AsSocket_t(fdobj);
3734 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3735 return -1;
3736 if (fd == INVALID_SOCKET) {
3737 PyErr_SetString(PyExc_ValueError,
3738 "can't use invalid socket value");
3739 return -1;
3740 }
3741 }
3742 else {
3743 Py_BEGIN_ALLOW_THREADS
3744 fd = socket(family, type, proto);
3745 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 if (fd == INVALID_SOCKET) {
3748 set_error();
3749 return -1;
3750 }
3751 }
3752 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003755
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003756}
3757
3758
Guido van Rossumb6775db1994-08-01 11:34:53 +00003759/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003760
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003761static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3763 "_socket.socket", /* tp_name */
3764 sizeof(PySocketSockObject), /* tp_basicsize */
3765 0, /* tp_itemsize */
3766 (destructor)sock_dealloc, /* tp_dealloc */
3767 0, /* tp_print */
3768 0, /* tp_getattr */
3769 0, /* tp_setattr */
3770 0, /* tp_reserved */
3771 (reprfunc)sock_repr, /* tp_repr */
3772 0, /* tp_as_number */
3773 0, /* tp_as_sequence */
3774 0, /* tp_as_mapping */
3775 0, /* tp_hash */
3776 0, /* tp_call */
3777 0, /* tp_str */
3778 PyObject_GenericGetAttr, /* tp_getattro */
3779 0, /* tp_setattro */
3780 0, /* tp_as_buffer */
3781 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3782 sock_doc, /* tp_doc */
3783 0, /* tp_traverse */
3784 0, /* tp_clear */
3785 0, /* tp_richcompare */
3786 0, /* tp_weaklistoffset */
3787 0, /* tp_iter */
3788 0, /* tp_iternext */
3789 sock_methods, /* tp_methods */
3790 sock_memberlist, /* tp_members */
3791 0, /* tp_getset */
3792 0, /* tp_base */
3793 0, /* tp_dict */
3794 0, /* tp_descr_get */
3795 0, /* tp_descr_set */
3796 0, /* tp_dictoffset */
3797 sock_initobj, /* tp_init */
3798 PyType_GenericAlloc, /* tp_alloc */
3799 sock_new, /* tp_new */
3800 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003801};
3802
Guido van Rossum30a685f1991-06-27 15:51:29 +00003803
Guido van Rossum81194471991-07-27 21:42:02 +00003804/* Python interface to gethostname(). */
3805
3806/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003807static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003808socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003809{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003810#ifdef MS_WINDOWS
3811 /* Don't use winsock's gethostname, as this returns the ANSI
3812 version of the hostname, whereas we need a Unicode string.
3813 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003814 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003815 DWORD size = Py_ARRAY_LENGTH(buf);
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003816 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003817 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3818 if (GetLastError() == ERROR_MORE_DATA) {
3819 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003820 if (size == 0) /* XXX: I'm not sure how to handle this */
3821 return PyUnicode_FromUnicode(NULL, 0);
3822 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003823 if (!result)
3824 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003825 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3826 PyUnicode_AS_UNICODE(result),
3827 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003828 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003829 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003830 }
3831 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3832 }
Victor Stinner77af1722011-05-26 14:05:59 +02003833 return PyUnicode_FromUnicode(buf, size);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003834#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 char buf[1024];
3836 int res;
3837 Py_BEGIN_ALLOW_THREADS
3838 res = gethostname(buf, (int) sizeof buf - 1);
3839 Py_END_ALLOW_THREADS
3840 if (res < 0)
3841 return set_error();
3842 buf[sizeof buf - 1] = '\0';
3843 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003844#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003845}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003846
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003847PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003848"gethostname() -> string\n\
3849\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003850Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003851
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003852#ifdef HAVE_SETHOSTNAME
3853PyDoc_STRVAR(sethostname_doc,
3854"sethostname(name)\n\n\
3855Sets the hostname to name.");
3856
3857static PyObject *
3858socket_sethostname(PyObject *self, PyObject *args)
3859{
3860 PyObject *hnobj;
3861 Py_buffer buf;
3862 int res, flag = 0;
3863
3864 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3865 PyErr_Clear();
3866 if (!PyArg_ParseTuple(args, "O&:sethostname",
3867 PyUnicode_FSConverter, &hnobj))
3868 return NULL;
3869 flag = 1;
3870 }
3871 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3872 if (!res) {
3873 res = sethostname(buf.buf, buf.len);
3874 PyBuffer_Release(&buf);
3875 }
3876 if (flag)
3877 Py_DECREF(hnobj);
3878 if (res)
3879 return set_error();
3880 Py_RETURN_NONE;
3881}
3882#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003883
Guido van Rossum30a685f1991-06-27 15:51:29 +00003884/* Python interface to gethostbyname(name). */
3885
3886/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003887static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003888socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003890 char *name;
3891 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003892 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003893
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003894 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 return NULL;
3896 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003897 goto finally;
3898 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3899finally:
3900 PyMem_Free(name);
3901 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003902}
3903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003904PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003905"gethostbyname(host) -> address\n\
3906\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003907Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003908
3909
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003910/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3911
3912static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003913gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003915 char **pch;
3916 PyObject *rtn_tuple = (PyObject *)NULL;
3917 PyObject *name_list = (PyObject *)NULL;
3918 PyObject *addr_list = (PyObject *)NULL;
3919 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003921 if (h == NULL) {
3922 /* Let's get real error message to return */
3923 set_herror(h_errno);
3924 return NULL;
3925 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 if (h->h_addrtype != af) {
3928 /* Let's get real error message to return */
3929 PyErr_SetString(socket_error,
3930 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00003931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003932 return NULL;
3933 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003937 case AF_INET:
3938 if (alen < sizeof(struct sockaddr_in))
3939 return NULL;
3940 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003941
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003942#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 case AF_INET6:
3944 if (alen < sizeof(struct sockaddr_in6))
3945 return NULL;
3946 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003947#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 if ((name_list = PyList_New(0)) == NULL)
3952 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 if ((addr_list = PyList_New(0)) == NULL)
3955 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 /* SF #1511317: h_aliases can be NULL */
3958 if (h->h_aliases) {
3959 for (pch = h->h_aliases; *pch != NULL; pch++) {
3960 int status;
3961 tmp = PyUnicode_FromString(*pch);
3962 if (tmp == NULL)
3963 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 status = PyList_Append(name_list, tmp);
3966 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 if (status)
3969 goto err;
3970 }
3971 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3974 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 case AF_INET:
3979 {
3980 struct sockaddr_in sin;
3981 memset(&sin, 0, sizeof(sin));
3982 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003983#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003984 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3987 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 if (pch == h->h_addr_list && alen >= sizeof(sin))
3990 memcpy((char *) addr, &sin, sizeof(sin));
3991 break;
3992 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003993
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003994#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003995 case AF_INET6:
3996 {
3997 struct sockaddr_in6 sin6;
3998 memset(&sin6, 0, sizeof(sin6));
3999 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004000#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4004 tmp = makeipaddr((struct sockaddr *)&sin6,
4005 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004007 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4008 memcpy((char *) addr, &sin6, sizeof(sin6));
4009 break;
4010 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004011#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004013 default: /* can't happen */
4014 PyErr_SetString(socket_error,
4015 "unsupported address family");
4016 return NULL;
4017 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004019 if (tmp == NULL)
4020 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 status = PyList_Append(addr_list, tmp);
4023 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 if (status)
4026 goto err;
4027 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004030
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004031 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 Py_XDECREF(name_list);
4033 Py_XDECREF(addr_list);
4034 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004035}
4036
4037
4038/* Python interface to gethostbyname_ex(name). */
4039
4040/*ARGSUSED*/
4041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004042socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 char *name;
4045 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004046#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004048#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004052 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004053#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004055#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004057#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 char buf[16384];
4059 int buf_len = (sizeof buf) - 1;
4060 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004061#endif
4062#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004064#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004065#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004066
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004067 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 return NULL;
4069 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004070 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004072#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004073#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4075 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004076#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004077 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004078#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 memset((void *) &data, '\0', sizeof(data));
4080 result = gethostbyname_r(name, &hp_allocated, &data);
4081 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004082#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004083#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004084#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004088#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 Py_END_ALLOW_THREADS
4090 /* Some C libraries would require addr.__ss_family instead of
4091 addr.ss_family.
4092 Therefore, we cast the sockaddr_storage into sockaddr to
4093 access sa_family. */
4094 sa = (struct sockaddr*)&addr;
4095 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4096 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004097#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004099#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004100finally:
4101 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004103}
4104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004105PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004106"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4107\n\
4108Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004109for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004110
4111
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004112/* Python interface to gethostbyaddr(IP). */
4113
4114/*ARGSUSED*/
4115static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004116socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004117{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004118#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004120#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 struct sockaddr *sa = (struct sockaddr *)&addr;
4124 char *ip_num;
4125 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004126 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004127#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004129#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004131#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 /* glibcs up to 2.10 assume that the buf argument to
4133 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4134 does not ensure. The attribute below instructs the compiler
4135 to maintain this alignment. */
4136 char buf[16384] Py_ALIGNED(8);
4137 int buf_len = (sizeof buf) - 1;
4138 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004139#endif
4140#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004142#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004143#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 char *ap;
4145 int al;
4146 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004147
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004148 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 return NULL;
4150 af = AF_UNSPEC;
4151 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004152 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 af = sa->sa_family;
4154 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004155 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 switch (af) {
4157 case AF_INET:
4158 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4159 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4160 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004161#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 case AF_INET6:
4163 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4164 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4165 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 default:
4168 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004169 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 }
4171 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004172#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004173#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 result = gethostbyaddr_r(ap, al, af,
4175 &hp_allocated, buf, buf_len,
4176 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004177#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 h = gethostbyaddr_r(ap, al, af,
4179 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004180#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 memset((void *) &data, '\0', sizeof(data));
4182 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4183 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004184#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004185#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004186#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004190#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 Py_END_ALLOW_THREADS
4192 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004193#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004195#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004196finally:
4197 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004199}
4200
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004201PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004202"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4203\n\
4204Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004205for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004206
Guido van Rossum30a685f1991-06-27 15:51:29 +00004207
4208/* Python interface to getservbyname(name).
4209 This only returns the port number, since the other info is already
4210 known or not useful (like the list of aliases). */
4211
4212/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004214socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004216 char *name, *proto=NULL;
4217 struct servent *sp;
4218 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4219 return NULL;
4220 Py_BEGIN_ALLOW_THREADS
4221 sp = getservbyname(name, proto);
4222 Py_END_ALLOW_THREADS
4223 if (sp == NULL) {
4224 PyErr_SetString(socket_error, "service/proto not found");
4225 return NULL;
4226 }
4227 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004228}
4229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004230PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004231"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004232\n\
4233Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004234The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4235otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004236
Guido van Rossum30a685f1991-06-27 15:51:29 +00004237
Barry Warsaw11b91a02004-06-28 00:50:43 +00004238/* Python interface to getservbyport(port).
4239 This only returns the service name, since the other info is already
4240 known or not useful (like the list of aliases). */
4241
4242/*ARGSUSED*/
4243static PyObject *
4244socket_getservbyport(PyObject *self, PyObject *args)
4245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 int port;
4247 char *proto=NULL;
4248 struct servent *sp;
4249 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4250 return NULL;
4251 if (port < 0 || port > 0xffff) {
4252 PyErr_SetString(
4253 PyExc_OverflowError,
4254 "getservbyport: port must be 0-65535.");
4255 return NULL;
4256 }
4257 Py_BEGIN_ALLOW_THREADS
4258 sp = getservbyport(htons((short)port), proto);
4259 Py_END_ALLOW_THREADS
4260 if (sp == NULL) {
4261 PyErr_SetString(socket_error, "port/proto not found");
4262 return NULL;
4263 }
4264 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004265}
4266
4267PyDoc_STRVAR(getservbyport_doc,
4268"getservbyport(port[, protocolname]) -> string\n\
4269\n\
4270Return the service name from a port number and protocol name.\n\
4271The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4272otherwise any protocol will match.");
4273
Guido van Rossum3901d851996-12-19 16:35:04 +00004274/* Python interface to getprotobyname(name).
4275 This only returns the protocol number, since the other info is
4276 already known or not useful (like the list of aliases). */
4277
4278/*ARGSUSED*/
4279static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004280socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 char *name;
4283 struct protoent *sp;
4284 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4285 return NULL;
4286 Py_BEGIN_ALLOW_THREADS
4287 sp = getprotobyname(name);
4288 Py_END_ALLOW_THREADS
4289 if (sp == NULL) {
4290 PyErr_SetString(socket_error, "protocol not found");
4291 return NULL;
4292 }
4293 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004294}
4295
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004296PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004297"getprotobyname(name) -> integer\n\
4298\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004299Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004300
Guido van Rossum3901d851996-12-19 16:35:04 +00004301
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004302#ifndef NO_DUP
4303/* dup() function for socket fds */
4304
4305static PyObject *
4306socket_dup(PyObject *self, PyObject *fdobj)
4307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 SOCKET_T fd, newfd;
4309 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004310
4311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 fd = PyLong_AsSocket_t(fdobj);
4313 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4314 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 newfd = dup_socket(fd);
4317 if (newfd == INVALID_SOCKET)
4318 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 newfdobj = PyLong_FromSocket_t(newfd);
4321 if (newfdobj == NULL)
4322 SOCKETCLOSE(newfd);
4323 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004324}
4325
4326PyDoc_STRVAR(dup_doc,
4327"dup(integer) -> integer\n\
4328\n\
4329Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4330sockets; on some platforms os.dup() won't work for socket file descriptors.");
4331#endif
4332
4333
Dave Cole331708b2004-08-09 04:51:41 +00004334#ifdef HAVE_SOCKETPAIR
4335/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004336 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004337 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004338
4339/*ARGSUSED*/
4340static PyObject *
4341socket_socketpair(PyObject *self, PyObject *args)
4342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 PySocketSockObject *s0 = NULL, *s1 = NULL;
4344 SOCKET_T sv[2];
4345 int family, type = SOCK_STREAM, proto = 0;
4346 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004347
4348#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004350#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4354 &family, &type, &proto))
4355 return NULL;
4356 /* Create a pair of socket fds */
4357 if (socketpair(family, type, proto, sv) < 0)
4358 return set_error();
4359 s0 = new_sockobject(sv[0], family, type, proto);
4360 if (s0 == NULL)
4361 goto finally;
4362 s1 = new_sockobject(sv[1], family, type, proto);
4363 if (s1 == NULL)
4364 goto finally;
4365 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004366
4367finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 if (res == NULL) {
4369 if (s0 == NULL)
4370 SOCKETCLOSE(sv[0]);
4371 if (s1 == NULL)
4372 SOCKETCLOSE(sv[1]);
4373 }
4374 Py_XDECREF(s0);
4375 Py_XDECREF(s1);
4376 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004377}
4378
4379PyDoc_STRVAR(socketpair_doc,
4380"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4381\n\
4382Create a pair of socket objects from the sockets returned by the platform\n\
4383socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004384The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004385AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004386
4387#endif /* HAVE_SOCKETPAIR */
4388
4389
Guido van Rossum006bf911996-06-12 04:04:55 +00004390static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004391socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4396 return NULL;
4397 }
4398 if (x1 < 0) {
4399 PyErr_SetString(PyExc_OverflowError,
4400 "can't convert negative number to unsigned long");
4401 return NULL;
4402 }
4403 x2 = (unsigned int)ntohs((unsigned short)x1);
4404 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004405}
4406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004407PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004408"ntohs(integer) -> integer\n\
4409\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004410Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004411
4412
Guido van Rossum006bf911996-06-12 04:04:55 +00004413static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004414socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 if (PyLong_Check(arg)) {
4419 x = PyLong_AsUnsignedLong(arg);
4420 if (x == (unsigned long) -1 && PyErr_Occurred())
4421 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004422#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 {
4424 unsigned long y;
4425 /* only want the trailing 32 bits */
4426 y = x & 0xFFFFFFFFUL;
4427 if (y ^ x)
4428 return PyErr_Format(PyExc_OverflowError,
4429 "long int larger than 32 bits");
4430 x = y;
4431 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 }
4434 else
4435 return PyErr_Format(PyExc_TypeError,
4436 "expected int/long, %s found",
4437 Py_TYPE(arg)->tp_name);
4438 if (x == (unsigned long) -1 && PyErr_Occurred())
4439 return NULL;
4440 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004441}
4442
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004443PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004444"ntohl(integer) -> integer\n\
4445\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004446Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004447
4448
Guido van Rossum006bf911996-06-12 04:04:55 +00004449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004450socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4455 return NULL;
4456 }
4457 if (x1 < 0) {
4458 PyErr_SetString(PyExc_OverflowError,
4459 "can't convert negative number to unsigned long");
4460 return NULL;
4461 }
4462 x2 = (unsigned int)htons((unsigned short)x1);
4463 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004464}
4465
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004466PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004467"htons(integer) -> integer\n\
4468\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004469Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004470
4471
Guido van Rossum006bf911996-06-12 04:04:55 +00004472static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004473socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004475 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 if (PyLong_Check(arg)) {
4478 x = PyLong_AsUnsignedLong(arg);
4479 if (x == (unsigned long) -1 && PyErr_Occurred())
4480 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004481#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 {
4483 unsigned long y;
4484 /* only want the trailing 32 bits */
4485 y = x & 0xFFFFFFFFUL;
4486 if (y ^ x)
4487 return PyErr_Format(PyExc_OverflowError,
4488 "long int larger than 32 bits");
4489 x = y;
4490 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 }
4493 else
4494 return PyErr_Format(PyExc_TypeError,
4495 "expected int/long, %s found",
4496 Py_TYPE(arg)->tp_name);
4497 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004498}
4499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004500PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004501"htonl(integer) -> integer\n\
4502\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004503Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004504
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004505/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004507PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004508"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004509\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004510Convert 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 +00004511binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004512
4513static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004514socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004515{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004516#ifndef INADDR_NONE
4517#define INADDR_NONE (-1)
4518#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004519#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004521#endif
4522
4523#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004524#if (SIZEOF_INT != 4)
4525#error "Not sure if in_addr_t exists and int is not 32-bits."
4526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 /* Have to use inet_addr() instead */
4528 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4533 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004534
Tim Peters1df9fdd2003-02-13 03:13:40 +00004535
4536#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004537
4538#ifdef USE_INET_ATON_WEAKLINK
4539 if (inet_aton != NULL) {
4540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 if (inet_aton(ip_addr, &buf))
4542 return PyBytes_FromStringAndSize((char *)(&buf),
4543 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 PyErr_SetString(socket_error,
4546 "illegal IP address string passed to inet_aton");
4547 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004548
Thomas Wouters477c8d52006-05-27 19:21:47 +00004549#ifdef USE_INET_ATON_WEAKLINK
4550 } else {
4551#endif
4552
4553#endif
4554
4555#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 /* special-case this address as inet_addr might return INADDR_NONE
4558 * for this */
4559 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4560 packed_addr = 0xFFFFFFFF;
4561 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 if (packed_addr == INADDR_NONE) { /* invalid address */
4566 PyErr_SetString(socket_error,
4567 "illegal IP address string passed to inet_aton");
4568 return NULL;
4569 }
4570 }
4571 return PyBytes_FromStringAndSize((char *) &packed_addr,
4572 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004573
4574#ifdef USE_INET_ATON_WEAKLINK
4575 }
4576#endif
4577
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004578#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004579}
4580
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004581PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004582"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004583\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004584Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004585
4586static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004587socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 char *packed_str;
4590 int addr_len;
4591 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4594 return NULL;
4595 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 if (addr_len != sizeof(packed_addr)) {
4598 PyErr_SetString(socket_error,
4599 "packed IP wrong length for inet_ntoa");
4600 return NULL;
4601 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004606}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004607
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004608#ifdef HAVE_INET_PTON
4609
4610PyDoc_STRVAR(inet_pton_doc,
4611"inet_pton(af, ip) -> packed IP address string\n\
4612\n\
4613Convert an IP address from string format to a packed string suitable\n\
4614for use with low-level network functions.");
4615
4616static PyObject *
4617socket_inet_pton(PyObject *self, PyObject *args)
4618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 int af;
4620 char* ip;
4621 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004622#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4628 return NULL;
4629 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004630
Martin v. Löwis04697e82004-06-02 12:35:29 +00004631#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 if(af == AF_INET6) {
4633 PyErr_SetString(socket_error,
4634 "can't use AF_INET6, IPv6 is disabled");
4635 return NULL;
4636 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004637#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 retval = inet_pton(af, ip, packed);
4640 if (retval < 0) {
4641 PyErr_SetFromErrno(socket_error);
4642 return NULL;
4643 } else if (retval == 0) {
4644 PyErr_SetString(socket_error,
4645 "illegal IP address string passed to inet_pton");
4646 return NULL;
4647 } else if (af == AF_INET) {
4648 return PyBytes_FromStringAndSize(packed,
4649 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004650#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 } else if (af == AF_INET6) {
4652 return PyBytes_FromStringAndSize(packed,
4653 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004654#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 } else {
4656 PyErr_SetString(socket_error, "unknown address family");
4657 return NULL;
4658 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004659}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004660
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004661PyDoc_STRVAR(inet_ntop_doc,
4662"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4663\n\
4664Convert a packed IP address of the given family to string format.");
4665
4666static PyObject *
4667socket_inet_ntop(PyObject *self, PyObject *args)
4668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 int af;
4670 char* packed;
4671 int len;
4672 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004673#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004675#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004677#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4680 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4683 return NULL;
4684 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 if (af == AF_INET) {
4687 if (len != sizeof(struct in_addr)) {
4688 PyErr_SetString(PyExc_ValueError,
4689 "invalid length of packed IP address string");
4690 return NULL;
4691 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004692#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 } else if (af == AF_INET6) {
4694 if (len != sizeof(struct in6_addr)) {
4695 PyErr_SetString(PyExc_ValueError,
4696 "invalid length of packed IP address string");
4697 return NULL;
4698 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 } else {
4701 PyErr_Format(PyExc_ValueError,
4702 "unknown address family %d", af);
4703 return NULL;
4704 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 retval = inet_ntop(af, packed, ip, sizeof(ip));
4707 if (!retval) {
4708 PyErr_SetFromErrno(socket_error);
4709 return NULL;
4710 } else {
4711 return PyUnicode_FromString(retval);
4712 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 /* NOTREACHED */
4715 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4716 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004717}
4718
4719#endif /* HAVE_INET_PTON */
4720
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004721/* Python interface to getaddrinfo(host, port). */
4722
4723/*ARGSUSED*/
4724static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004725socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004726{
Victor Stinner77af1722011-05-26 14:05:59 +02004727 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004728 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 struct addrinfo hints, *res;
4730 struct addrinfo *res0 = NULL;
4731 PyObject *hobj = NULL;
4732 PyObject *pobj = (PyObject *)NULL;
4733 char pbuf[30];
4734 char *hptr, *pptr;
4735 int family, socktype, protocol, flags;
4736 int error;
4737 PyObject *all = (PyObject *)NULL;
4738 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 family = socktype = protocol = flags = 0;
4741 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004742 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004743 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 &protocol, &flags)) {
4745 return NULL;
4746 }
4747 if (hobj == Py_None) {
4748 hptr = NULL;
4749 } else if (PyUnicode_Check(hobj)) {
4750 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4751 if (!idna)
4752 return NULL;
4753 assert(PyBytes_Check(idna));
4754 hptr = PyBytes_AS_STRING(idna);
4755 } else if (PyBytes_Check(hobj)) {
4756 hptr = PyBytes_AsString(hobj);
4757 } else {
4758 PyErr_SetString(PyExc_TypeError,
4759 "getaddrinfo() argument 1 must be string or None");
4760 return NULL;
4761 }
4762 if (PyLong_CheckExact(pobj)) {
4763 long value = PyLong_AsLong(pobj);
4764 if (value == -1 && PyErr_Occurred())
4765 goto err;
4766 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4767 pptr = pbuf;
4768 } else if (PyUnicode_Check(pobj)) {
4769 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004770 if (pptr == NULL)
4771 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004773 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 } else if (pobj == Py_None) {
4775 pptr = (char *)NULL;
4776 } else {
4777 PyErr_SetString(socket_error, "Int or String expected");
4778 goto err;
4779 }
4780 memset(&hints, 0, sizeof(hints));
4781 hints.ai_family = family;
4782 hints.ai_socktype = socktype;
4783 hints.ai_protocol = protocol;
4784 hints.ai_flags = flags;
4785 Py_BEGIN_ALLOW_THREADS
4786 ACQUIRE_GETADDRINFO_LOCK
4787 error = getaddrinfo(hptr, pptr, &hints, &res0);
4788 Py_END_ALLOW_THREADS
4789 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4790 if (error) {
4791 set_gaierror(error);
4792 goto err;
4793 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 if ((all = PyList_New(0)) == NULL)
4796 goto err;
4797 for (res = res0; res; res = res->ai_next) {
4798 PyObject *single;
4799 PyObject *addr =
4800 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4801 if (addr == NULL)
4802 goto err;
4803 single = Py_BuildValue("iiisO", res->ai_family,
4804 res->ai_socktype, res->ai_protocol,
4805 res->ai_canonname ? res->ai_canonname : "",
4806 addr);
4807 Py_DECREF(addr);
4808 if (single == NULL)
4809 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 if (PyList_Append(all, single))
4812 goto err;
4813 Py_XDECREF(single);
4814 }
4815 Py_XDECREF(idna);
4816 if (res0)
4817 freeaddrinfo(res0);
4818 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004819 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 Py_XDECREF(all);
4821 Py_XDECREF(idna);
4822 if (res0)
4823 freeaddrinfo(res0);
4824 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004825}
4826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004827PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004828"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4829 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004830\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004831Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004832
4833/* Python interface to getnameinfo(sa, flags). */
4834
4835/*ARGSUSED*/
4836static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004837socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 PyObject *sa = (PyObject *)NULL;
4840 int flags;
4841 char *hostp;
4842 int port, flowinfo, scope_id;
4843 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4844 struct addrinfo hints, *res = NULL;
4845 int error;
4846 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 flags = flowinfo = scope_id = 0;
4849 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4850 return NULL;
4851 if (!PyTuple_Check(sa)) {
4852 PyErr_SetString(PyExc_TypeError,
4853 "getnameinfo() argument 1 must be a tuple");
4854 return NULL;
4855 }
4856 if (!PyArg_ParseTuple(sa, "si|ii",
4857 &hostp, &port, &flowinfo, &scope_id))
4858 return NULL;
4859 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4860 memset(&hints, 0, sizeof(hints));
4861 hints.ai_family = AF_UNSPEC;
4862 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004863 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 Py_BEGIN_ALLOW_THREADS
4865 ACQUIRE_GETADDRINFO_LOCK
4866 error = getaddrinfo(hostp, pbuf, &hints, &res);
4867 Py_END_ALLOW_THREADS
4868 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4869 if (error) {
4870 set_gaierror(error);
4871 goto fail;
4872 }
4873 if (res->ai_next) {
4874 PyErr_SetString(socket_error,
4875 "sockaddr resolved to multiple addresses");
4876 goto fail;
4877 }
4878 switch (res->ai_family) {
4879 case AF_INET:
4880 {
4881 if (PyTuple_GET_SIZE(sa) != 2) {
4882 PyErr_SetString(socket_error,
4883 "IPv4 sockaddr must be 2 tuple");
4884 goto fail;
4885 }
4886 break;
4887 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004888#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 case AF_INET6:
4890 {
4891 struct sockaddr_in6 *sin6;
4892 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4893 sin6->sin6_flowinfo = flowinfo;
4894 sin6->sin6_scope_id = scope_id;
4895 break;
4896 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004899 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4901 if (error) {
4902 set_gaierror(error);
4903 goto fail;
4904 }
4905 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004906
4907fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 if (res)
4909 freeaddrinfo(res);
4910 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004911}
4912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004913PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004914"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004915\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004916Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004917
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004918
4919/* Python API to getting and setting the default timeout value. */
4920
4921static PyObject *
4922socket_getdefaulttimeout(PyObject *self)
4923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004924 if (defaulttimeout < 0.0) {
4925 Py_INCREF(Py_None);
4926 return Py_None;
4927 }
4928 else
4929 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004930}
4931
4932PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004933"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004934\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03004935Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004936A value of None indicates that new socket objects have no timeout.\n\
4937When the socket module is first imported, the default is None.");
4938
4939static PyObject *
4940socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 if (arg == Py_None)
4945 timeout = -1.0;
4946 else {
4947 timeout = PyFloat_AsDouble(arg);
4948 if (timeout < 0.0) {
4949 if (!PyErr_Occurred())
4950 PyErr_SetString(PyExc_ValueError,
4951 "Timeout value out of range");
4952 return NULL;
4953 }
4954 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 Py_INCREF(Py_None);
4959 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004960}
4961
4962PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004963"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004964\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03004965Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004966A value of None indicates that new socket objects have no timeout.\n\
4967When the socket module is first imported, the default is None.");
4968
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004969#ifdef HAVE_IF_NAMEINDEX
4970/* Python API for getting interface indices and names */
4971
4972static PyObject *
4973socket_if_nameindex(PyObject *self, PyObject *arg)
4974{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004975 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02004976 int i;
4977 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02004978
Charles-François Natali60713592011-05-20 16:55:06 +02004979 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004980 if (ni == NULL) {
Charles-François Natali60713592011-05-20 16:55:06 +02004981 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004982 return NULL;
4983 }
4984
4985 list = PyList_New(0);
4986 if (list == NULL) {
4987 if_freenameindex(ni);
4988 return NULL;
4989 }
4990
Charles-François Natali60713592011-05-20 16:55:06 +02004991 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
4992 PyObject *ni_tuple = Py_BuildValue("IO&",
4993 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07004994
4995 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
4996 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02004997 Py_DECREF(list);
4998 if_freenameindex(ni);
4999 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005000 }
5001 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005002 }
5003
5004 if_freenameindex(ni);
5005 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005006}
5007
5008PyDoc_STRVAR(if_nameindex_doc,
5009"if_nameindex()\n\
5010\n\
5011Returns a list of network interface information (index, name) tuples.");
5012
Charles-François Natali60713592011-05-20 16:55:06 +02005013static PyObject *
5014socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005015{
Charles-François Natali60713592011-05-20 16:55:06 +02005016 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005017 unsigned long index;
5018
Charles-François Natali60713592011-05-20 16:55:06 +02005019 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5020 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005021 return NULL;
5022
Charles-François Natali60713592011-05-20 16:55:06 +02005023 index = if_nametoindex(PyBytes_AS_STRING(oname));
5024 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005025 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005026 /* if_nametoindex() doesn't set errno */
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005027 PyErr_SetString(socket_error, "no interface with this name");
5028 return NULL;
5029 }
5030
5031 return PyLong_FromUnsignedLong(index);
5032}
5033
5034PyDoc_STRVAR(if_nametoindex_doc,
5035"if_nametoindex(if_name)\n\
5036\n\
5037Returns the interface index corresponding to the interface name if_name.");
5038
Charles-François Natali60713592011-05-20 16:55:06 +02005039static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005040socket_if_indextoname(PyObject *self, PyObject *arg)
5041{
Charles-François Natali60713592011-05-20 16:55:06 +02005042 unsigned long index;
5043 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005044
Charles-François Natali60713592011-05-20 16:55:06 +02005045 index = PyLong_AsUnsignedLong(arg);
5046 if (index == (unsigned long) -1)
5047 return NULL;
5048
5049 if (if_indextoname(index, name) == NULL) {
5050 PyErr_SetFromErrno(socket_error);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005051 return NULL;
5052 }
5053
Charles-François Natali60713592011-05-20 16:55:06 +02005054 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005055}
5056
5057PyDoc_STRVAR(if_indextoname_doc,
5058"if_indextoname(if_index)\n\
5059\n\
5060Returns the interface name corresponding to the interface index if_index.");
5061
5062#endif /* HAVE_IF_NAMEINDEX */
5063
5064
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005065#ifdef CMSG_LEN
5066/* Python interface to CMSG_LEN(length). */
5067
5068static PyObject *
5069socket_CMSG_LEN(PyObject *self, PyObject *args)
5070{
5071 Py_ssize_t length;
5072 size_t result;
5073
5074 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5075 return NULL;
5076 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5077 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5078 return NULL;
5079 }
5080 return PyLong_FromSize_t(result);
5081}
5082
5083PyDoc_STRVAR(CMSG_LEN_doc,
5084"CMSG_LEN(length) -> control message length\n\
5085\n\
5086Return the total length, without trailing padding, of an ancillary\n\
5087data item with associated data of the given length. This value can\n\
5088often be used as the buffer size for recvmsg() to receive a single\n\
5089item of ancillary data, but RFC 3542 requires portable applications to\n\
5090use CMSG_SPACE() and thus include space for padding, even when the\n\
5091item will be the last in the buffer. Raises OverflowError if length\n\
5092is outside the permissible range of values.");
5093
5094
5095#ifdef CMSG_SPACE
5096/* Python interface to CMSG_SPACE(length). */
5097
5098static PyObject *
5099socket_CMSG_SPACE(PyObject *self, PyObject *args)
5100{
5101 Py_ssize_t length;
5102 size_t result;
5103
5104 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5105 return NULL;
5106 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5107 PyErr_SetString(PyExc_OverflowError,
5108 "CMSG_SPACE() argument out of range");
5109 return NULL;
5110 }
5111 return PyLong_FromSize_t(result);
5112}
5113
5114PyDoc_STRVAR(CMSG_SPACE_doc,
5115"CMSG_SPACE(length) -> buffer size\n\
5116\n\
5117Return the buffer size needed for recvmsg() to receive an ancillary\n\
5118data item with associated data of the given length, along with any\n\
5119trailing padding. The buffer space needed to receive multiple items\n\
5120is the sum of the CMSG_SPACE() values for their associated data\n\
5121lengths. Raises OverflowError if length is outside the permissible\n\
5122range of values.");
5123#endif /* CMSG_SPACE */
5124#endif /* CMSG_LEN */
5125
5126
Guido van Rossum30a685f1991-06-27 15:51:29 +00005127/* List of functions exported by this module. */
5128
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005129static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 {"gethostbyname", socket_gethostbyname,
5131 METH_VARARGS, gethostbyname_doc},
5132 {"gethostbyname_ex", socket_gethostbyname_ex,
5133 METH_VARARGS, ghbn_ex_doc},
5134 {"gethostbyaddr", socket_gethostbyaddr,
5135 METH_VARARGS, gethostbyaddr_doc},
5136 {"gethostname", socket_gethostname,
5137 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005138#ifdef HAVE_SETHOSTNAME
5139 {"sethostname", socket_sethostname,
5140 METH_VARARGS, sethostname_doc},
5141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 {"getservbyname", socket_getservbyname,
5143 METH_VARARGS, getservbyname_doc},
5144 {"getservbyport", socket_getservbyport,
5145 METH_VARARGS, getservbyport_doc},
5146 {"getprotobyname", socket_getprotobyname,
5147 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005148#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 {"dup", socket_dup,
5150 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005151#endif
Dave Cole331708b2004-08-09 04:51:41 +00005152#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 {"socketpair", socket_socketpair,
5154 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 {"ntohs", socket_ntohs,
5157 METH_VARARGS, ntohs_doc},
5158 {"ntohl", socket_ntohl,
5159 METH_O, ntohl_doc},
5160 {"htons", socket_htons,
5161 METH_VARARGS, htons_doc},
5162 {"htonl", socket_htonl,
5163 METH_O, htonl_doc},
5164 {"inet_aton", socket_inet_aton,
5165 METH_VARARGS, inet_aton_doc},
5166 {"inet_ntoa", socket_inet_ntoa,
5167 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005168#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 {"inet_pton", socket_inet_pton,
5170 METH_VARARGS, inet_pton_doc},
5171 {"inet_ntop", socket_inet_ntop,
5172 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005173#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005174 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5175 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 {"getnameinfo", socket_getnameinfo,
5177 METH_VARARGS, getnameinfo_doc},
5178 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5179 METH_NOARGS, getdefaulttimeout_doc},
5180 {"setdefaulttimeout", socket_setdefaulttimeout,
5181 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005182#ifdef HAVE_IF_NAMEINDEX
5183 {"if_nameindex", socket_if_nameindex,
5184 METH_NOARGS, if_nameindex_doc},
5185 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005186 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005187 {"if_indextoname", socket_if_indextoname,
5188 METH_O, if_indextoname_doc},
5189#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005190#ifdef CMSG_LEN
5191 {"CMSG_LEN", socket_CMSG_LEN,
5192 METH_VARARGS, CMSG_LEN_doc},
5193#ifdef CMSG_SPACE
5194 {"CMSG_SPACE", socket_CMSG_SPACE,
5195 METH_VARARGS, CMSG_SPACE_doc},
5196#endif
5197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005199};
5200
Guido van Rossum30a685f1991-06-27 15:51:29 +00005201
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005202#ifdef MS_WINDOWS
5203#define OS_INIT_DEFINED
5204
5205/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005206
5207static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005208os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005211}
5212
5213static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005214os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 WSADATA WSAData;
5217 int ret;
5218 ret = WSAStartup(0x0101, &WSAData);
5219 switch (ret) {
5220 case 0: /* No error */
5221 Py_AtExit(os_cleanup);
5222 return 1; /* Success */
5223 case WSASYSNOTREADY:
5224 PyErr_SetString(PyExc_ImportError,
5225 "WSAStartup failed: network not ready");
5226 break;
5227 case WSAVERNOTSUPPORTED:
5228 case WSAEINVAL:
5229 PyErr_SetString(
5230 PyExc_ImportError,
5231 "WSAStartup failed: requested version not supported");
5232 break;
5233 default:
5234 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5235 break;
5236 }
5237 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005238}
5239
Guido van Rossum8d665e61996-06-26 18:22:49 +00005240#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005241
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005242
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005243#ifdef PYOS_OS2
5244#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005245
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005246/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005247
5248static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005249os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005250{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005251#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 if (rc == 0) {
5255 return 1; /* Success */
5256 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005261#else
Ezio Melotti13925002011-03-16 11:05:33 +02005262 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005264#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005265}
5266
5267#endif /* PYOS_OS2 */
5268
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005269
5270#ifndef OS_INIT_DEFINED
5271static int
5272os_init(void)
5273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005275}
5276#endif
5277
5278
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005279/* C API table - always add new things to the end for binary
5280 compatibility. */
5281static
5282PySocketModule_APIObject PySocketModuleAPI =
5283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005285 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005287};
5288
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005289
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005290/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005291
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005292 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005293 "socket.py" which implements some additional functionality.
5294 The import of "_socket" may fail with an ImportError exception if
5295 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005296 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005297 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005298*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005299
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005300PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005301"Implementation module for socket operations.\n\
5302\n\
5303See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005304
Martin v. Löwis1a214512008-06-11 05:26:20 +00005305static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 PyModuleDef_HEAD_INIT,
5307 PySocket_MODULE_NAME,
5308 socket_doc,
5309 -1,
5310 socket_methods,
5311 NULL,
5312 NULL,
5313 NULL,
5314 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005315};
5316
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005317PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005318PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 if (!os_init())
5323 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 Py_TYPE(&sock_type) = &PyType_Type;
5326 m = PyModule_Create(&socketmodule);
5327 if (m == NULL)
5328 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 socket_error = PyErr_NewException("socket.error",
5331 PyExc_IOError, NULL);
5332 if (socket_error == NULL)
5333 return NULL;
5334 PySocketModuleAPI.error = socket_error;
5335 Py_INCREF(socket_error);
5336 PyModule_AddObject(m, "error", socket_error);
5337 socket_herror = PyErr_NewException("socket.herror",
5338 socket_error, NULL);
5339 if (socket_herror == NULL)
5340 return NULL;
5341 Py_INCREF(socket_herror);
5342 PyModule_AddObject(m, "herror", socket_herror);
5343 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
5344 NULL);
5345 if (socket_gaierror == NULL)
5346 return NULL;
5347 Py_INCREF(socket_gaierror);
5348 PyModule_AddObject(m, "gaierror", socket_gaierror);
5349 socket_timeout = PyErr_NewException("socket.timeout",
5350 socket_error, NULL);
5351 if (socket_timeout == NULL)
5352 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005353 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 Py_INCREF(socket_timeout);
5355 PyModule_AddObject(m, "timeout", socket_timeout);
5356 Py_INCREF((PyObject *)&sock_type);
5357 if (PyModule_AddObject(m, "SocketType",
5358 (PyObject *)&sock_type) != 0)
5359 return NULL;
5360 Py_INCREF((PyObject *)&sock_type);
5361 if (PyModule_AddObject(m, "socket",
5362 (PyObject *)&sock_type) != 0)
5363 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005364
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005365#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005367#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 Py_INCREF(has_ipv6);
5371 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 /* Export C API */
5374 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5375 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5376 ) != 0)
5377 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005380#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005384#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005386#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005387#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005389#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005390#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 /* Amateur Radio AX.25 */
5392 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005393#endif
5394#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005396#endif
5397#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 /* Appletalk DDP */
5399 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005400#endif
5401#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 /* Amateur radio NetROM */
5403 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005404#endif
5405#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 /* Multiprotocol bridge */
5407 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005408#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005409#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 /* ATM PVCs */
5411 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005412#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005413#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 /* Reserved for Werner's ATM */
5415 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005416#endif
5417#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 /* Reserved for X.25 project */
5419 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005420#endif
5421#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005423#endif
5424#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 /* Amateur Radio X.25 PLP */
5426 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005427#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005428#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 /* Reserved for DECnet project */
5430 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005431#endif
5432#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 /* Reserved for 802.2LLC project */
5434 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005435#endif
5436#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 /* Security callback pseudo AF */
5438 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005439#endif
5440#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 /* PF_KEY key management API */
5442 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005443#endif
5444#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 /* */
5446 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5447 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005448#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005449 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005450#endif
5451#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5455 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005456#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005458#endif
5459#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005461#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005462#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005464#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005465#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005467#endif
5468#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005472#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005474#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005475#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005477#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005478#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005479#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 /* Alias to emulate 4.4BSD */
5481 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005482#endif
5483#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 /* Ash */
5485 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005486#endif
5487#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 /* Acorn Econet */
5489 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005490#endif
5491#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 /* ATM SVCs */
5493 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005494#endif
5495#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 /* Linux SNA Project (nutters!) */
5497 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005498#endif
5499#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 /* IRDA sockets */
5501 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005502#endif
5503#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 /* PPPoX sockets */
5505 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005506#endif
5507#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 /* Wanpipe API Sockets */
5509 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005510#endif
5511#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 /* Linux LLC */
5513 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005514#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005515
Hye-Shik Chang81268602004-02-02 06:05:24 +00005516#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5518 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5519 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5520 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005521#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005523#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005524#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005525#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5529 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5532 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5533 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005534#endif
5535
Antoine Pitroub156a462010-10-27 20:13:57 +00005536#ifdef AF_PACKET
5537 PyModule_AddIntMacro(m, AF_PACKET);
5538#endif
5539#ifdef PF_PACKET
5540 PyModule_AddIntMacro(m, PF_PACKET);
5541#endif
5542#ifdef PACKET_HOST
5543 PyModule_AddIntMacro(m, PACKET_HOST);
5544#endif
5545#ifdef PACKET_BROADCAST
5546 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5547#endif
5548#ifdef PACKET_MULTICAST
5549 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5550#endif
5551#ifdef PACKET_OTHERHOST
5552 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5553#endif
5554#ifdef PACKET_OUTGOING
5555 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5556#endif
5557#ifdef PACKET_LOOPBACK
5558 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5559#endif
5560#ifdef PACKET_FASTROUTE
5561 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005562#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005563
Christian Heimes043d6f62008-01-07 17:19:16 +00005564#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 /* for addresses */
5568 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5569 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5570 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5573 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5574 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 /* for setsockopt() */
5577 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5578 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5579 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5580 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5581 TIPC_DEST_DROPPABLE);
5582 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5585 TIPC_LOW_IMPORTANCE);
5586 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5587 TIPC_MEDIUM_IMPORTANCE);
5588 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5589 TIPC_HIGH_IMPORTANCE);
5590 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5591 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 /* for subscriptions */
5594 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5595 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005596#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 /* doesn't seem to be available everywhere */
5598 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5601 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5602 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5603 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5604 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5605 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005606#endif
5607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 /* Socket types */
5609 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5610 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005611/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5613 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005614#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005616#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005617#ifdef SOCK_CLOEXEC
5618 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5619#endif
5620#ifdef SOCK_NONBLOCK
5621 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5622#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624#ifdef SO_DEBUG
5625 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627#ifdef SO_ACCEPTCONN
5628 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630#ifdef SO_REUSEADDR
5631 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005632#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005633#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005635#endif
5636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637#ifdef SO_KEEPALIVE
5638 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640#ifdef SO_DONTROUTE
5641 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643#ifdef SO_BROADCAST
5644 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646#ifdef SO_USELOOPBACK
5647 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005648#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649#ifdef SO_LINGER
5650 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005651#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652#ifdef SO_OOBINLINE
5653 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005654#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655#ifdef SO_REUSEPORT
5656 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658#ifdef SO_SNDBUF
5659 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661#ifdef SO_RCVBUF
5662 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664#ifdef SO_SNDLOWAT
5665 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667#ifdef SO_RCVLOWAT
5668 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670#ifdef SO_SNDTIMEO
5671 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673#ifdef SO_RCVTIMEO
5674 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676#ifdef SO_ERROR
5677 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679#ifdef SO_TYPE
5680 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005681#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682#ifdef SO_SETFIB
5683 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005684#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005685#ifdef SO_PASSCRED
5686 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5687#endif
5688#ifdef SO_PEERCRED
5689 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5690#endif
5691#ifdef LOCAL_PEERCRED
5692 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5693#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 /* Maximum number of connections for "listen" */
5696#ifdef SOMAXCONN
5697 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005700#endif
5701
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005702 /* Ancilliary message types */
5703#ifdef SCM_RIGHTS
5704 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5705#endif
5706#ifdef SCM_CREDENTIALS
5707 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5708#endif
5709#ifdef SCM_CREDS
5710 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5711#endif
5712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 /* Flags for send, recv */
5714#ifdef MSG_OOB
5715 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717#ifdef MSG_PEEK
5718 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720#ifdef MSG_DONTROUTE
5721 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723#ifdef MSG_DONTWAIT
5724 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726#ifdef MSG_EOR
5727 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729#ifdef MSG_TRUNC
5730 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732#ifdef MSG_CTRUNC
5733 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735#ifdef MSG_WAITALL
5736 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738#ifdef MSG_BTAG
5739 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741#ifdef MSG_ETAG
5742 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005743#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005744#ifdef MSG_NOSIGNAL
5745 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5746#endif
5747#ifdef MSG_NOTIFICATION
5748 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5749#endif
5750#ifdef MSG_CMSG_CLOEXEC
5751 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5752#endif
5753#ifdef MSG_ERRQUEUE
5754 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5755#endif
5756#ifdef MSG_CONFIRM
5757 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5758#endif
5759#ifdef MSG_MORE
5760 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5761#endif
5762#ifdef MSG_EOF
5763 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5764#endif
5765#ifdef MSG_BCAST
5766 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5767#endif
5768#ifdef MSG_MCAST
5769 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5770#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 /* Protocol level and numbers, usable for [gs]etsockopt */
5773#ifdef SOL_SOCKET
5774 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776#ifdef SOL_IP
5777 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005778#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781#ifdef SOL_IPX
5782 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784#ifdef SOL_AX25
5785 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787#ifdef SOL_ATALK
5788 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790#ifdef SOL_NETROM
5791 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793#ifdef SOL_ROSE
5794 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796#ifdef SOL_TCP
5797 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005798#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801#ifdef SOL_UDP
5802 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005803#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806#ifdef IPPROTO_IP
5807 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005808#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811#ifdef IPPROTO_HOPOPTS
5812 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814#ifdef IPPROTO_ICMP
5815 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005816#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819#ifdef IPPROTO_IGMP
5820 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822#ifdef IPPROTO_GGP
5823 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825#ifdef IPPROTO_IPV4
5826 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828#ifdef IPPROTO_IPV6
5829 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831#ifdef IPPROTO_IPIP
5832 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834#ifdef IPPROTO_TCP
5835 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005836#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839#ifdef IPPROTO_EGP
5840 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842#ifdef IPPROTO_PUP
5843 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845#ifdef IPPROTO_UDP
5846 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005847#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850#ifdef IPPROTO_IDP
5851 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853#ifdef IPPROTO_HELLO
5854 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856#ifdef IPPROTO_ND
5857 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859#ifdef IPPROTO_TP
5860 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862#ifdef IPPROTO_IPV6
5863 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865#ifdef IPPROTO_ROUTING
5866 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868#ifdef IPPROTO_FRAGMENT
5869 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871#ifdef IPPROTO_RSVP
5872 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874#ifdef IPPROTO_GRE
5875 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877#ifdef IPPROTO_ESP
5878 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880#ifdef IPPROTO_AH
5881 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883#ifdef IPPROTO_MOBILE
5884 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886#ifdef IPPROTO_ICMPV6
5887 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889#ifdef IPPROTO_NONE
5890 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892#ifdef IPPROTO_DSTOPTS
5893 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895#ifdef IPPROTO_XTP
5896 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898#ifdef IPPROTO_EON
5899 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901#ifdef IPPROTO_PIM
5902 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904#ifdef IPPROTO_IPCOMP
5905 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907#ifdef IPPROTO_VRRP
5908 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005909#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005910#ifdef IPPROTO_SCTP
5911 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
5912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913#ifdef IPPROTO_BIP
5914 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005915#endif
5916/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917#ifdef IPPROTO_RAW
5918 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005919#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922#ifdef IPPROTO_MAX
5923 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005924#endif
5925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 /* Some port configuration */
5927#ifdef IPPORT_RESERVED
5928 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005929#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932#ifdef IPPORT_USERRESERVED
5933 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005934#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005936#endif
5937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 /* Some reserved IP v.4 addresses */
5939#ifdef INADDR_ANY
5940 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944#ifdef INADDR_BROADCAST
5945 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005946#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949#ifdef INADDR_LOOPBACK
5950 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005951#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954#ifdef INADDR_UNSPEC_GROUP
5955 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005956#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959#ifdef INADDR_ALLHOSTS_GROUP
5960 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5961 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005962#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005963 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965#ifdef INADDR_MAX_LOCAL_GROUP
5966 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5967 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005968#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971#ifdef INADDR_NONE
5972 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005973#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005975#endif
5976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 /* IPv4 [gs]etsockopt options */
5978#ifdef IP_OPTIONS
5979 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981#ifdef IP_HDRINCL
5982 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984#ifdef IP_TOS
5985 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987#ifdef IP_TTL
5988 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990#ifdef IP_RECVOPTS
5991 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993#ifdef IP_RECVRETOPTS
5994 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996#ifdef IP_RECVDSTADDR
5997 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999#ifdef IP_RETOPTS
6000 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002#ifdef IP_MULTICAST_IF
6003 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005#ifdef IP_MULTICAST_TTL
6006 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008#ifdef IP_MULTICAST_LOOP
6009 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011#ifdef IP_ADD_MEMBERSHIP
6012 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014#ifdef IP_DROP_MEMBERSHIP
6015 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017#ifdef IP_DEFAULT_MULTICAST_TTL
6018 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6019 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021#ifdef IP_DEFAULT_MULTICAST_LOOP
6022 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6023 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025#ifdef IP_MAX_MEMBERSHIPS
6026 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006027#endif
6028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6030#ifdef IPV6_JOIN_GROUP
6031 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033#ifdef IPV6_LEAVE_GROUP
6034 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036#ifdef IPV6_MULTICAST_HOPS
6037 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039#ifdef IPV6_MULTICAST_IF
6040 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042#ifdef IPV6_MULTICAST_LOOP
6043 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045#ifdef IPV6_UNICAST_HOPS
6046 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006049#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006053#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006055#endif
6056#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006058#endif
6059#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006061#endif
6062#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006064#endif
6065#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006067#endif
6068#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006070#endif
6071#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006073#endif
6074#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006076#endif
6077#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006079#endif
6080#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006082#endif
6083#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006085#endif
6086#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006088#endif
6089#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006091#endif
6092#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006094#endif
6095#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006097#endif
6098#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006100#endif
6101#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006103#endif
6104#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006106#endif
6107#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006109#endif
6110#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006112#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 /* TCP options */
6115#ifdef TCP_NODELAY
6116 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118#ifdef TCP_MAXSEG
6119 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121#ifdef TCP_CORK
6122 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124#ifdef TCP_KEEPIDLE
6125 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127#ifdef TCP_KEEPINTVL
6128 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006129#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130#ifdef TCP_KEEPCNT
6131 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133#ifdef TCP_SYNCNT
6134 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136#ifdef TCP_LINGER2
6137 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139#ifdef TCP_DEFER_ACCEPT
6140 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142#ifdef TCP_WINDOW_CLAMP
6143 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145#ifdef TCP_INFO
6146 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef TCP_QUICKACK
6149 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006150#endif
6151
Guido van Rossum09be4091999-08-09 14:40:40 +00006152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 /* IPX options */
6154#ifdef IPX_TYPE
6155 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006156#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006159#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006161#endif
6162#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006164#endif
6165#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006167#endif
6168#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006170#endif
6171#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006173#endif
6174#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006176#endif
6177#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006179#endif
6180#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006182#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006183#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006185#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006186#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006188#endif
6189#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006191#endif
6192#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006194#endif
6195#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006197#endif
6198#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006200#endif
6201#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006203#endif
6204#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006206#endif
6207#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006209#endif
6210#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006212#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006213#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006215#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006216#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006218#endif
6219#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006221#endif
6222#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006224#endif
6225#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006227#endif
6228#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006230#endif
6231#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006233#endif
6234#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006236#endif
6237#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006239#endif
6240#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006242#endif
6243#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006245#endif
6246#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006248#endif
6249#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006251#endif
6252#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006254#endif
6255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006257#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006259#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006260 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006261#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006262 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006263#endif
6264#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006266#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006268#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006270#endif
6271#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006273#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006275#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006277#endif
6278
Christian Heimesfaf2f632008-01-06 16:59:19 +00006279#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280 {
6281 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6282 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6283 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006284 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285 PyObject *tmp;
6286 tmp = PyLong_FromUnsignedLong(codes[i]);
6287 if (tmp == NULL)
6288 return NULL;
6289 PyModule_AddObject(m, names[i], tmp);
6290 }
6291 }
6292 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6293 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6294 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006295#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006297#endif
6298#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006300#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006301#endif /* _MSTCPIP_ */
6302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006304#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006308}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006309
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006310
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006311#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006312#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006313
6314/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006315/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006316
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006317int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006318inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006320 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006321#if (SIZEOF_INT != 4)
6322#error "Not sure if in_addr_t exists and int is not 32-bits."
6323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324 unsigned int packed_addr;
6325 packed_addr = inet_addr(src);
6326 if (packed_addr == INADDR_NONE)
6327 return 0;
6328 memcpy(dst, &packed_addr, 4);
6329 return 1;
6330 }
6331 /* Should set errno to EAFNOSUPPORT */
6332 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006333}
6334
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006335const char *
6336inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006338 if (af == AF_INET) {
6339 struct in_addr packed_addr;
6340 if (size < 16)
6341 /* Should set errno to ENOSPC. */
6342 return NULL;
6343 memcpy(&packed_addr, src, sizeof(packed_addr));
6344 return strncpy(dst, inet_ntoa(packed_addr), size);
6345 }
6346 /* Should set errno to EAFNOSUPPORT */
6347 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006348}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006349
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006350#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006351#endif