blob: 2056b61a9b23501c908c80241be1a639b8073df0 [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_herror;
461static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000462static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463
Tim Peters643a7fc2002-02-17 04:13:21 +0000464/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000465 The sock_type variable contains pointers to various functions,
466 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000467 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000468static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000469
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470#if defined(HAVE_POLL_H)
471#include <poll.h>
472#elif defined(HAVE_SYS_POLL_H)
473#include <sys/poll.h>
474#endif
475
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000476/* Largest value to try to store in a socklen_t (used when handling
477 ancillary data). POSIX requires socklen_t to hold at least
478 (2**31)-1 and recommends against storing larger values, but
479 socklen_t was originally int in the BSD interface, so to be on the
480 safe side we use the smaller of (2**31)-1 and INT_MAX. */
481#if INT_MAX > 0x7fffffff
482#define SOCKLEN_T_LIMIT 0x7fffffff
483#else
484#define SOCKLEN_T_LIMIT INT_MAX
485#endif
486
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200487#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000488/* Instead of select(), we'll use poll() since poll() works on any fd. */
489#define IS_SELECTABLE(s) 1
490/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000491#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200492/* If there's no timeout left, we don't have to call select, so it's a safe,
493 * little white lie. */
494#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000495#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000496
497static PyObject*
498select_error(void)
499{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200500 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000502}
503
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000504#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000505#ifndef WSAEAGAIN
506#define WSAEAGAIN WSAEWOULDBLOCK
507#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000508#define CHECK_ERRNO(expected) \
509 (WSAGetLastError() == WSA ## expected)
510#else
511#define CHECK_ERRNO(expected) \
512 (errno == expected)
513#endif
514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515/* Convenience function to raise an error according to errno
516 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000519set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000520{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000521#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 int err_no = WSAGetLastError();
523 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
524 recognizes the error codes used by both GetLastError() and
525 WSAGetLastError */
526 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200527 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000528#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000529
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000530#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (sock_errno() != NO_ERROR) {
532 APIRET rc;
533 ULONG msglen;
534 char outbuf[100];
535 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 /* Retrieve socket-related error message from MPTN.MSG file */
538 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
539 myerrorcode - SOCBASEERR + 26,
540 "mptn.msg",
541 &msglen);
542 if (rc == NO_ERROR) {
543 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 /* OS/2 doesn't guarantee a terminator */
546 outbuf[msglen] = '\0';
547 if (strlen(outbuf) > 0) {
548 /* If non-empty msg, trim CRLF */
549 char *lastc = &outbuf[ strlen(outbuf)-1 ];
550 while (lastc > outbuf &&
551 isspace(Py_CHARMASK(*lastc))) {
552 /* Trim trailing whitespace (CRLF) */
553 *lastc-- = '\0';
554 }
555 }
556 v = Py_BuildValue("(is)", myerrorcode, outbuf);
557 if (v != NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200558 PyErr_SetObject(PyExc_OSError, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 Py_DECREF(v);
560 }
561 return NULL;
562 }
563 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000564#endif
565
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200566 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567}
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000571set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000574
575#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (v != NULL) {
581 PyErr_SetObject(socket_herror, v);
582 Py_DECREF(v);
583 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586}
587
588
589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000590set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593
Martin v. Löwis272cb402002-03-01 08:31:07 +0000594#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 /* EAI_SYSTEM is not available on Windows XP. */
596 if (error == EAI_SYSTEM)
597 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000598#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000600#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000602#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (v != NULL) {
606 PyErr_SetObject(socket_gaierror, v);
607 Py_DECREF(v);
608 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611}
612
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613#ifdef __VMS
614/* Function to send in segments */
615static int
616sendsegmented(int sock_fd, char *buf, int len, int flags)
617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 int n = 0;
619 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 while (remaining > 0) {
622 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
625 n = send(sock_fd, buf, segment, flags);
626 if (n < 0) {
627 return n;
628 }
629 remaining -= segment;
630 buf += segment;
631 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634}
635#endif
636
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000637/* Function to perform the setting of socket blocking mode
638 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000639static int
640internal_setblocking(PySocketSockObject *s, int block)
641{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000645#ifdef SOCK_NONBLOCK
646 if (block)
647 s->sock_type &= (~SOCK_NONBLOCK);
648 else
649 s->sock_type |= SOCK_NONBLOCK;
650#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653#ifndef MS_WINDOWS
654#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 block = !block;
656 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000657#elif defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 block = !block;
659 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
662 if (block)
663 delay_flag &= (~O_NONBLOCK);
664 else
665 delay_flag |= O_NONBLOCK;
666 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667#endif /* !PYOS_OS2 */
668#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 block = !block;
670 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* Since these don't return anything */
675 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000676}
677
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000679 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000680 This does not raise an exception; we'll let our caller do that
681 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000682 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000683static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000684internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 /* Nothing to do unless we're in timeout mode (not non-blocking) */
689 if (s->sock_timeout <= 0.0)
690 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 /* Guard against closed socket */
693 if (s->sock_fd < 0)
694 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000695
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000696 /* Handling this condition here simplifies the select loops */
697 if (interval < 0.0)
698 return 1;
699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 /* Prefer poll, if available, since you can poll() any fd
701 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000702#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 {
704 struct pollfd pollfd;
705 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 pollfd.fd = s->sock_fd;
708 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000711 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 n = poll(&pollfd, 1, timeout);
713 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000714#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 {
716 /* Construct the arguments to select */
717 fd_set fds;
718 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000719 tv.tv_sec = (int)interval;
720 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 FD_ZERO(&fds);
722 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 /* See if the socket is ready */
725 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000726 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
727 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000729 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
730 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000732#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (n < 0)
735 return -1;
736 if (n == 0)
737 return 1;
738 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739}
740
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000741static int
742internal_select(PySocketSockObject *s, int writing)
743{
744 return internal_select_ex(s, writing, s->sock_timeout);
745}
746
747/*
748 Two macros for automatic retry of select() in case of false positives
749 (for example, select() could indicate a socket is ready for reading
750 but the data then discarded by the OS because of a wrong checksum).
751 Here is an example of use:
752
753 BEGIN_SELECT_LOOP(s)
754 Py_BEGIN_ALLOW_THREADS
755 timeout = internal_select_ex(s, 0, interval);
756 if (!timeout)
757 outlen = recv(s->sock_fd, cbuf, len, flags);
758 Py_END_ALLOW_THREADS
759 if (timeout == 1) {
760 PyErr_SetString(socket_timeout, "timed out");
761 return -1;
762 }
763 END_SELECT_LOOP(s)
764*/
765
766#define BEGIN_SELECT_LOOP(s) \
767 { \
768 _PyTime_timeval now, deadline = {0, 0}; \
769 double interval = s->sock_timeout; \
770 int has_timeout = s->sock_timeout > 0.0; \
771 if (has_timeout) { \
772 _PyTime_gettimeofday(&now); \
773 deadline = now; \
774 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
775 } \
776 while (1) { \
777 errno = 0; \
778
779#define END_SELECT_LOOP(s) \
780 if (!has_timeout || \
781 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
782 break; \
783 _PyTime_gettimeofday(&now); \
784 interval = _PyTime_INTERVAL(now, deadline); \
785 } \
786 } \
787
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000788/* Initialize a new socket object. */
789
Tim Petersa12b4cf2002-07-18 22:38:44 +0000790static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000791
Martin v. Löwis1a214512008-06-11 05:26:20 +0000792static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000793init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 s->sock_fd = fd;
797 s->sock_family = family;
798 s->sock_type = type;
799 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000802#ifdef SOCK_NONBLOCK
803 if (type & SOCK_NONBLOCK)
804 s->sock_timeout = 0.0;
805 else
806#endif
807 {
808 s->sock_timeout = defaulttimeout;
809 if (defaulttimeout >= 0.0)
810 internal_setblocking(s, 0);
811 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000812
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000813}
814
815
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816/* Create a new socket object.
817 This just creates the object and initializes it.
818 If the creation fails, return NULL and set an exception (implicit
819 in NEWOBJ()). */
820
Guido van Rossum73624e91994-10-10 17:59:00 +0000821static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000822new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 PySocketSockObject *s;
825 s = (PySocketSockObject *)
826 PyType_GenericNew(&sock_type, NULL, NULL);
827 if (s != NULL)
828 init_sockobject(s, fd, family, type, proto);
829 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830}
831
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832
Guido van Rossum48a680c2001-03-02 06:34:14 +0000833/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000834 thread to be in gethostbyname or getaddrinfo */
835#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
836PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000837#endif
838
839
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840/* Convert a string specifying a host name or one of a few symbolic
841 names to a numeric IP address. This usually calls gethostbyname()
842 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 an error occurred; then an exception is raised. */
845
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000847setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 struct addrinfo hints, *res;
850 int error;
851 int d1, d2, d3, d4;
852 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
855 if (name[0] == '\0') {
856 int siz;
857 memset(&hints, 0, sizeof(hints));
858 hints.ai_family = af;
859 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
860 hints.ai_flags = AI_PASSIVE;
861 Py_BEGIN_ALLOW_THREADS
862 ACQUIRE_GETADDRINFO_LOCK
863 error = getaddrinfo(NULL, "0", &hints, &res);
864 Py_END_ALLOW_THREADS
865 /* We assume that those thread-unsafe getaddrinfo() versions
866 *are* safe regarding their return value, ie. that a
867 subsequent call to getaddrinfo() does not destroy the
868 outcome of the first call. */
869 RELEASE_GETADDRINFO_LOCK
870 if (error) {
871 set_gaierror(error);
872 return -1;
873 }
874 switch (res->ai_family) {
875 case AF_INET:
876 siz = 4;
877 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000878#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case AF_INET6:
880 siz = 16;
881 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 default:
884 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200885 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 "unsupported address family");
887 return -1;
888 }
889 if (res->ai_next) {
890 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200891 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 "wildcard resolved to multiple address");
893 return -1;
894 }
895 if (res->ai_addrlen < addr_ret_size)
896 addr_ret_size = res->ai_addrlen;
897 memcpy(addr_ret, res->ai_addr, addr_ret_size);
898 freeaddrinfo(res);
899 return siz;
900 }
901 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
902 struct sockaddr_in *sin;
903 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200904 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 "address family mismatched");
906 return -1;
907 }
908 sin = (struct sockaddr_in *)addr_ret;
909 memset((void *) sin, '\0', sizeof(*sin));
910 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000911#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 sin->sin_addr.s_addr = INADDR_BROADCAST;
915 return sizeof(sin->sin_addr);
916 }
917 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
918 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
919 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
920 struct sockaddr_in *sin;
921 sin = (struct sockaddr_in *)addr_ret;
922 sin->sin_addr.s_addr = htonl(
923 ((long) d1 << 24) | ((long) d2 << 16) |
924 ((long) d3 << 8) | ((long) d4 << 0));
925 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000926#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 return 4;
930 }
931 memset(&hints, 0, sizeof(hints));
932 hints.ai_family = af;
933 Py_BEGIN_ALLOW_THREADS
934 ACQUIRE_GETADDRINFO_LOCK
935 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000936#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 if (error == EAI_NONAME && af == AF_UNSPEC) {
938 /* On Tru64 V5.1, numeric-to-addr conversion fails
939 if no address family is given. Assume IPv4 for now.*/
940 hints.ai_family = AF_INET;
941 error = getaddrinfo(name, NULL, &hints, &res);
942 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 Py_END_ALLOW_THREADS
945 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
946 if (error) {
947 set_gaierror(error);
948 return -1;
949 }
950 if (res->ai_addrlen < addr_ret_size)
951 addr_ret_size = res->ai_addrlen;
952 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
953 freeaddrinfo(res);
954 switch (addr_ret->sa_family) {
955 case AF_INET:
956 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000957#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 case AF_INET6:
959 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200962 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 return -1;
964 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965}
966
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968/* Create a string object representing an IP address.
969 This is always a string of the form 'dd.dd.dd.dd' (with variable
970 size numbers). */
971
Guido van Rossum73624e91994-10-10 17:59:00 +0000972static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000973makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 char buf[NI_MAXHOST];
976 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
979 NI_NUMERICHOST);
980 if (error) {
981 set_gaierror(error);
982 return NULL;
983 }
984 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985}
986
987
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000988#ifdef USE_BLUETOOTH
989/* Convert a string representation of a Bluetooth address into a numeric
990 address. Returns the length (6), or raises an exception and returns -1 if
991 an error occurred. */
992
993static int
994setbdaddr(char *name, bdaddr_t *bdaddr)
995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 unsigned int b0, b1, b2, b3, b4, b5;
997 char ch;
998 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1001 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1002 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1003 bdaddr->b[0] = b0;
1004 bdaddr->b[1] = b1;
1005 bdaddr->b[2] = b2;
1006 bdaddr->b[3] = b3;
1007 bdaddr->b[4] = b4;
1008 bdaddr->b[5] = b5;
1009 return 6;
1010 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return -1;
1013 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001014}
1015
1016/* Create a string representation of the Bluetooth address. This is always a
1017 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1018 value (zero padded if necessary). */
1019
1020static PyObject *
1021makebdaddr(bdaddr_t *bdaddr)
1022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1026 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1027 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1028 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001029}
1030#endif
1031
1032
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033/* Create an object representing the given socket address,
1034 suitable for passing it back to bind(), connect() etc.
1035 The family field of the sockaddr structure is inspected
1036 to determine what kind of address it really is. */
1037
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001039static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001040makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 if (addrlen == 0) {
1043 /* No address -- may be recvfrom() from known socket */
1044 Py_INCREF(Py_None);
1045 return Py_None;
1046 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case AF_INET:
1051 {
1052 struct sockaddr_in *a;
1053 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1054 PyObject *ret = NULL;
1055 if (addrobj) {
1056 a = (struct sockaddr_in *)addr;
1057 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1058 Py_DECREF(addrobj);
1059 }
1060 return ret;
1061 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001063#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 case AF_UNIX:
1065 {
1066 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001067#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1069 addrlen -= offsetof(struct sockaddr_un, sun_path);
1070 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
1071 }
1072 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 {
1075 /* regular NULL-terminated string */
1076 return PyUnicode_FromString(a->sun_path);
1077 }
1078 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001079#endif /* AF_UNIX */
1080
Martin v. Löwis11017b12006-01-14 18:12:57 +00001081#if defined(AF_NETLINK)
1082 case AF_NETLINK:
1083 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1085 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001086 }
1087#endif /* AF_NETLINK */
1088
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001089#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 case AF_INET6:
1091 {
1092 struct sockaddr_in6 *a;
1093 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1094 PyObject *ret = NULL;
1095 if (addrobj) {
1096 a = (struct sockaddr_in6 *)addr;
1097 ret = Py_BuildValue("Oiii",
1098 addrobj,
1099 ntohs(a->sin6_port),
1100 a->sin6_flowinfo,
1101 a->sin6_scope_id);
1102 Py_DECREF(addrobj);
1103 }
1104 return ret;
1105 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001106#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001108#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 case AF_BLUETOOTH:
1110 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 case BTPROTO_L2CAP:
1113 {
1114 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1115 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1116 PyObject *ret = NULL;
1117 if (addrobj) {
1118 ret = Py_BuildValue("Oi",
1119 addrobj,
1120 _BT_L2_MEMB(a, psm));
1121 Py_DECREF(addrobj);
1122 }
1123 return ret;
1124 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case BTPROTO_RFCOMM:
1127 {
1128 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1129 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1130 PyObject *ret = NULL;
1131 if (addrobj) {
1132 ret = Py_BuildValue("Oi",
1133 addrobj,
1134 _BT_RC_MEMB(a, channel));
1135 Py_DECREF(addrobj);
1136 }
1137 return ret;
1138 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 case BTPROTO_HCI:
1141 {
1142 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001143#if defined(__NetBSD__) || defined(__DragonFly__)
1144 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1145#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 PyObject *ret = NULL;
1147 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1148 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001151
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001152#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 case BTPROTO_SCO:
1154 {
1155 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1156 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1157 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158#endif
1159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 default:
1161 PyErr_SetString(PyExc_ValueError,
1162 "Unknown Bluetooth protocol");
1163 return NULL;
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165#endif
1166
Antoine Pitroub156a462010-10-27 20:13:57 +00001167#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 case AF_PACKET:
1169 {
1170 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1171 char *ifname = "";
1172 struct ifreq ifr;
1173 /* need to look up interface name give index */
1174 if (a->sll_ifindex) {
1175 ifr.ifr_ifindex = a->sll_ifindex;
1176 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1177 ifname = ifr.ifr_name;
1178 }
1179 return Py_BuildValue("shbhy#",
1180 ifname,
1181 ntohs(a->sll_protocol),
1182 a->sll_pkttype,
1183 a->sll_hatype,
1184 a->sll_addr,
1185 a->sll_halen);
1186 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001187#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001188
Christian Heimes043d6f62008-01-07 17:19:16 +00001189#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 case AF_TIPC:
1191 {
1192 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1193 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1194 return Py_BuildValue("IIIII",
1195 a->addrtype,
1196 a->addr.nameseq.type,
1197 a->addr.nameseq.lower,
1198 a->addr.nameseq.upper,
1199 a->scope);
1200 } else if (a->addrtype == TIPC_ADDR_NAME) {
1201 return Py_BuildValue("IIIII",
1202 a->addrtype,
1203 a->addr.name.name.type,
1204 a->addr.name.name.instance,
1205 a->addr.name.name.instance,
1206 a->scope);
1207 } else if (a->addrtype == TIPC_ADDR_ID) {
1208 return Py_BuildValue("IIIII",
1209 a->addrtype,
1210 a->addr.id.node,
1211 a->addr.id.ref,
1212 0,
1213 a->scope);
1214 } else {
1215 PyErr_SetString(PyExc_ValueError,
1216 "Invalid address type");
1217 return NULL;
1218 }
1219 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001220#endif
1221
Charles-François Natali30589c92011-10-07 22:47:08 +02001222#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001223 case AF_CAN:
1224 {
1225 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1226 char *ifname = "";
1227 struct ifreq ifr;
1228 /* need to look up interface name given index */
1229 if (a->can_ifindex) {
1230 ifr.ifr_ifindex = a->can_ifindex;
1231 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1232 ifname = ifr.ifr_name;
1233 }
1234
1235 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1236 ifname,
1237 a->can_family);
1238 }
1239#endif
1240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 default:
1244 /* If we don't know the address family, don't raise an
1245 exception -- return it as an (int, bytes) tuple. */
1246 return Py_BuildValue("iy#",
1247 addr->sa_family,
1248 addr->sa_data,
1249 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
1255/* Parse a socket address argument according to the socket object's
1256 address family. Return 1 if the address was in the proper format,
1257 0 of not. The address is returned through addr_ret, its length
1258 through len_ret. */
1259
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001261getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001266#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case AF_UNIX:
1268 {
1269 struct sockaddr_un* addr;
1270 char *path;
1271 int len;
1272 if (!PyArg_Parse(args, "s#", &path, &len))
1273 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001276#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 if (len > 0 && path[0] == 0) {
1278 /* Linux abstract namespace extension */
1279 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001280 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 "AF_UNIX path too long");
1282 return 0;
1283 }
1284 }
1285 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001286#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 {
1288 /* regular NULL-terminated string */
1289 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001290 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 "AF_UNIX path too long");
1292 return 0;
1293 }
1294 addr->sun_path[len] = 0;
1295 }
1296 addr->sun_family = s->sock_family;
1297 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001298#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001300#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 return 1;
1304 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001305#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306
Martin v. Löwis11017b12006-01-14 18:12:57 +00001307#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 case AF_NETLINK:
1309 {
1310 struct sockaddr_nl* addr;
1311 int pid, groups;
1312 addr = (struct sockaddr_nl *)addr_ret;
1313 if (!PyTuple_Check(args)) {
1314 PyErr_Format(
1315 PyExc_TypeError,
1316 "getsockaddrarg: "
1317 "AF_NETLINK address must be tuple, not %.500s",
1318 Py_TYPE(args)->tp_name);
1319 return 0;
1320 }
1321 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1322 return 0;
1323 addr->nl_family = AF_NETLINK;
1324 addr->nl_pid = pid;
1325 addr->nl_groups = groups;
1326 *len_ret = sizeof(*addr);
1327 return 1;
1328 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001329#endif
1330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 case AF_INET:
1332 {
1333 struct sockaddr_in* addr;
1334 char *host;
1335 int port, result;
1336 if (!PyTuple_Check(args)) {
1337 PyErr_Format(
1338 PyExc_TypeError,
1339 "getsockaddrarg: "
1340 "AF_INET address must be tuple, not %.500s",
1341 Py_TYPE(args)->tp_name);
1342 return 0;
1343 }
1344 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1345 "idna", &host, &port))
1346 return 0;
1347 addr=(struct sockaddr_in*)addr_ret;
1348 result = setipaddr(host, (struct sockaddr *)addr,
1349 sizeof(*addr), AF_INET);
1350 PyMem_Free(host);
1351 if (result < 0)
1352 return 0;
1353 if (port < 0 || port > 0xffff) {
1354 PyErr_SetString(
1355 PyExc_OverflowError,
1356 "getsockaddrarg: port must be 0-65535.");
1357 return 0;
1358 }
1359 addr->sin_family = AF_INET;
1360 addr->sin_port = htons((short)port);
1361 *len_ret = sizeof *addr;
1362 return 1;
1363 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001364
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001365#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 case AF_INET6:
1367 {
1368 struct sockaddr_in6* addr;
1369 char *host;
1370 int port, flowinfo, scope_id, result;
1371 flowinfo = scope_id = 0;
1372 if (!PyTuple_Check(args)) {
1373 PyErr_Format(
1374 PyExc_TypeError,
1375 "getsockaddrarg: "
1376 "AF_INET6 address must be tuple, not %.500s",
1377 Py_TYPE(args)->tp_name);
1378 return 0;
1379 }
1380 if (!PyArg_ParseTuple(args, "eti|ii",
1381 "idna", &host, &port, &flowinfo,
1382 &scope_id)) {
1383 return 0;
1384 }
1385 addr = (struct sockaddr_in6*)addr_ret;
1386 result = setipaddr(host, (struct sockaddr *)addr,
1387 sizeof(*addr), AF_INET6);
1388 PyMem_Free(host);
1389 if (result < 0)
1390 return 0;
1391 if (port < 0 || port > 0xffff) {
1392 PyErr_SetString(
1393 PyExc_OverflowError,
1394 "getsockaddrarg: port must be 0-65535.");
1395 return 0;
1396 }
1397 addr->sin6_family = s->sock_family;
1398 addr->sin6_port = htons((short)port);
1399 addr->sin6_flowinfo = flowinfo;
1400 addr->sin6_scope_id = scope_id;
1401 *len_ret = sizeof *addr;
1402 return 1;
1403 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001404#endif
1405
Hye-Shik Chang81268602004-02-02 06:05:24 +00001406#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 case AF_BLUETOOTH:
1408 {
1409 switch (s->sock_proto) {
1410 case BTPROTO_L2CAP:
1411 {
1412 struct sockaddr_l2 *addr;
1413 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 addr = (struct sockaddr_l2 *)addr_ret;
1416 memset(addr, 0, sizeof(struct sockaddr_l2));
1417 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1418 if (!PyArg_ParseTuple(args, "si", &straddr,
1419 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001420 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 "wrong format");
1422 return 0;
1423 }
1424 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1425 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 *len_ret = sizeof *addr;
1428 return 1;
1429 }
1430 case BTPROTO_RFCOMM:
1431 {
1432 struct sockaddr_rc *addr;
1433 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 addr = (struct sockaddr_rc *)addr_ret;
1436 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1437 if (!PyArg_ParseTuple(args, "si", &straddr,
1438 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001439 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 "wrong format");
1441 return 0;
1442 }
1443 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1444 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 *len_ret = sizeof *addr;
1447 return 1;
1448 }
1449 case BTPROTO_HCI:
1450 {
1451 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001452#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001453 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001454
Alexander Belopolskye239d232010-12-08 23:31:48 +00001455 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001456 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001457 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001458 "wrong format");
1459 return 0;
1460 }
1461 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1462 return 0;
1463#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1465 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001466 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 "wrong format");
1468 return 0;
1469 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 *len_ret = sizeof *addr;
1472 return 1;
1473 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 case BTPROTO_SCO:
1476 {
1477 struct sockaddr_sco *addr;
1478 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 addr = (struct sockaddr_sco *)addr_ret;
1481 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1482 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001483 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 "wrong format");
1485 return 0;
1486 }
1487 straddr = PyBytes_AS_STRING(args);
1488 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1489 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 *len_ret = sizeof *addr;
1492 return 1;
1493 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001496 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 return 0;
1498 }
1499 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001500#endif
1501
Antoine Pitroub156a462010-10-27 20:13:57 +00001502#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 case AF_PACKET:
1504 {
1505 struct sockaddr_ll* addr;
1506 struct ifreq ifr;
1507 char *interfaceName;
1508 int protoNumber;
1509 int hatype = 0;
1510 int pkttype = 0;
1511 char *haddr = NULL;
1512 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 if (!PyTuple_Check(args)) {
1515 PyErr_Format(
1516 PyExc_TypeError,
1517 "getsockaddrarg: "
1518 "AF_PACKET address must be tuple, not %.500s",
1519 Py_TYPE(args)->tp_name);
1520 return 0;
1521 }
1522 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1523 &protoNumber, &pkttype, &hatype,
1524 &haddr, &halen))
1525 return 0;
1526 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1527 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1528 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1529 s->errorhandler();
1530 return 0;
1531 }
1532 if (halen > 8) {
1533 PyErr_SetString(PyExc_ValueError,
1534 "Hardware address must be 8 bytes or less");
1535 return 0;
1536 }
1537 if (protoNumber < 0 || protoNumber > 0xffff) {
1538 PyErr_SetString(
1539 PyExc_OverflowError,
1540 "getsockaddrarg: protoNumber must be 0-65535.");
1541 return 0;
1542 }
1543 addr = (struct sockaddr_ll*)addr_ret;
1544 addr->sll_family = AF_PACKET;
1545 addr->sll_protocol = htons((short)protoNumber);
1546 addr->sll_ifindex = ifr.ifr_ifindex;
1547 addr->sll_pkttype = pkttype;
1548 addr->sll_hatype = hatype;
1549 if (halen != 0) {
1550 memcpy(&addr->sll_addr, haddr, halen);
1551 }
1552 addr->sll_halen = halen;
1553 *len_ret = sizeof *addr;
1554 return 1;
1555 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001556#endif
1557
Christian Heimes043d6f62008-01-07 17:19:16 +00001558#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 case AF_TIPC:
1560 {
1561 unsigned int atype, v1, v2, v3;
1562 unsigned int scope = TIPC_CLUSTER_SCOPE;
1563 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 if (!PyTuple_Check(args)) {
1566 PyErr_Format(
1567 PyExc_TypeError,
1568 "getsockaddrarg: "
1569 "AF_TIPC address must be tuple, not %.500s",
1570 Py_TYPE(args)->tp_name);
1571 return 0;
1572 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 if (!PyArg_ParseTuple(args,
1575 "IIII|I;Invalid TIPC address format",
1576 &atype, &v1, &v2, &v3, &scope))
1577 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 addr = (struct sockaddr_tipc *) addr_ret;
1580 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 addr->family = AF_TIPC;
1583 addr->scope = scope;
1584 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 if (atype == TIPC_ADDR_NAMESEQ) {
1587 addr->addr.nameseq.type = v1;
1588 addr->addr.nameseq.lower = v2;
1589 addr->addr.nameseq.upper = v3;
1590 } else if (atype == TIPC_ADDR_NAME) {
1591 addr->addr.name.name.type = v1;
1592 addr->addr.name.name.instance = v2;
1593 } else if (atype == TIPC_ADDR_ID) {
1594 addr->addr.id.node = v1;
1595 addr->addr.id.ref = v2;
1596 } else {
1597 /* Shouldn't happen */
1598 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1599 return 0;
1600 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 return 1;
1605 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001606#endif
1607
Charles-François Natali30589c92011-10-07 22:47:08 +02001608#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001609 case AF_CAN:
1610 switch (s->sock_proto) {
1611 case CAN_RAW:
1612 {
1613 struct sockaddr_can *addr;
1614 PyObject *interfaceName;
1615 struct ifreq ifr;
1616 addr = (struct sockaddr_can *)addr_ret;
1617 Py_ssize_t len;
1618
1619 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1620 &interfaceName))
1621 return 0;
1622
1623 len = PyBytes_GET_SIZE(interfaceName);
1624
1625 if (len == 0) {
1626 ifr.ifr_ifindex = 0;
1627 } else if (len < sizeof(ifr.ifr_name)) {
1628 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1629 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1630 s->errorhandler();
1631 Py_DECREF(interfaceName);
1632 return 0;
1633 }
1634 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001635 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001636 "AF_CAN interface name too long");
1637 Py_DECREF(interfaceName);
1638 return 0;
1639 }
1640
1641 addr->can_family = AF_CAN;
1642 addr->can_ifindex = ifr.ifr_ifindex;
1643
1644 *len_ret = sizeof(*addr);
1645 Py_DECREF(interfaceName);
1646 return 1;
1647 }
1648 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001649 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001650 "getsockaddrarg: unsupported CAN protocol");
1651 return 0;
1652 }
1653#endif
1654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001658 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001662}
1663
Guido van Rossum30a685f1991-06-27 15:51:29 +00001664
Guido van Rossum48a680c2001-03-02 06:34:14 +00001665/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001666 Return 1 if the family is known, 0 otherwise. The length is returned
1667 through len_ret. */
1668
1669static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001670getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001673
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001674#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 case AF_UNIX:
1676 {
1677 *len_ret = sizeof (struct sockaddr_un);
1678 return 1;
1679 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001680#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001681#if defined(AF_NETLINK)
1682 case AF_NETLINK:
1683 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 *len_ret = sizeof (struct sockaddr_nl);
1685 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001686 }
1687#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 case AF_INET:
1690 {
1691 *len_ret = sizeof (struct sockaddr_in);
1692 return 1;
1693 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001694
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001695#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 case AF_INET6:
1697 {
1698 *len_ret = sizeof (struct sockaddr_in6);
1699 return 1;
1700 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001701#endif
1702
Hye-Shik Chang81268602004-02-02 06:05:24 +00001703#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 case AF_BLUETOOTH:
1705 {
1706 switch(s->sock_proto)
1707 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 case BTPROTO_L2CAP:
1710 *len_ret = sizeof (struct sockaddr_l2);
1711 return 1;
1712 case BTPROTO_RFCOMM:
1713 *len_ret = sizeof (struct sockaddr_rc);
1714 return 1;
1715 case BTPROTO_HCI:
1716 *len_ret = sizeof (struct sockaddr_hci);
1717 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001718#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 case BTPROTO_SCO:
1720 *len_ret = sizeof (struct sockaddr_sco);
1721 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001724 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 "unknown BT protocol");
1726 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 }
1729 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001730#endif
1731
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001732#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 case AF_PACKET:
1734 {
1735 *len_ret = sizeof (struct sockaddr_ll);
1736 return 1;
1737 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001738#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001739
Christian Heimes043d6f62008-01-07 17:19:16 +00001740#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 case AF_TIPC:
1742 {
1743 *len_ret = sizeof (struct sockaddr_tipc);
1744 return 1;
1745 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001746#endif
1747
Charles-François Natali30589c92011-10-07 22:47:08 +02001748#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001749 case AF_CAN:
1750 {
1751 *len_ret = sizeof (struct sockaddr_can);
1752 return 1;
1753 }
1754#endif
1755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001759 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001763}
1764
1765
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001766/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1767 Currently, these methods are only compiled if the RFC 2292/3542
1768 CMSG_LEN() macro is available. Older systems seem to have used
1769 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1770 it may be possible to define CMSG_LEN() that way if it's not
1771 provided. Some architectures might need extra padding after the
1772 cmsghdr, however, and CMSG_LEN() would have to take account of
1773 this. */
1774#ifdef CMSG_LEN
1775/* If length is in range, set *result to CMSG_LEN(length) and return
1776 true; otherwise, return false. */
1777static int
1778get_CMSG_LEN(size_t length, size_t *result)
1779{
1780 size_t tmp;
1781
1782 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1783 return 0;
1784 tmp = CMSG_LEN(length);
1785 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1786 return 0;
1787 *result = tmp;
1788 return 1;
1789}
1790
1791#ifdef CMSG_SPACE
1792/* If length is in range, set *result to CMSG_SPACE(length) and return
1793 true; otherwise, return false. */
1794static int
1795get_CMSG_SPACE(size_t length, size_t *result)
1796{
1797 size_t tmp;
1798
1799 /* Use CMSG_SPACE(1) here in order to take account of the padding
1800 necessary before *and* after the data. */
1801 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1802 return 0;
1803 tmp = CMSG_SPACE(length);
1804 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1805 return 0;
1806 *result = tmp;
1807 return 1;
1808}
1809#endif
1810
1811/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1812 pointer in msg->msg_control with at least "space" bytes after it,
1813 and its cmsg_len member inside the buffer. */
1814static int
1815cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1816{
1817 size_t cmsg_offset;
1818 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1819 sizeof(cmsgh->cmsg_len));
1820
Charles-François Natali466517d2011-08-28 18:23:43 +02001821 /* Note that POSIX allows msg_controllen to be of signed type. */
1822 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001823 return 0;
1824 if (space < cmsg_len_end)
1825 space = cmsg_len_end;
1826 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1827 return (cmsg_offset <= (size_t)-1 - space &&
1828 cmsg_offset + space <= msg->msg_controllen);
1829}
1830
1831/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1832 *space to number of bytes following it in the buffer and return
1833 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1834 msg->msg_controllen are valid. */
1835static int
1836get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1837{
1838 size_t data_offset;
1839 char *data_ptr;
1840
1841 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1842 return 0;
1843 data_offset = data_ptr - (char *)msg->msg_control;
1844 if (data_offset > msg->msg_controllen)
1845 return 0;
1846 *space = msg->msg_controllen - data_offset;
1847 return 1;
1848}
1849
1850/* If cmsgh is invalid or not contained in the buffer pointed to by
1851 msg->msg_control, return -1. If cmsgh is valid and its associated
1852 data is entirely contained in the buffer, set *data_len to the
1853 length of the associated data and return 0. If only part of the
1854 associated data is contained in the buffer but cmsgh is otherwise
1855 valid, set *data_len to the length contained in the buffer and
1856 return 1. */
1857static int
1858get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1859{
1860 size_t space, cmsg_data_len;
1861
1862 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1863 cmsgh->cmsg_len < CMSG_LEN(0))
1864 return -1;
1865 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1866 if (!get_cmsg_data_space(msg, cmsgh, &space))
1867 return -1;
1868 if (space >= cmsg_data_len) {
1869 *data_len = cmsg_data_len;
1870 return 0;
1871 }
1872 *data_len = space;
1873 return 1;
1874}
1875#endif /* CMSG_LEN */
1876
1877
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001878/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001879
Guido van Rossum73624e91994-10-10 17:59:00 +00001880static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001881sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 sock_addr_t addrbuf;
1884 SOCKET_T newfd = INVALID_SOCKET;
1885 socklen_t addrlen;
1886 PyObject *sock = NULL;
1887 PyObject *addr = NULL;
1888 PyObject *res = NULL;
1889 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 if (!getsockaddrlen(s, &addrlen))
1891 return NULL;
1892 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 if (!IS_SELECTABLE(s))
1895 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001896
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001897 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001899 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001900 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 if (timeout == 1) {
1906 PyErr_SetString(socket_timeout, "timed out");
1907 return NULL;
1908 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001909 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 if (newfd == INVALID_SOCKET)
1912 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 sock = PyLong_FromSocket_t(newfd);
1915 if (sock == NULL) {
1916 SOCKETCLOSE(newfd);
1917 goto finally;
1918 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1921 addrlen, s->sock_proto);
1922 if (addr == NULL)
1923 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001926
Guido van Rossum67f7a382002-06-06 21:08:16 +00001927finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 Py_XDECREF(sock);
1929 Py_XDECREF(addr);
1930 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001931}
1932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001933PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001934"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001935\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001936Wait for an incoming connection. Return a new socket file descriptor\n\
1937representing the connection, and the address of the client.\n\
1938For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001939
Guido van Rossum11ba0942002-06-13 15:07:44 +00001940/* s.setblocking(flag) method. Argument:
1941 False -- non-blocking mode; same as settimeout(0)
1942 True -- blocking mode; same as settimeout(None)
1943*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001944
Guido van Rossum73624e91994-10-10 17:59:00 +00001945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001946sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 block = PyLong_AsLong(arg);
1951 if (block == -1 && PyErr_Occurred())
1952 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 s->sock_timeout = block ? -1.0 : 0.0;
1955 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 Py_INCREF(Py_None);
1958 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001959}
Guido van Rossume4485b01994-09-07 14:32:49 +00001960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001961PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962"setblocking(flag)\n\
1963\n\
1964Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001965setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001966setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001967
Guido van Rossum11ba0942002-06-13 15:07:44 +00001968/* s.settimeout(timeout) method. Argument:
1969 None -- no timeout, blocking mode; same as setblocking(True)
1970 0.0 -- non-blocking mode; same as setblocking(False)
1971 > 0 -- timeout mode; operations time out after timeout seconds
1972 < 0 -- illegal; raises an exception
1973*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001974static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001975sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 if (arg == Py_None)
1980 timeout = -1.0;
1981 else {
1982 timeout = PyFloat_AsDouble(arg);
1983 if (timeout < 0.0) {
1984 if (!PyErr_Occurred())
1985 PyErr_SetString(PyExc_ValueError,
1986 "Timeout value out of range");
1987 return NULL;
1988 }
1989 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 s->sock_timeout = timeout;
1992 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 Py_INCREF(Py_None);
1995 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001996}
1997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001998PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001999"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002000\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002001Set a timeout on socket operations. 'timeout' can be a float,\n\
2002giving in seconds, or None. Setting a timeout of None disables\n\
2003the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002004Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002005
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002006/* s.gettimeout() method.
2007 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002008static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002009sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 if (s->sock_timeout < 0.0) {
2012 Py_INCREF(Py_None);
2013 return Py_None;
2014 }
2015 else
2016 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002017}
2018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002019PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002020"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002021\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002022Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002023operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002024operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002025
Guido van Rossumaee08791992-09-08 09:05:33 +00002026/* s.setsockopt() method.
2027 With an integer third argument, sets an integer option.
2028 With a string third argument, sets an option from a buffer;
2029 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002030
Guido van Rossum73624e91994-10-10 17:59:00 +00002031static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002032sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 int level;
2035 int optname;
2036 int res;
2037 char *buf;
2038 int buflen;
2039 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 if (PyArg_ParseTuple(args, "iii:setsockopt",
2042 &level, &optname, &flag)) {
2043 buf = (char *) &flag;
2044 buflen = sizeof flag;
2045 }
2046 else {
2047 PyErr_Clear();
2048 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2049 &level, &optname, &buf, &buflen))
2050 return NULL;
2051 }
2052 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2053 if (res < 0)
2054 return s->errorhandler();
2055 Py_INCREF(Py_None);
2056 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002057}
2058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002059PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002060"setsockopt(level, option, value)\n\
2061\n\
2062Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002063The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002064
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002065
Guido van Rossumaee08791992-09-08 09:05:33 +00002066/* s.getsockopt() method.
2067 With two arguments, retrieves an integer option.
2068 With a third integer argument, retrieves a string buffer of that size;
2069 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002070
Guido van Rossum73624e91994-10-10 17:59:00 +00002071static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002072sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 int level;
2075 int optname;
2076 int res;
2077 PyObject *buf;
2078 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2081 &level, &optname, &buflen))
2082 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 if (buflen == 0) {
2085 int flag = 0;
2086 socklen_t flagsize = sizeof flag;
2087 res = getsockopt(s->sock_fd, level, optname,
2088 (void *)&flag, &flagsize);
2089 if (res < 0)
2090 return s->errorhandler();
2091 return PyLong_FromLong(flag);
2092 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002093#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 /* socklen_t is unsigned so no negative test is needed,
2095 test buflen == 0 is previously done */
2096 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002097#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002099#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002100 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 "getsockopt buflen out of range");
2102 return NULL;
2103 }
2104 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2105 if (buf == NULL)
2106 return NULL;
2107 res = getsockopt(s->sock_fd, level, optname,
2108 (void *)PyBytes_AS_STRING(buf), &buflen);
2109 if (res < 0) {
2110 Py_DECREF(buf);
2111 return s->errorhandler();
2112 }
2113 _PyBytes_Resize(&buf, buflen);
2114 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002115}
2116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002117PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002118"getsockopt(level, option[, buffersize]) -> value\n\
2119\n\
2120Get a socket option. See the Unix manual for level and option.\n\
2121If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002123
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002124
Fred Drake728819a2000-07-01 03:40:12 +00002125/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002126
Guido van Rossum73624e91994-10-10 17:59:00 +00002127static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002128sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 sock_addr_t addrbuf;
2131 int addrlen;
2132 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2135 return NULL;
2136 Py_BEGIN_ALLOW_THREADS
2137 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2138 Py_END_ALLOW_THREADS
2139 if (res < 0)
2140 return s->errorhandler();
2141 Py_INCREF(Py_None);
2142 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002143}
2144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002145PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002146"bind(address)\n\
2147\n\
2148Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002149pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002150sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002151
Guido van Rossum30a685f1991-06-27 15:51:29 +00002152
2153/* s.close() method.
2154 Set the file descriptor to -1 so operations tried subsequently
2155 will surely fail. */
2156
Guido van Rossum73624e91994-10-10 17:59:00 +00002157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002158sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 if ((fd = s->sock_fd) != -1) {
2163 s->sock_fd = -1;
2164 Py_BEGIN_ALLOW_THREADS
2165 (void) SOCKETCLOSE(fd);
2166 Py_END_ALLOW_THREADS
2167 }
2168 Py_INCREF(Py_None);
2169 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002170}
2171
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002172PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002173"close()\n\
2174\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002175Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002176
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002177static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002178sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002179{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002180 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002181 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002182 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002183}
2184
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002185PyDoc_STRVAR(detach_doc,
2186"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002187\n\
2188Close the socket object without closing the underlying file descriptor.\
2189The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002190can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002191
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002192static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002193internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 timeout = 0;
2199 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002200
2201#ifdef MS_WINDOWS
2202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 if (s->sock_timeout > 0.0) {
2204 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2205 IS_SELECTABLE(s)) {
2206 /* This is a mess. Best solution: trust select */
2207 fd_set fds;
2208 fd_set fds_exc;
2209 struct timeval tv;
2210 tv.tv_sec = (int)s->sock_timeout;
2211 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2212 FD_ZERO(&fds);
2213 FD_SET(s->sock_fd, &fds);
2214 FD_ZERO(&fds_exc);
2215 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002216 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2217 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 if (res == 0) {
2219 res = WSAEWOULDBLOCK;
2220 timeout = 1;
2221 } else if (res > 0) {
2222 if (FD_ISSET(s->sock_fd, &fds))
2223 /* The socket is in the writable set - this
2224 means connected */
2225 res = 0;
2226 else {
2227 /* As per MS docs, we need to call getsockopt()
2228 to get the underlying error */
2229 int res_size = sizeof res;
2230 /* It must be in the exception set */
2231 assert(FD_ISSET(s->sock_fd, &fds_exc));
2232 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2233 (char *)&res, &res_size))
2234 /* getsockopt also clears WSAGetLastError,
2235 so reset it back. */
2236 WSASetLastError(res);
2237 else
2238 res = WSAGetLastError();
2239 }
2240 }
2241 /* else if (res < 0) an error occurred */
2242 }
2243 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 if (res < 0)
2246 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002247
2248#else
2249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 if (s->sock_timeout > 0.0) {
2251 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2252 timeout = internal_select(s, 1);
2253 if (timeout == 0) {
2254 /* Bug #1019808: in case of an EINPROGRESS,
2255 use getsockopt(SO_ERROR) to get the real
2256 error. */
2257 socklen_t res_size = sizeof res;
2258 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2259 SO_ERROR, &res, &res_size);
2260 if (res == EISCONN)
2261 res = 0;
2262 errno = res;
2263 }
2264 else if (timeout == -1) {
2265 res = errno; /* had error */
2266 }
2267 else
2268 res = EWOULDBLOCK; /* timed out */
2269 }
2270 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 if (res < 0)
2273 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002274
2275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002279}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002280
Fred Drake728819a2000-07-01 03:40:12 +00002281/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002282
Guido van Rossum73624e91994-10-10 17:59:00 +00002283static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002284sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 sock_addr_t addrbuf;
2287 int addrlen;
2288 int res;
2289 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2292 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 Py_BEGIN_ALLOW_THREADS
2295 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2296 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 if (timeout == 1) {
2299 PyErr_SetString(socket_timeout, "timed out");
2300 return NULL;
2301 }
2302 if (res != 0)
2303 return s->errorhandler();
2304 Py_INCREF(Py_None);
2305 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002306}
2307
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002308PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002309"connect(address)\n\
2310\n\
2311Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002312is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313
Guido van Rossum30a685f1991-06-27 15:51:29 +00002314
Fred Drake728819a2000-07-01 03:40:12 +00002315/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002316
2317static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002318sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 sock_addr_t addrbuf;
2321 int addrlen;
2322 int res;
2323 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2326 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 Py_BEGIN_ALLOW_THREADS
2329 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2330 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 /* Signals are not errors (though they may raise exceptions). Adapted
2333 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002334#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 if (res == EINTR && PyErr_CheckSignals())
2336 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002337#endif
2338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002340}
2341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002342PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002343"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344\n\
2345This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002348
Guido van Rossumed233a51992-06-23 09:07:03 +00002349/* s.fileno() method */
2350
Guido van Rossum73624e91994-10-10 17:59:00 +00002351static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002352sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002355}
2356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002357PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002358"fileno() -> integer\n\
2359\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002360Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002361
Guido van Rossumed233a51992-06-23 09:07:03 +00002362
Guido van Rossumc89705d1992-11-26 08:54:07 +00002363/* s.getsockname() method */
2364
Guido van Rossum73624e91994-10-10 17:59:00 +00002365static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002366sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 sock_addr_t addrbuf;
2369 int res;
2370 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (!getsockaddrlen(s, &addrlen))
2373 return NULL;
2374 memset(&addrbuf, 0, addrlen);
2375 Py_BEGIN_ALLOW_THREADS
2376 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2377 Py_END_ALLOW_THREADS
2378 if (res < 0)
2379 return s->errorhandler();
2380 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2381 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002382}
2383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002384PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002385"getsockname() -> address info\n\
2386\n\
2387Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002388info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002389
Guido van Rossumc89705d1992-11-26 08:54:07 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002392/* s.getpeername() method */
2393
Guido van Rossum73624e91994-10-10 17:59:00 +00002394static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 sock_addr_t addrbuf;
2398 int res;
2399 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 if (!getsockaddrlen(s, &addrlen))
2402 return NULL;
2403 memset(&addrbuf, 0, addrlen);
2404 Py_BEGIN_ALLOW_THREADS
2405 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2406 Py_END_ALLOW_THREADS
2407 if (res < 0)
2408 return s->errorhandler();
2409 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2410 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002411}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002412
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002414"getpeername() -> address info\n\
2415\n\
2416Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002417info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002418
Guido van Rossumb6775db1994-08-01 11:34:53 +00002419#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002420
2421
Guido van Rossum30a685f1991-06-27 15:51:29 +00002422/* s.listen(n) method */
2423
Guido van Rossum73624e91994-10-10 17:59:00 +00002424static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002425sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 int backlog;
2428 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 backlog = PyLong_AsLong(arg);
2431 if (backlog == -1 && PyErr_Occurred())
2432 return NULL;
2433 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002434 /* To avoid problems on systems that don't allow a negative backlog
2435 * (which doesn't make sense anyway) we force a minimum value of 0. */
2436 if (backlog < 0)
2437 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 res = listen(s->sock_fd, backlog);
2439 Py_END_ALLOW_THREADS
2440 if (res < 0)
2441 return s->errorhandler();
2442 Py_INCREF(Py_None);
2443 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002444}
2445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002446PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002447"listen(backlog)\n\
2448\n\
2449Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002450least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2451unaccepted connections that the system will allow before refusing new\n\
2452connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002453
2454
Thomas Wouters477c8d52006-05-27 19:21:47 +00002455/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002456 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002457 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002458 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002459 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002460 * also possible that we return a number of bytes smaller than the request
2461 * bytes.
2462 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002463
Antoine Pitrou19467d22010-08-17 19:33:30 +00002464static Py_ssize_t
2465sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002466{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002467 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002469#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 int remaining;
2471 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002472#endif
2473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 if (!IS_SELECTABLE(s)) {
2475 select_error();
2476 return -1;
2477 }
2478 if (len == 0) {
2479 /* If 0 bytes were requested, do nothing. */
2480 return 0;
2481 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002482
2483#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002484 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002486 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 if (!timeout)
2488 outlen = recv(s->sock_fd, cbuf, len, flags);
2489 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 if (timeout == 1) {
2492 PyErr_SetString(socket_timeout, "timed out");
2493 return -1;
2494 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002495 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 if (outlen < 0) {
2497 /* Note: the call to errorhandler() ALWAYS indirectly returned
2498 NULL, so ignore its return value */
2499 s->errorhandler();
2500 return -1;
2501 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002502#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 read_buf = cbuf;
2504 remaining = len;
2505 while (remaining != 0) {
2506 unsigned int segment;
2507 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 segment = remaining /SEGMENT_SIZE;
2510 if (segment != 0) {
2511 segment = SEGMENT_SIZE;
2512 }
2513 else {
2514 segment = remaining;
2515 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002516
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002517 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002519 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (!timeout)
2521 nread = recv(s->sock_fd, read_buf, segment, flags);
2522 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 if (timeout == 1) {
2524 PyErr_SetString(socket_timeout, "timed out");
2525 return -1;
2526 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002527 END_SELECT_LOOP(s)
2528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 if (nread < 0) {
2530 s->errorhandler();
2531 return -1;
2532 }
2533 if (nread != remaining) {
2534 read_buf += nread;
2535 break;
2536 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 remaining -= segment;
2539 read_buf += segment;
2540 }
2541 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002542#endif /* !__VMS */
2543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002545}
2546
Guido van Rossum48a680c2001-03-02 06:34:14 +00002547
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002548/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002549
Guido van Rossum73624e91994-10-10 17:59:00 +00002550static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002551sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002552{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002553 Py_ssize_t recvlen, outlen;
2554 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002556
Antoine Pitrou19467d22010-08-17 19:33:30 +00002557 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 if (recvlen < 0) {
2561 PyErr_SetString(PyExc_ValueError,
2562 "negative buffersize in recv");
2563 return NULL;
2564 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 /* Allocate a new string. */
2567 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2568 if (buf == NULL)
2569 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 /* Call the guts */
2572 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2573 if (outlen < 0) {
2574 /* An error occurred, release the string and return an
2575 error. */
2576 Py_DECREF(buf);
2577 return NULL;
2578 }
2579 if (outlen != recvlen) {
2580 /* We did not read as many bytes as we anticipated, resize the
2581 string if possible and be successful. */
2582 _PyBytes_Resize(&buf, outlen);
2583 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002586}
2587
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002589"recv(buffersize[, flags]) -> data\n\
2590\n\
2591Receive up to buffersize bytes from the socket. For the optional flags\n\
2592argument, see the Unix manual. When no data is available, block until\n\
2593at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002594the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002595
Guido van Rossum30a685f1991-06-27 15:51:29 +00002596
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002597/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002598
Thomas Wouters477c8d52006-05-27 19:21:47 +00002599static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002600sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002603
Antoine Pitrou19467d22010-08-17 19:33:30 +00002604 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 Py_buffer pbuf;
2606 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002607 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002610 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 &pbuf, &recvlen, &flags))
2612 return NULL;
2613 buf = pbuf.buf;
2614 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 if (recvlen < 0) {
2617 PyBuffer_Release(&pbuf);
2618 PyErr_SetString(PyExc_ValueError,
2619 "negative buffersize in recv_into");
2620 return NULL;
2621 }
2622 if (recvlen == 0) {
2623 /* If nbytes was not specified, use the buffer's length */
2624 recvlen = buflen;
2625 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 /* Check if the buffer is large enough */
2628 if (buflen < recvlen) {
2629 PyBuffer_Release(&pbuf);
2630 PyErr_SetString(PyExc_ValueError,
2631 "buffer too small for requested bytes");
2632 return NULL;
2633 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 /* Call the guts */
2636 readlen = sock_recv_guts(s, buf, recvlen, flags);
2637 if (readlen < 0) {
2638 /* Return an error. */
2639 PyBuffer_Release(&pbuf);
2640 return NULL;
2641 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 PyBuffer_Release(&pbuf);
2644 /* Return the number of bytes read. Note that we do not do anything
2645 special here in the case that readlen < recvlen. */
2646 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002647}
2648
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002649PyDoc_STRVAR(recv_into_doc,
2650"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002651\n\
2652A version of recv() that stores its data into a buffer rather than creating \n\
2653a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2654is not specified (or 0), receive up to the size available in the given buffer.\n\
2655\n\
2656See recv() for documentation about the flags.");
2657
2658
2659/*
Christian Heimes99170a52007-12-19 02:07:34 +00002660 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2661 * into a char buffer. If you have any inc/def ref to do to the objects that
2662 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002663 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002664 * that it is also possible that we return a number of bytes smaller than the
2665 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002666 *
2667 * 'addr' is a return value for the address object. Note that you must decref
2668 * it yourself.
2669 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002670static Py_ssize_t
2671sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 sock_addr_t addrbuf;
2675 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002676 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 if (!getsockaddrlen(s, &addrlen))
2682 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 if (!IS_SELECTABLE(s)) {
2685 select_error();
2686 return -1;
2687 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002688
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002689 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 Py_BEGIN_ALLOW_THREADS
2691 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002692 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002694#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002695#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 n = recvfrom(s->sock_fd, cbuf, len, flags,
2697 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 n = recvfrom(s->sock_fd, cbuf, len, flags,
2700 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002701#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002702#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 n = recvfrom(s->sock_fd, cbuf, len, flags,
2704 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 }
2707 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 if (timeout == 1) {
2710 PyErr_SetString(socket_timeout, "timed out");
2711 return -1;
2712 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002713 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 if (n < 0) {
2715 s->errorhandler();
2716 return -1;
2717 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2720 addrlen, s->sock_proto)))
2721 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002724}
2725
2726/* s.recvfrom(nbytes [,flags]) method */
2727
2728static PyObject *
2729sock_recvfrom(PySocketSockObject *s, PyObject *args)
2730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 PyObject *buf = NULL;
2732 PyObject *addr = NULL;
2733 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002734 int flags = 0;
2735 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002736
Antoine Pitrou19467d22010-08-17 19:33:30 +00002737 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 if (recvlen < 0) {
2741 PyErr_SetString(PyExc_ValueError,
2742 "negative buffersize in recvfrom");
2743 return NULL;
2744 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2747 if (buf == NULL)
2748 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2751 recvlen, flags, &addr);
2752 if (outlen < 0) {
2753 goto finally;
2754 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 if (outlen != recvlen) {
2757 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002758 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002760 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 goto finally;
2762 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002765
2766finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 Py_XDECREF(buf);
2768 Py_XDECREF(addr);
2769 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002770}
2771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002772PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002773"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2774\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002775Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002776
Thomas Wouters477c8d52006-05-27 19:21:47 +00002777
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002778/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002779
2780static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002781sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002782{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002784
Antoine Pitrou19467d22010-08-17 19:33:30 +00002785 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 Py_buffer pbuf;
2787 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002788 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002791
Antoine Pitrou19467d22010-08-17 19:33:30 +00002792 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 kwlist, &pbuf,
2794 &recvlen, &flags))
2795 return NULL;
2796 buf = pbuf.buf;
2797 buflen = pbuf.len;
2798 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 if (recvlen < 0) {
2801 PyBuffer_Release(&pbuf);
2802 PyErr_SetString(PyExc_ValueError,
2803 "negative buffersize in recvfrom_into");
2804 return NULL;
2805 }
2806 if (recvlen == 0) {
2807 /* If nbytes was not specified, use the buffer's length */
2808 recvlen = buflen;
2809 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2812 if (readlen < 0) {
2813 PyBuffer_Release(&pbuf);
2814 /* Return an error */
2815 Py_XDECREF(addr);
2816 return NULL;
2817 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 PyBuffer_Release(&pbuf);
2820 /* Return the number of bytes read and the address. Note that we do
2821 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002822 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002823}
2824
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002825PyDoc_STRVAR(recvfrom_into_doc,
2826"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002827\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002828Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002829
2830
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002831/* The sendmsg() and recvmsg[_into]() methods require a working
2832 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2833#ifdef CMSG_LEN
2834/*
2835 * Call recvmsg() with the supplied iovec structures, flags, and
2836 * ancillary data buffer size (controllen). Returns the tuple return
2837 * value for recvmsg() or recvmsg_into(), with the first item provided
2838 * by the supplied makeval() function. makeval() will be called with
2839 * the length read and makeval_data as arguments, and must return a
2840 * new reference (which will be decrefed if there is a subsequent
2841 * error). On error, closes any file descriptors received via
2842 * SCM_RIGHTS.
2843 */
2844static PyObject *
2845sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2846 int flags, Py_ssize_t controllen,
2847 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2848{
2849 ssize_t bytes_received = -1;
2850 int timeout;
2851 sock_addr_t addrbuf;
2852 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002853 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002854 PyObject *cmsg_list = NULL, *retval = NULL;
2855 void *controlbuf = NULL;
2856 struct cmsghdr *cmsgh;
2857 size_t cmsgdatalen = 0;
2858 int cmsg_status;
2859
2860 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2861 ignored" when the socket is connected (Linux fills them in
2862 anyway for AF_UNIX sockets at least). Normally msg_namelen
2863 seems to be set to 0 if there's no address, but try to
2864 initialize msg_name to something that won't be mistaken for a
2865 real address if that doesn't happen. */
2866 if (!getsockaddrlen(s, &addrbuflen))
2867 return NULL;
2868 memset(&addrbuf, 0, addrbuflen);
2869 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2870
2871 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2872 PyErr_SetString(PyExc_ValueError,
2873 "invalid ancillary data buffer length");
2874 return NULL;
2875 }
2876 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2877 return PyErr_NoMemory();
2878
2879 /* Make the system call. */
2880 if (!IS_SELECTABLE(s)) {
2881 select_error();
2882 goto finally;
2883 }
2884
2885 BEGIN_SELECT_LOOP(s)
2886 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002887 msg.msg_name = SAS2SA(&addrbuf);
2888 msg.msg_namelen = addrbuflen;
2889 msg.msg_iov = iov;
2890 msg.msg_iovlen = iovlen;
2891 msg.msg_control = controlbuf;
2892 msg.msg_controllen = controllen;
2893 timeout = internal_select_ex(s, 0, interval);
2894 if (!timeout)
2895 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2896 Py_END_ALLOW_THREADS;
2897 if (timeout == 1) {
2898 PyErr_SetString(socket_timeout, "timed out");
2899 goto finally;
2900 }
2901 END_SELECT_LOOP(s)
2902
2903 if (bytes_received < 0) {
2904 s->errorhandler();
2905 goto finally;
2906 }
2907
2908 /* Make list of (level, type, data) tuples from control messages. */
2909 if ((cmsg_list = PyList_New(0)) == NULL)
2910 goto err_closefds;
2911 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2912 implementations didn't do so. */
2913 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2914 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2915 PyObject *bytes, *tuple;
2916 int tmp;
2917
2918 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2919 if (cmsg_status != 0) {
2920 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2921 "received malformed or improperly-truncated "
2922 "ancillary data", 1) == -1)
2923 goto err_closefds;
2924 }
2925 if (cmsg_status < 0)
2926 break;
2927 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002928 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002929 goto err_closefds;
2930 }
2931
2932 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2933 cmsgdatalen);
2934 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2935 (int)cmsgh->cmsg_type, bytes);
2936 if (tuple == NULL)
2937 goto err_closefds;
2938 tmp = PyList_Append(cmsg_list, tuple);
2939 Py_DECREF(tuple);
2940 if (tmp != 0)
2941 goto err_closefds;
2942
2943 if (cmsg_status != 0)
2944 break;
2945 }
2946
2947 retval = Py_BuildValue("NOiN",
2948 (*makeval)(bytes_received, makeval_data),
2949 cmsg_list,
2950 (int)msg.msg_flags,
2951 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2952 ((msg.msg_namelen > addrbuflen) ?
2953 addrbuflen : msg.msg_namelen),
2954 s->sock_proto));
2955 if (retval == NULL)
2956 goto err_closefds;
2957
2958finally:
2959 Py_XDECREF(cmsg_list);
2960 PyMem_Free(controlbuf);
2961 return retval;
2962
2963err_closefds:
2964#ifdef SCM_RIGHTS
2965 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2966 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2967 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2968 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2969 if (cmsg_status < 0)
2970 break;
2971 if (cmsgh->cmsg_level == SOL_SOCKET &&
2972 cmsgh->cmsg_type == SCM_RIGHTS) {
2973 size_t numfds;
2974 int *fdp;
2975
2976 numfds = cmsgdatalen / sizeof(int);
2977 fdp = (int *)CMSG_DATA(cmsgh);
2978 while (numfds-- > 0)
2979 close(*fdp++);
2980 }
2981 if (cmsg_status != 0)
2982 break;
2983 }
2984#endif /* SCM_RIGHTS */
2985 goto finally;
2986}
2987
2988
2989static PyObject *
2990makeval_recvmsg(ssize_t received, void *data)
2991{
2992 PyObject **buf = data;
2993
2994 if (received < PyBytes_GET_SIZE(*buf))
2995 _PyBytes_Resize(buf, received);
2996 Py_XINCREF(*buf);
2997 return *buf;
2998}
2999
3000/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3001
3002static PyObject *
3003sock_recvmsg(PySocketSockObject *s, PyObject *args)
3004{
3005 Py_ssize_t bufsize, ancbufsize = 0;
3006 int flags = 0;
3007 struct iovec iov;
3008 PyObject *buf = NULL, *retval = NULL;
3009
3010 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3011 return NULL;
3012
3013 if (bufsize < 0) {
3014 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3015 return NULL;
3016 }
3017 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3018 return NULL;
3019 iov.iov_base = PyBytes_AS_STRING(buf);
3020 iov.iov_len = bufsize;
3021
3022 /* Note that we're passing a pointer to *our pointer* to the bytes
3023 object here (&buf); makeval_recvmsg() may incref the object, or
3024 deallocate it and set our pointer to NULL. */
3025 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3026 &makeval_recvmsg, &buf);
3027 Py_XDECREF(buf);
3028 return retval;
3029}
3030
3031PyDoc_STRVAR(recvmsg_doc,
3032"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3033\n\
3034Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3035socket. The ancbufsize argument sets the size in bytes of the\n\
3036internal buffer used to receive the ancillary data; it defaults to 0,\n\
3037meaning that no ancillary data will be received. Appropriate buffer\n\
3038sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3039CMSG_LEN(), and items which do not fit into the buffer might be\n\
3040truncated or discarded. The flags argument defaults to 0 and has the\n\
3041same meaning as for recv().\n\
3042\n\
3043The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3044The data item is a bytes object holding the non-ancillary data\n\
3045received. The ancdata item is a list of zero or more tuples\n\
3046(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3047(control messages) received: cmsg_level and cmsg_type are integers\n\
3048specifying the protocol level and protocol-specific type respectively,\n\
3049and cmsg_data is a bytes object holding the associated data. The\n\
3050msg_flags item is the bitwise OR of various flags indicating\n\
3051conditions on the received message; see your system documentation for\n\
3052details. If the receiving socket is unconnected, address is the\n\
3053address of the sending socket, if available; otherwise, its value is\n\
3054unspecified.\n\
3055\n\
3056If recvmsg() raises an exception after the system call returns, it\n\
3057will first attempt to close any file descriptors received via the\n\
3058SCM_RIGHTS mechanism.");
3059
3060
3061static PyObject *
3062makeval_recvmsg_into(ssize_t received, void *data)
3063{
3064 return PyLong_FromSsize_t(received);
3065}
3066
3067/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3068
3069static PyObject *
3070sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3071{
3072 Py_ssize_t ancbufsize = 0;
3073 int flags = 0;
3074 struct iovec *iovs = NULL;
3075 Py_ssize_t i, nitems, nbufs = 0;
3076 Py_buffer *bufs = NULL;
3077 PyObject *buffers_arg, *fast, *retval = NULL;
3078
3079 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3080 &buffers_arg, &ancbufsize, &flags))
3081 return NULL;
3082
3083 if ((fast = PySequence_Fast(buffers_arg,
3084 "recvmsg_into() argument 1 must be an "
3085 "iterable")) == NULL)
3086 return NULL;
3087 nitems = PySequence_Fast_GET_SIZE(fast);
3088 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003089 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003090 goto finally;
3091 }
3092
3093 /* Fill in an iovec for each item, and save the Py_buffer
3094 structs to release afterwards. */
3095 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3096 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3097 PyErr_NoMemory();
3098 goto finally;
3099 }
3100 for (; nbufs < nitems; nbufs++) {
3101 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3102 "w*;recvmsg_into() argument 1 must be an iterable "
3103 "of single-segment read-write buffers",
3104 &bufs[nbufs]))
3105 goto finally;
3106 iovs[nbufs].iov_base = bufs[nbufs].buf;
3107 iovs[nbufs].iov_len = bufs[nbufs].len;
3108 }
3109
3110 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3111 &makeval_recvmsg_into, NULL);
3112finally:
3113 for (i = 0; i < nbufs; i++)
3114 PyBuffer_Release(&bufs[i]);
3115 PyMem_Free(bufs);
3116 PyMem_Free(iovs);
3117 Py_DECREF(fast);
3118 return retval;
3119}
3120
3121PyDoc_STRVAR(recvmsg_into_doc,
3122"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3123\n\
3124Receive normal data and ancillary data from the socket, scattering the\n\
3125non-ancillary data into a series of buffers. The buffers argument\n\
3126must be an iterable of objects that export writable buffers\n\
3127(e.g. bytearray objects); these will be filled with successive chunks\n\
3128of the non-ancillary data until it has all been written or there are\n\
3129no more buffers. The ancbufsize argument sets the size in bytes of\n\
3130the internal buffer used to receive the ancillary data; it defaults to\n\
31310, meaning that no ancillary data will be received. Appropriate\n\
3132buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3133or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3134truncated or discarded. The flags argument defaults to 0 and has the\n\
3135same meaning as for recv().\n\
3136\n\
3137The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3138The nbytes item is the total number of bytes of non-ancillary data\n\
3139written into the buffers. The ancdata item is a list of zero or more\n\
3140tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3141data (control messages) received: cmsg_level and cmsg_type are\n\
3142integers specifying the protocol level and protocol-specific type\n\
3143respectively, and cmsg_data is a bytes object holding the associated\n\
3144data. The msg_flags item is the bitwise OR of various flags\n\
3145indicating conditions on the received message; see your system\n\
3146documentation for details. If the receiving socket is unconnected,\n\
3147address is the address of the sending socket, if available; otherwise,\n\
3148its value is unspecified.\n\
3149\n\
3150If recvmsg_into() raises an exception after the system call returns,\n\
3151it will first attempt to close any file descriptors received via the\n\
3152SCM_RIGHTS mechanism.");
3153#endif /* CMSG_LEN */
3154
3155
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003156/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003157
Guido van Rossum73624e91994-10-10 17:59:00 +00003158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003159sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003162 Py_ssize_t len, n = -1;
3163 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3167 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 if (!IS_SELECTABLE(s)) {
3170 PyBuffer_Release(&pbuf);
3171 return select_error();
3172 }
3173 buf = pbuf.buf;
3174 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003175
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003176 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003178 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003180#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003182#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003187 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 PyErr_SetString(socket_timeout, "timed out");
3189 return NULL;
3190 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003191 END_SELECT_LOOP(s)
3192
3193 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 if (n < 0)
3195 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003196 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003197}
3198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003199PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003200"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003201\n\
3202Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003203argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003204sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003205
3206
3207/* s.sendall(data [,flags]) method */
3208
3209static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003210sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003213 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003214 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3218 return NULL;
3219 buf = pbuf.buf;
3220 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 if (!IS_SELECTABLE(s)) {
3223 PyBuffer_Release(&pbuf);
3224 return select_error();
3225 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003228 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 timeout = internal_select(s, 1);
3230 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003231 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003232#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003233 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003234#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003235 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003236#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003237 }
3238 Py_END_ALLOW_THREADS
3239 if (timeout == 1) {
3240 PyBuffer_Release(&pbuf);
3241 PyErr_SetString(socket_timeout, "timed out");
3242 return NULL;
3243 }
3244 /* PyErr_CheckSignals() might change errno */
3245 saved_errno = errno;
3246 /* We must run our signal handlers before looping again.
3247 send() can return a successful partial write when it is
3248 interrupted, so we can't restrict ourselves to EINTR. */
3249 if (PyErr_CheckSignals()) {
3250 PyBuffer_Release(&pbuf);
3251 return NULL;
3252 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003254 /* If interrupted, try again */
3255 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003257 else
3258 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 }
3260 buf += n;
3261 len -= n;
3262 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 if (n < 0)
3266 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 Py_INCREF(Py_None);
3269 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003270}
3271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003272PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003273"sendall(data[, flags])\n\
3274\n\
3275Send a data string to the socket. For the optional flags\n\
3276argument, see the Unix manual. This calls send() repeatedly\n\
3277until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003278to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003279
Guido van Rossum30a685f1991-06-27 15:51:29 +00003280
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003281/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003282
Guido van Rossum73624e91994-10-10 17:59:00 +00003283static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003284sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 Py_buffer pbuf;
3287 PyObject *addro;
3288 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003289 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 sock_addr_t addrbuf;
3291 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003294 arglen = PyTuple_Size(args);
3295 switch (arglen) {
3296 case 2:
3297 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3298 break;
3299 case 3:
3300 PyArg_ParseTuple(args, "y*iO:sendto",
3301 &pbuf, &flags, &addro);
3302 break;
3303 default:
3304 PyErr_Format(PyExc_TypeError,
3305 "sendto() takes 2 or 3 arguments (%d given)",
3306 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003307 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003309 if (PyErr_Occurred())
3310 return NULL;
3311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 buf = pbuf.buf;
3313 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 if (!IS_SELECTABLE(s)) {
3316 PyBuffer_Release(&pbuf);
3317 return select_error();
3318 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3321 PyBuffer_Release(&pbuf);
3322 return NULL;
3323 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003324
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003325 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003326 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003327 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 if (!timeout)
3329 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3330 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003333 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 PyErr_SetString(socket_timeout, "timed out");
3335 return NULL;
3336 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003337 END_SELECT_LOOP(s)
3338 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 if (n < 0)
3340 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003341 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003342}
3343
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003344PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003345"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003346\n\
3347Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003348For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003349
Guido van Rossum30a685f1991-06-27 15:51:29 +00003350
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003351/* The sendmsg() and recvmsg[_into]() methods require a working
3352 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3353#ifdef CMSG_LEN
3354/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3355
3356static PyObject *
3357sock_sendmsg(PySocketSockObject *s, PyObject *args)
3358{
3359 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3360 Py_buffer *databufs = NULL;
3361 struct iovec *iovs = NULL;
3362 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003363 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003364 struct cmsginfo {
3365 int level;
3366 int type;
3367 Py_buffer data;
3368 } *cmsgs = NULL;
3369 void *controlbuf = NULL;
3370 size_t controllen, controllen_last;
3371 ssize_t bytes_sent = -1;
3372 int addrlen, timeout, flags = 0;
3373 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3374 *cmsg_fast = NULL, *retval = NULL;
3375
3376 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3377 &data_arg, &cmsg_arg, &flags, &addr_arg))
3378 return NULL;
3379
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003380 /* Parse destination address. */
3381 if (addr_arg != NULL && addr_arg != Py_None) {
3382 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3383 goto finally;
3384 msg.msg_name = &addrbuf;
3385 msg.msg_namelen = addrlen;
3386 }
3387
3388 /* Fill in an iovec for each message part, and save the Py_buffer
3389 structs to release afterwards. */
3390 if ((data_fast = PySequence_Fast(data_arg,
3391 "sendmsg() argument 1 must be an "
3392 "iterable")) == NULL)
3393 goto finally;
3394 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3395 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003396 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003397 goto finally;
3398 }
3399 msg.msg_iovlen = ndataparts;
3400 if (ndataparts > 0 &&
3401 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3402 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3403 PyErr_NoMemory();
3404 goto finally;
3405 }
3406 for (; ndatabufs < ndataparts; ndatabufs++) {
3407 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3408 "y*;sendmsg() argument 1 must be an iterable of "
3409 "buffer-compatible objects",
3410 &databufs[ndatabufs]))
3411 goto finally;
3412 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3413 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3414 }
3415
3416 if (cmsg_arg == NULL)
3417 ncmsgs = 0;
3418 else {
3419 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3420 "sendmsg() argument 2 must be an "
3421 "iterable")) == NULL)
3422 goto finally;
3423 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3424 }
3425
3426#ifndef CMSG_SPACE
3427 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003428 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003429 "sending multiple control messages is not supported "
3430 "on this system");
3431 goto finally;
3432 }
3433#endif
3434 /* Save level, type and Py_buffer for each control message,
3435 and calculate total size. */
3436 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3437 PyErr_NoMemory();
3438 goto finally;
3439 }
3440 controllen = controllen_last = 0;
3441 while (ncmsgbufs < ncmsgs) {
3442 size_t bufsize, space;
3443
3444 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3445 "(iiy*):[sendmsg() ancillary data items]",
3446 &cmsgs[ncmsgbufs].level,
3447 &cmsgs[ncmsgbufs].type,
3448 &cmsgs[ncmsgbufs].data))
3449 goto finally;
3450 bufsize = cmsgs[ncmsgbufs++].data.len;
3451
3452#ifdef CMSG_SPACE
3453 if (!get_CMSG_SPACE(bufsize, &space)) {
3454#else
3455 if (!get_CMSG_LEN(bufsize, &space)) {
3456#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003457 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003458 goto finally;
3459 }
3460 controllen += space;
3461 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003462 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003463 goto finally;
3464 }
3465 controllen_last = controllen;
3466 }
3467
3468 /* Construct ancillary data block from control message info. */
3469 if (ncmsgbufs > 0) {
3470 struct cmsghdr *cmsgh = NULL;
3471
3472 if ((msg.msg_control = controlbuf =
3473 PyMem_Malloc(controllen)) == NULL) {
3474 PyErr_NoMemory();
3475 goto finally;
3476 }
3477 msg.msg_controllen = controllen;
3478
3479 /* Need to zero out the buffer as a workaround for glibc's
3480 CMSG_NXTHDR() implementation. After getting the pointer to
3481 the next header, it checks its (uninitialized) cmsg_len
3482 member to see if the "message" fits in the buffer, and
3483 returns NULL if it doesn't. Zero-filling the buffer
3484 ensures that that doesn't happen. */
3485 memset(controlbuf, 0, controllen);
3486
3487 for (i = 0; i < ncmsgbufs; i++) {
3488 size_t msg_len, data_len = cmsgs[i].data.len;
3489 int enough_space = 0;
3490
3491 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3492 if (cmsgh == NULL) {
3493 PyErr_Format(PyExc_RuntimeError,
3494 "unexpected NULL result from %s()",
3495 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3496 goto finally;
3497 }
3498 if (!get_CMSG_LEN(data_len, &msg_len)) {
3499 PyErr_SetString(PyExc_RuntimeError,
3500 "item size out of range for CMSG_LEN()");
3501 goto finally;
3502 }
3503 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3504 size_t space;
3505
3506 cmsgh->cmsg_len = msg_len;
3507 if (get_cmsg_data_space(&msg, cmsgh, &space))
3508 enough_space = (space >= data_len);
3509 }
3510 if (!enough_space) {
3511 PyErr_SetString(PyExc_RuntimeError,
3512 "ancillary data does not fit in calculated "
3513 "space");
3514 goto finally;
3515 }
3516 cmsgh->cmsg_level = cmsgs[i].level;
3517 cmsgh->cmsg_type = cmsgs[i].type;
3518 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3519 }
3520 }
3521
3522 /* Make the system call. */
3523 if (!IS_SELECTABLE(s)) {
3524 select_error();
3525 goto finally;
3526 }
3527
3528 BEGIN_SELECT_LOOP(s)
3529 Py_BEGIN_ALLOW_THREADS;
3530 timeout = internal_select_ex(s, 1, interval);
3531 if (!timeout)
3532 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3533 Py_END_ALLOW_THREADS;
3534 if (timeout == 1) {
3535 PyErr_SetString(socket_timeout, "timed out");
3536 goto finally;
3537 }
3538 END_SELECT_LOOP(s)
3539
3540 if (bytes_sent < 0) {
3541 s->errorhandler();
3542 goto finally;
3543 }
3544 retval = PyLong_FromSsize_t(bytes_sent);
3545
3546finally:
3547 PyMem_Free(controlbuf);
3548 for (i = 0; i < ncmsgbufs; i++)
3549 PyBuffer_Release(&cmsgs[i].data);
3550 PyMem_Free(cmsgs);
3551 Py_XDECREF(cmsg_fast);
3552 for (i = 0; i < ndatabufs; i++)
3553 PyBuffer_Release(&databufs[i]);
3554 PyMem_Free(databufs);
3555 PyMem_Free(iovs);
3556 Py_XDECREF(data_fast);
3557 return retval;
3558}
3559
3560PyDoc_STRVAR(sendmsg_doc,
3561"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3562\n\
3563Send normal and ancillary data to the socket, gathering the\n\
3564non-ancillary data from a series of buffers and concatenating it into\n\
3565a single message. The buffers argument specifies the non-ancillary\n\
3566data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3567The ancdata argument specifies the ancillary data (control messages)\n\
3568as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3569cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3570protocol level and protocol-specific type respectively, and cmsg_data\n\
3571is a buffer-compatible object holding the associated data. The flags\n\
3572argument defaults to 0 and has the same meaning as for send(). If\n\
3573address is supplied and not None, it sets a destination address for\n\
3574the message. The return value is the number of bytes of non-ancillary\n\
3575data sent.");
3576#endif /* CMSG_LEN */
3577
3578
Guido van Rossum30a685f1991-06-27 15:51:29 +00003579/* s.shutdown(how) method */
3580
Guido van Rossum73624e91994-10-10 17:59:00 +00003581static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003582sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003584 int how;
3585 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 how = PyLong_AsLong(arg);
3588 if (how == -1 && PyErr_Occurred())
3589 return NULL;
3590 Py_BEGIN_ALLOW_THREADS
3591 res = shutdown(s->sock_fd, how);
3592 Py_END_ALLOW_THREADS
3593 if (res < 0)
3594 return s->errorhandler();
3595 Py_INCREF(Py_None);
3596 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003597}
3598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003599PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003600"shutdown(flag)\n\
3601\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003602Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3603of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003604
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003605#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003606static PyObject*
3607sock_ioctl(PySocketSockObject *s, PyObject *arg)
3608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 unsigned long cmd = SIO_RCVALL;
3610 PyObject *argO;
3611 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3614 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 switch (cmd) {
3617 case SIO_RCVALL: {
3618 unsigned int option = RCVALL_ON;
3619 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3620 return NULL;
3621 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3622 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3623 return set_error();
3624 }
3625 return PyLong_FromUnsignedLong(recv); }
3626 case SIO_KEEPALIVE_VALS: {
3627 struct tcp_keepalive ka;
3628 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3629 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3630 return NULL;
3631 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3632 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3633 return set_error();
3634 }
3635 return PyLong_FromUnsignedLong(recv); }
3636 default:
3637 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3638 return NULL;
3639 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003640}
3641PyDoc_STRVAR(sock_ioctl_doc,
3642"ioctl(cmd, option) -> long\n\
3643\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003644Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3645SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3646SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003647
3648#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003649
3650/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003651
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003652static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3654 accept_doc},
3655 {"bind", (PyCFunction)sock_bind, METH_O,
3656 bind_doc},
3657 {"close", (PyCFunction)sock_close, METH_NOARGS,
3658 close_doc},
3659 {"connect", (PyCFunction)sock_connect, METH_O,
3660 connect_doc},
3661 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3662 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003663 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3664 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3666 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003667#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 {"getpeername", (PyCFunction)sock_getpeername,
3669 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003671 {"getsockname", (PyCFunction)sock_getsockname,
3672 METH_NOARGS, getsockname_doc},
3673 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3674 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003675#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3677 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 {"listen", (PyCFunction)sock_listen, METH_O,
3680 listen_doc},
3681 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3682 recv_doc},
3683 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3684 recv_into_doc},
3685 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3686 recvfrom_doc},
3687 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3688 recvfrom_into_doc},
3689 {"send", (PyCFunction)sock_send, METH_VARARGS,
3690 send_doc},
3691 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3692 sendall_doc},
3693 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3694 sendto_doc},
3695 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3696 setblocking_doc},
3697 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3698 settimeout_doc},
3699 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3700 gettimeout_doc},
3701 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3702 setsockopt_doc},
3703 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3704 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003705#ifdef CMSG_LEN
3706 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3707 recvmsg_doc},
3708 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3709 recvmsg_into_doc,},
3710 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3711 sendmsg_doc},
3712#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003714};
3715
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003716/* SockObject members */
3717static PyMemberDef sock_memberlist[] = {
3718 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3719 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3720 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3721 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3722 {0},
3723};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003724
Guido van Rossum73624e91994-10-10 17:59:00 +00003725/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003726 First close the file description. */
3727
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003728static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003729sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003730{
Antoine Pitroue033e062010-10-29 10:38:18 +00003731 if (s->sock_fd != -1) {
3732 PyObject *exc, *val, *tb;
3733 Py_ssize_t old_refcount = Py_REFCNT(s);
3734 ++Py_REFCNT(s);
3735 PyErr_Fetch(&exc, &val, &tb);
3736 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3737 "unclosed %R", s))
3738 /* Spurious errors can appear at shutdown */
3739 if (PyErr_ExceptionMatches(PyExc_Warning))
3740 PyErr_WriteUnraisable((PyObject *) s);
3741 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003743 Py_REFCNT(s) = old_refcount;
3744 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003746}
3747
Guido van Rossum30a685f1991-06-27 15:51:29 +00003748
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003749static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003750sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003751{
Fred Drakea04eaad2000-06-30 02:46:07 +00003752#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003753 if (s->sock_fd > LONG_MAX) {
3754 /* this can occur on Win64, and actually there is a special
3755 ugly printf formatter for decimal pointer length integer
3756 printing, only bother if necessary*/
3757 PyErr_SetString(PyExc_OverflowError,
3758 "no printf formatter to display "
3759 "the socket descriptor in decimal");
3760 return NULL;
3761 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 return PyUnicode_FromFormat(
3764 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3765 (long)s->sock_fd, s->sock_family,
3766 s->sock_type,
3767 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003768}
3769
3770
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003771/* Create a new, uninitialized socket object. */
3772
3773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003774sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 new = type->tp_alloc(type, 0);
3779 if (new != NULL) {
3780 ((PySocketSockObject *)new)->sock_fd = -1;
3781 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3782 ((PySocketSockObject *)new)->errorhandler = &set_error;
3783 }
3784 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003785}
3786
3787
3788/* Initialize a new socket object. */
3789
3790/*ARGSUSED*/
3791static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003792sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 PySocketSockObject *s = (PySocketSockObject *)self;
3795 PyObject *fdobj = NULL;
3796 SOCKET_T fd = INVALID_SOCKET;
3797 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3798 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3801 "|iiiO:socket", keywords,
3802 &family, &type, &proto, &fdobj))
3803 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 if (fdobj != NULL && fdobj != Py_None) {
3806 fd = PyLong_AsSocket_t(fdobj);
3807 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3808 return -1;
3809 if (fd == INVALID_SOCKET) {
3810 PyErr_SetString(PyExc_ValueError,
3811 "can't use invalid socket value");
3812 return -1;
3813 }
3814 }
3815 else {
3816 Py_BEGIN_ALLOW_THREADS
3817 fd = socket(family, type, proto);
3818 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 if (fd == INVALID_SOCKET) {
3821 set_error();
3822 return -1;
3823 }
3824 }
3825 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003828
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003829}
3830
3831
Guido van Rossumb6775db1994-08-01 11:34:53 +00003832/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003833
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003834static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003835 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3836 "_socket.socket", /* tp_name */
3837 sizeof(PySocketSockObject), /* tp_basicsize */
3838 0, /* tp_itemsize */
3839 (destructor)sock_dealloc, /* tp_dealloc */
3840 0, /* tp_print */
3841 0, /* tp_getattr */
3842 0, /* tp_setattr */
3843 0, /* tp_reserved */
3844 (reprfunc)sock_repr, /* tp_repr */
3845 0, /* tp_as_number */
3846 0, /* tp_as_sequence */
3847 0, /* tp_as_mapping */
3848 0, /* tp_hash */
3849 0, /* tp_call */
3850 0, /* tp_str */
3851 PyObject_GenericGetAttr, /* tp_getattro */
3852 0, /* tp_setattro */
3853 0, /* tp_as_buffer */
3854 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3855 sock_doc, /* tp_doc */
3856 0, /* tp_traverse */
3857 0, /* tp_clear */
3858 0, /* tp_richcompare */
3859 0, /* tp_weaklistoffset */
3860 0, /* tp_iter */
3861 0, /* tp_iternext */
3862 sock_methods, /* tp_methods */
3863 sock_memberlist, /* tp_members */
3864 0, /* tp_getset */
3865 0, /* tp_base */
3866 0, /* tp_dict */
3867 0, /* tp_descr_get */
3868 0, /* tp_descr_set */
3869 0, /* tp_dictoffset */
3870 sock_initobj, /* tp_init */
3871 PyType_GenericAlloc, /* tp_alloc */
3872 sock_new, /* tp_new */
3873 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003874};
3875
Guido van Rossum30a685f1991-06-27 15:51:29 +00003876
Guido van Rossum81194471991-07-27 21:42:02 +00003877/* Python interface to gethostname(). */
3878
3879/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003880static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003881socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003882{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003883#ifdef MS_WINDOWS
3884 /* Don't use winsock's gethostname, as this returns the ANSI
3885 version of the hostname, whereas we need a Unicode string.
3886 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003887 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003888 DWORD size = Py_ARRAY_LENGTH(buf);
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003889 PyObject *result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003890 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
3891 if (GetLastError() == ERROR_MORE_DATA) {
3892 /* MSDN says this may occur "because DNS allows longer names */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003893 if (size == 0) /* XXX: I'm not sure how to handle this */
3894 return PyUnicode_FromUnicode(NULL, 0);
3895 result = PyUnicode_FromUnicode(NULL, size - 1);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003896 if (!result)
3897 return NULL;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003898 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3899 PyUnicode_AS_UNICODE(result),
3900 &size))
Martin v. Löwis72f48422010-10-29 18:20:08 +00003901 return result;
Benjamin Petersone857b292010-10-29 21:37:26 +00003902 Py_DECREF(result);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003903 }
3904 return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
3905 }
Victor Stinner77af1722011-05-26 14:05:59 +02003906 return PyUnicode_FromUnicode(buf, size);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003907#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003908 char buf[1024];
3909 int res;
3910 Py_BEGIN_ALLOW_THREADS
3911 res = gethostname(buf, (int) sizeof buf - 1);
3912 Py_END_ALLOW_THREADS
3913 if (res < 0)
3914 return set_error();
3915 buf[sizeof buf - 1] = '\0';
3916 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003917#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003918}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003920PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003921"gethostname() -> string\n\
3922\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003923Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003924
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003925#ifdef HAVE_SETHOSTNAME
3926PyDoc_STRVAR(sethostname_doc,
3927"sethostname(name)\n\n\
3928Sets the hostname to name.");
3929
3930static PyObject *
3931socket_sethostname(PyObject *self, PyObject *args)
3932{
3933 PyObject *hnobj;
3934 Py_buffer buf;
3935 int res, flag = 0;
3936
3937 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3938 PyErr_Clear();
3939 if (!PyArg_ParseTuple(args, "O&:sethostname",
3940 PyUnicode_FSConverter, &hnobj))
3941 return NULL;
3942 flag = 1;
3943 }
3944 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3945 if (!res) {
3946 res = sethostname(buf.buf, buf.len);
3947 PyBuffer_Release(&buf);
3948 }
3949 if (flag)
3950 Py_DECREF(hnobj);
3951 if (res)
3952 return set_error();
3953 Py_RETURN_NONE;
3954}
3955#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003956
Guido van Rossum30a685f1991-06-27 15:51:29 +00003957/* Python interface to gethostbyname(name). */
3958
3959/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003960static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003961socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 char *name;
3964 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003965 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003966
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003967 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 return NULL;
3969 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003970 goto finally;
3971 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3972finally:
3973 PyMem_Free(name);
3974 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003975}
3976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003977PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003978"gethostbyname(host) -> address\n\
3979\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003980Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003981
3982
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003983/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3984
3985static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003986gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 char **pch;
3989 PyObject *rtn_tuple = (PyObject *)NULL;
3990 PyObject *name_list = (PyObject *)NULL;
3991 PyObject *addr_list = (PyObject *)NULL;
3992 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 if (h == NULL) {
3995 /* Let's get real error message to return */
3996 set_herror(h_errno);
3997 return NULL;
3998 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 if (h->h_addrtype != af) {
4001 /* Let's get real error message to return */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004002 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 (char *)strerror(EAFNOSUPPORT));
Christian Heimesada8c3b2008-03-18 18:26:33 +00004004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004005 return NULL;
4006 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004010 case AF_INET:
4011 if (alen < sizeof(struct sockaddr_in))
4012 return NULL;
4013 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004014
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004015#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004016 case AF_INET6:
4017 if (alen < sizeof(struct sockaddr_in6))
4018 return NULL;
4019 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004020#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004024 if ((name_list = PyList_New(0)) == NULL)
4025 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004027 if ((addr_list = PyList_New(0)) == NULL)
4028 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 /* SF #1511317: h_aliases can be NULL */
4031 if (h->h_aliases) {
4032 for (pch = h->h_aliases; *pch != NULL; pch++) {
4033 int status;
4034 tmp = PyUnicode_FromString(*pch);
4035 if (tmp == NULL)
4036 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 status = PyList_Append(name_list, tmp);
4039 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 if (status)
4042 goto err;
4043 }
4044 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4047 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 case AF_INET:
4052 {
4053 struct sockaddr_in sin;
4054 memset(&sin, 0, sizeof(sin));
4055 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004056#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004057 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4060 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 if (pch == h->h_addr_list && alen >= sizeof(sin))
4063 memcpy((char *) addr, &sin, sizeof(sin));
4064 break;
4065 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004066
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004067#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 case AF_INET6:
4069 {
4070 struct sockaddr_in6 sin6;
4071 memset(&sin6, 0, sizeof(sin6));
4072 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004073#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004075#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4077 tmp = makeipaddr((struct sockaddr *)&sin6,
4078 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004080 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4081 memcpy((char *) addr, &sin6, sizeof(sin6));
4082 break;
4083 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004084#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004087 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 "unsupported address family");
4089 return NULL;
4090 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 if (tmp == NULL)
4093 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004095 status = PyList_Append(addr_list, tmp);
4096 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 if (status)
4099 goto err;
4100 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004103
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004104 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 Py_XDECREF(name_list);
4106 Py_XDECREF(addr_list);
4107 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004108}
4109
4110
4111/* Python interface to gethostbyname_ex(name). */
4112
4113/*ARGSUSED*/
4114static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004115socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004117 char *name;
4118 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004119#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004121#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004125 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004126#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004128#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004130#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 char buf[16384];
4132 int buf_len = (sizeof buf) - 1;
4133 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004134#endif
4135#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004137#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004138#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004139
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004140 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 return NULL;
4142 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004143 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004145#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004146#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4148 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004149#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004151#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 memset((void *) &data, '\0', sizeof(data));
4153 result = gethostbyname_r(name, &hp_allocated, &data);
4154 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004155#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004156#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004157#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004161#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 Py_END_ALLOW_THREADS
4163 /* Some C libraries would require addr.__ss_family instead of
4164 addr.ss_family.
4165 Therefore, we cast the sockaddr_storage into sockaddr to
4166 access sa_family. */
4167 sa = (struct sockaddr*)&addr;
4168 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4169 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004170#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004172#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004173finally:
4174 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004176}
4177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004178PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004179"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4180\n\
4181Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004182for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004183
4184
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004185/* Python interface to gethostbyaddr(IP). */
4186
4187/*ARGSUSED*/
4188static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004189socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004190{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004191#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004193#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 struct sockaddr *sa = (struct sockaddr *)&addr;
4197 char *ip_num;
4198 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004199 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004200#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004202#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004203 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004204#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 /* glibcs up to 2.10 assume that the buf argument to
4206 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4207 does not ensure. The attribute below instructs the compiler
4208 to maintain this alignment. */
4209 char buf[16384] Py_ALIGNED(8);
4210 int buf_len = (sizeof buf) - 1;
4211 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004212#endif
4213#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004215#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004216#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 char *ap;
4218 int al;
4219 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004220
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004221 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 return NULL;
4223 af = AF_UNSPEC;
4224 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004225 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 af = sa->sa_family;
4227 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004228 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 switch (af) {
4230 case AF_INET:
4231 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4232 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4233 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004234#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 case AF_INET6:
4236 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4237 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4238 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004241 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004242 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 }
4244 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004245#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004246#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 result = gethostbyaddr_r(ap, al, af,
4248 &hp_allocated, buf, buf_len,
4249 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004250#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 h = gethostbyaddr_r(ap, al, af,
4252 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004253#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 memset((void *) &data, '\0', sizeof(data));
4255 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4256 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004257#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004258#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004259#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004263#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 Py_END_ALLOW_THREADS
4265 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004266#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004268#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004269finally:
4270 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004272}
4273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004274PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004275"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4276\n\
4277Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004278for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004279
Guido van Rossum30a685f1991-06-27 15:51:29 +00004280
4281/* Python interface to getservbyname(name).
4282 This only returns the port number, since the other info is already
4283 known or not useful (like the list of aliases). */
4284
4285/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004287socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 char *name, *proto=NULL;
4290 struct servent *sp;
4291 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4292 return NULL;
4293 Py_BEGIN_ALLOW_THREADS
4294 sp = getservbyname(name, proto);
4295 Py_END_ALLOW_THREADS
4296 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004297 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 return NULL;
4299 }
4300 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004301}
4302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004303PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004304"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004305\n\
4306Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004307The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4308otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004309
Guido van Rossum30a685f1991-06-27 15:51:29 +00004310
Barry Warsaw11b91a02004-06-28 00:50:43 +00004311/* Python interface to getservbyport(port).
4312 This only returns the service name, since the other info is already
4313 known or not useful (like the list of aliases). */
4314
4315/*ARGSUSED*/
4316static PyObject *
4317socket_getservbyport(PyObject *self, PyObject *args)
4318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 int port;
4320 char *proto=NULL;
4321 struct servent *sp;
4322 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4323 return NULL;
4324 if (port < 0 || port > 0xffff) {
4325 PyErr_SetString(
4326 PyExc_OverflowError,
4327 "getservbyport: port must be 0-65535.");
4328 return NULL;
4329 }
4330 Py_BEGIN_ALLOW_THREADS
4331 sp = getservbyport(htons((short)port), proto);
4332 Py_END_ALLOW_THREADS
4333 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004334 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 return NULL;
4336 }
4337 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004338}
4339
4340PyDoc_STRVAR(getservbyport_doc,
4341"getservbyport(port[, protocolname]) -> string\n\
4342\n\
4343Return the service name from a port number and protocol name.\n\
4344The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4345otherwise any protocol will match.");
4346
Guido van Rossum3901d851996-12-19 16:35:04 +00004347/* Python interface to getprotobyname(name).
4348 This only returns the protocol number, since the other info is
4349 already known or not useful (like the list of aliases). */
4350
4351/*ARGSUSED*/
4352static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004353socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 char *name;
4356 struct protoent *sp;
4357 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4358 return NULL;
4359 Py_BEGIN_ALLOW_THREADS
4360 sp = getprotobyname(name);
4361 Py_END_ALLOW_THREADS
4362 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004363 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 return NULL;
4365 }
4366 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004367}
4368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004369PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004370"getprotobyname(name) -> integer\n\
4371\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004372Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004373
Guido van Rossum3901d851996-12-19 16:35:04 +00004374
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004375#ifndef NO_DUP
4376/* dup() function for socket fds */
4377
4378static PyObject *
4379socket_dup(PyObject *self, PyObject *fdobj)
4380{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 SOCKET_T fd, newfd;
4382 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004383
4384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 fd = PyLong_AsSocket_t(fdobj);
4386 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4387 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 newfd = dup_socket(fd);
4390 if (newfd == INVALID_SOCKET)
4391 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 newfdobj = PyLong_FromSocket_t(newfd);
4394 if (newfdobj == NULL)
4395 SOCKETCLOSE(newfd);
4396 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004397}
4398
4399PyDoc_STRVAR(dup_doc,
4400"dup(integer) -> integer\n\
4401\n\
4402Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4403sockets; on some platforms os.dup() won't work for socket file descriptors.");
4404#endif
4405
4406
Dave Cole331708b2004-08-09 04:51:41 +00004407#ifdef HAVE_SOCKETPAIR
4408/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004409 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004410 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004411
4412/*ARGSUSED*/
4413static PyObject *
4414socket_socketpair(PyObject *self, PyObject *args)
4415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 PySocketSockObject *s0 = NULL, *s1 = NULL;
4417 SOCKET_T sv[2];
4418 int family, type = SOCK_STREAM, proto = 0;
4419 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004420
4421#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004423#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4427 &family, &type, &proto))
4428 return NULL;
4429 /* Create a pair of socket fds */
4430 if (socketpair(family, type, proto, sv) < 0)
4431 return set_error();
4432 s0 = new_sockobject(sv[0], family, type, proto);
4433 if (s0 == NULL)
4434 goto finally;
4435 s1 = new_sockobject(sv[1], family, type, proto);
4436 if (s1 == NULL)
4437 goto finally;
4438 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004439
4440finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 if (res == NULL) {
4442 if (s0 == NULL)
4443 SOCKETCLOSE(sv[0]);
4444 if (s1 == NULL)
4445 SOCKETCLOSE(sv[1]);
4446 }
4447 Py_XDECREF(s0);
4448 Py_XDECREF(s1);
4449 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004450}
4451
4452PyDoc_STRVAR(socketpair_doc,
4453"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4454\n\
4455Create a pair of socket objects from the sockets returned by the platform\n\
4456socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004457The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004458AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004459
4460#endif /* HAVE_SOCKETPAIR */
4461
4462
Guido van Rossum006bf911996-06-12 04:04:55 +00004463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004464socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4469 return NULL;
4470 }
4471 if (x1 < 0) {
4472 PyErr_SetString(PyExc_OverflowError,
4473 "can't convert negative number to unsigned long");
4474 return NULL;
4475 }
4476 x2 = (unsigned int)ntohs((unsigned short)x1);
4477 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004478}
4479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004480PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004481"ntohs(integer) -> integer\n\
4482\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004483Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004484
4485
Guido van Rossum006bf911996-06-12 04:04:55 +00004486static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004487socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 if (PyLong_Check(arg)) {
4492 x = PyLong_AsUnsignedLong(arg);
4493 if (x == (unsigned long) -1 && PyErr_Occurred())
4494 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004495#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 {
4497 unsigned long y;
4498 /* only want the trailing 32 bits */
4499 y = x & 0xFFFFFFFFUL;
4500 if (y ^ x)
4501 return PyErr_Format(PyExc_OverflowError,
4502 "long int larger than 32 bits");
4503 x = y;
4504 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 }
4507 else
4508 return PyErr_Format(PyExc_TypeError,
4509 "expected int/long, %s found",
4510 Py_TYPE(arg)->tp_name);
4511 if (x == (unsigned long) -1 && PyErr_Occurred())
4512 return NULL;
4513 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004514}
4515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004516PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004517"ntohl(integer) -> integer\n\
4518\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004519Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004520
4521
Guido van Rossum006bf911996-06-12 04:04:55 +00004522static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004523socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4528 return NULL;
4529 }
4530 if (x1 < 0) {
4531 PyErr_SetString(PyExc_OverflowError,
4532 "can't convert negative number to unsigned long");
4533 return NULL;
4534 }
4535 x2 = (unsigned int)htons((unsigned short)x1);
4536 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004537}
4538
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004539PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004540"htons(integer) -> integer\n\
4541\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004542Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004543
4544
Guido van Rossum006bf911996-06-12 04:04:55 +00004545static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004546socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 if (PyLong_Check(arg)) {
4551 x = PyLong_AsUnsignedLong(arg);
4552 if (x == (unsigned long) -1 && PyErr_Occurred())
4553 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004554#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 {
4556 unsigned long y;
4557 /* only want the trailing 32 bits */
4558 y = x & 0xFFFFFFFFUL;
4559 if (y ^ x)
4560 return PyErr_Format(PyExc_OverflowError,
4561 "long int larger than 32 bits");
4562 x = y;
4563 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 }
4566 else
4567 return PyErr_Format(PyExc_TypeError,
4568 "expected int/long, %s found",
4569 Py_TYPE(arg)->tp_name);
4570 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004571}
4572
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004573PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004574"htonl(integer) -> integer\n\
4575\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004576Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004577
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004578/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004580PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004581"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004582\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004583Convert 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 +00004584binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004585
4586static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004587socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004588{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004589#ifndef INADDR_NONE
4590#define INADDR_NONE (-1)
4591#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004592#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004594#endif
4595
4596#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004597#if (SIZEOF_INT != 4)
4598#error "Not sure if in_addr_t exists and int is not 32-bits."
4599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 /* Have to use inet_addr() instead */
4601 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4606 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004607
Tim Peters1df9fdd2003-02-13 03:13:40 +00004608
4609#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004610
4611#ifdef USE_INET_ATON_WEAKLINK
4612 if (inet_aton != NULL) {
4613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 if (inet_aton(ip_addr, &buf))
4615 return PyBytes_FromStringAndSize((char *)(&buf),
4616 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004617
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004618 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 "illegal IP address string passed to inet_aton");
4620 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004621
Thomas Wouters477c8d52006-05-27 19:21:47 +00004622#ifdef USE_INET_ATON_WEAKLINK
4623 } else {
4624#endif
4625
4626#endif
4627
4628#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 /* special-case this address as inet_addr might return INADDR_NONE
4631 * for this */
4632 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4633 packed_addr = 0xFFFFFFFF;
4634 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004639 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 "illegal IP address string passed to inet_aton");
4641 return NULL;
4642 }
4643 }
4644 return PyBytes_FromStringAndSize((char *) &packed_addr,
4645 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004646
4647#ifdef USE_INET_ATON_WEAKLINK
4648 }
4649#endif
4650
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004651#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004652}
4653
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004654PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004655"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004656\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004657Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004658
4659static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004660socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 char *packed_str;
4663 int addr_len;
4664 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4667 return NULL;
4668 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004671 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 "packed IP wrong length for inet_ntoa");
4673 return NULL;
4674 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004679}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004680
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004681#ifdef HAVE_INET_PTON
4682
4683PyDoc_STRVAR(inet_pton_doc,
4684"inet_pton(af, ip) -> packed IP address string\n\
4685\n\
4686Convert an IP address from string format to a packed string suitable\n\
4687for use with low-level network functions.");
4688
4689static PyObject *
4690socket_inet_pton(PyObject *self, PyObject *args)
4691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 int af;
4693 char* ip;
4694 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004695#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004697#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4701 return NULL;
4702 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004703
Martin v. Löwis04697e82004-06-02 12:35:29 +00004704#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004706 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004707 "can't use AF_INET6, IPv6 is disabled");
4708 return NULL;
4709 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004710#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 retval = inet_pton(af, ip, packed);
4713 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004714 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 return NULL;
4716 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004717 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 "illegal IP address string passed to inet_pton");
4719 return NULL;
4720 } else if (af == AF_INET) {
4721 return PyBytes_FromStringAndSize(packed,
4722 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004723#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 } else if (af == AF_INET6) {
4725 return PyBytes_FromStringAndSize(packed,
4726 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004729 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 return NULL;
4731 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004732}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004733
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004734PyDoc_STRVAR(inet_ntop_doc,
4735"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4736\n\
4737Convert a packed IP address of the given family to string format.");
4738
4739static PyObject *
4740socket_inet_ntop(PyObject *self, PyObject *args)
4741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 int af;
4743 char* packed;
4744 int len;
4745 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004746#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004750#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4753 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4756 return NULL;
4757 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 if (af == AF_INET) {
4760 if (len != sizeof(struct in_addr)) {
4761 PyErr_SetString(PyExc_ValueError,
4762 "invalid length of packed IP address string");
4763 return NULL;
4764 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004765#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 } else if (af == AF_INET6) {
4767 if (len != sizeof(struct in6_addr)) {
4768 PyErr_SetString(PyExc_ValueError,
4769 "invalid length of packed IP address string");
4770 return NULL;
4771 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 } else {
4774 PyErr_Format(PyExc_ValueError,
4775 "unknown address family %d", af);
4776 return NULL;
4777 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 retval = inet_ntop(af, packed, ip, sizeof(ip));
4780 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004781 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 return NULL;
4783 } else {
4784 return PyUnicode_FromString(retval);
4785 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 /* NOTREACHED */
4788 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4789 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004790}
4791
4792#endif /* HAVE_INET_PTON */
4793
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004794/* Python interface to getaddrinfo(host, port). */
4795
4796/*ARGSUSED*/
4797static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004798socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004799{
Victor Stinner77af1722011-05-26 14:05:59 +02004800 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004801 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 struct addrinfo hints, *res;
4803 struct addrinfo *res0 = NULL;
4804 PyObject *hobj = NULL;
4805 PyObject *pobj = (PyObject *)NULL;
4806 char pbuf[30];
4807 char *hptr, *pptr;
4808 int family, socktype, protocol, flags;
4809 int error;
4810 PyObject *all = (PyObject *)NULL;
4811 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 family = socktype = protocol = flags = 0;
4814 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004815 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004816 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 &protocol, &flags)) {
4818 return NULL;
4819 }
4820 if (hobj == Py_None) {
4821 hptr = NULL;
4822 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004823 _Py_identifier(encode);
4824
4825 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 if (!idna)
4827 return NULL;
4828 assert(PyBytes_Check(idna));
4829 hptr = PyBytes_AS_STRING(idna);
4830 } else if (PyBytes_Check(hobj)) {
4831 hptr = PyBytes_AsString(hobj);
4832 } else {
4833 PyErr_SetString(PyExc_TypeError,
4834 "getaddrinfo() argument 1 must be string or None");
4835 return NULL;
4836 }
4837 if (PyLong_CheckExact(pobj)) {
4838 long value = PyLong_AsLong(pobj);
4839 if (value == -1 && PyErr_Occurred())
4840 goto err;
4841 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4842 pptr = pbuf;
4843 } else if (PyUnicode_Check(pobj)) {
4844 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004845 if (pptr == NULL)
4846 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004848 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 } else if (pobj == Py_None) {
4850 pptr = (char *)NULL;
4851 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004852 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 goto err;
4854 }
4855 memset(&hints, 0, sizeof(hints));
4856 hints.ai_family = family;
4857 hints.ai_socktype = socktype;
4858 hints.ai_protocol = protocol;
4859 hints.ai_flags = flags;
4860 Py_BEGIN_ALLOW_THREADS
4861 ACQUIRE_GETADDRINFO_LOCK
4862 error = getaddrinfo(hptr, pptr, &hints, &res0);
4863 Py_END_ALLOW_THREADS
4864 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4865 if (error) {
4866 set_gaierror(error);
4867 goto err;
4868 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 if ((all = PyList_New(0)) == NULL)
4871 goto err;
4872 for (res = res0; res; res = res->ai_next) {
4873 PyObject *single;
4874 PyObject *addr =
4875 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4876 if (addr == NULL)
4877 goto err;
4878 single = Py_BuildValue("iiisO", res->ai_family,
4879 res->ai_socktype, res->ai_protocol,
4880 res->ai_canonname ? res->ai_canonname : "",
4881 addr);
4882 Py_DECREF(addr);
4883 if (single == NULL)
4884 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 if (PyList_Append(all, single))
4887 goto err;
4888 Py_XDECREF(single);
4889 }
4890 Py_XDECREF(idna);
4891 if (res0)
4892 freeaddrinfo(res0);
4893 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004894 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 Py_XDECREF(all);
4896 Py_XDECREF(idna);
4897 if (res0)
4898 freeaddrinfo(res0);
4899 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004900}
4901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004902PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004903"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4904 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004905\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004906Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004907
4908/* Python interface to getnameinfo(sa, flags). */
4909
4910/*ARGSUSED*/
4911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004912socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 PyObject *sa = (PyObject *)NULL;
4915 int flags;
4916 char *hostp;
4917 int port, flowinfo, scope_id;
4918 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4919 struct addrinfo hints, *res = NULL;
4920 int error;
4921 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 flags = flowinfo = scope_id = 0;
4924 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4925 return NULL;
4926 if (!PyTuple_Check(sa)) {
4927 PyErr_SetString(PyExc_TypeError,
4928 "getnameinfo() argument 1 must be a tuple");
4929 return NULL;
4930 }
4931 if (!PyArg_ParseTuple(sa, "si|ii",
4932 &hostp, &port, &flowinfo, &scope_id))
4933 return NULL;
4934 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4935 memset(&hints, 0, sizeof(hints));
4936 hints.ai_family = AF_UNSPEC;
4937 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004938 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 Py_BEGIN_ALLOW_THREADS
4940 ACQUIRE_GETADDRINFO_LOCK
4941 error = getaddrinfo(hostp, pbuf, &hints, &res);
4942 Py_END_ALLOW_THREADS
4943 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4944 if (error) {
4945 set_gaierror(error);
4946 goto fail;
4947 }
4948 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004949 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 "sockaddr resolved to multiple addresses");
4951 goto fail;
4952 }
4953 switch (res->ai_family) {
4954 case AF_INET:
4955 {
4956 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004957 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 "IPv4 sockaddr must be 2 tuple");
4959 goto fail;
4960 }
4961 break;
4962 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004963#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 case AF_INET6:
4965 {
4966 struct sockaddr_in6 *sin6;
4967 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4968 sin6->sin6_flowinfo = flowinfo;
4969 sin6->sin6_scope_id = scope_id;
4970 break;
4971 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00004974 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4976 if (error) {
4977 set_gaierror(error);
4978 goto fail;
4979 }
4980 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004981
4982fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 if (res)
4984 freeaddrinfo(res);
4985 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004986}
4987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004988PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004989"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004990\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004991Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004992
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004993
4994/* Python API to getting and setting the default timeout value. */
4995
4996static PyObject *
4997socket_getdefaulttimeout(PyObject *self)
4998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 if (defaulttimeout < 0.0) {
5000 Py_INCREF(Py_None);
5001 return Py_None;
5002 }
5003 else
5004 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005005}
5006
5007PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005008"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005009\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005010Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005011A value of None indicates that new socket objects have no timeout.\n\
5012When the socket module is first imported, the default is None.");
5013
5014static PyObject *
5015socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 if (arg == Py_None)
5020 timeout = -1.0;
5021 else {
5022 timeout = PyFloat_AsDouble(arg);
5023 if (timeout < 0.0) {
5024 if (!PyErr_Occurred())
5025 PyErr_SetString(PyExc_ValueError,
5026 "Timeout value out of range");
5027 return NULL;
5028 }
5029 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 Py_INCREF(Py_None);
5034 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005035}
5036
5037PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005038"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005039\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005040Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005041A value of None indicates that new socket objects have no timeout.\n\
5042When the socket module is first imported, the default is None.");
5043
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005044#ifdef HAVE_IF_NAMEINDEX
5045/* Python API for getting interface indices and names */
5046
5047static PyObject *
5048socket_if_nameindex(PyObject *self, PyObject *arg)
5049{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005050 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005051 int i;
5052 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005053
Charles-François Natali60713592011-05-20 16:55:06 +02005054 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005055 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005056 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005057 return NULL;
5058 }
5059
5060 list = PyList_New(0);
5061 if (list == NULL) {
5062 if_freenameindex(ni);
5063 return NULL;
5064 }
5065
Charles-François Natali60713592011-05-20 16:55:06 +02005066 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5067 PyObject *ni_tuple = Py_BuildValue("IO&",
5068 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005069
5070 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5071 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005072 Py_DECREF(list);
5073 if_freenameindex(ni);
5074 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005075 }
5076 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005077 }
5078
5079 if_freenameindex(ni);
5080 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005081}
5082
5083PyDoc_STRVAR(if_nameindex_doc,
5084"if_nameindex()\n\
5085\n\
5086Returns a list of network interface information (index, name) tuples.");
5087
Charles-François Natali60713592011-05-20 16:55:06 +02005088static PyObject *
5089socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005090{
Charles-François Natali60713592011-05-20 16:55:06 +02005091 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005092 unsigned long index;
5093
Charles-François Natali60713592011-05-20 16:55:06 +02005094 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5095 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005096 return NULL;
5097
Charles-François Natali60713592011-05-20 16:55:06 +02005098 index = if_nametoindex(PyBytes_AS_STRING(oname));
5099 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005100 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005101 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005102 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005103 return NULL;
5104 }
5105
5106 return PyLong_FromUnsignedLong(index);
5107}
5108
5109PyDoc_STRVAR(if_nametoindex_doc,
5110"if_nametoindex(if_name)\n\
5111\n\
5112Returns the interface index corresponding to the interface name if_name.");
5113
Charles-François Natali60713592011-05-20 16:55:06 +02005114static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005115socket_if_indextoname(PyObject *self, PyObject *arg)
5116{
Charles-François Natali60713592011-05-20 16:55:06 +02005117 unsigned long index;
5118 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005119
Charles-François Natali60713592011-05-20 16:55:06 +02005120 index = PyLong_AsUnsignedLong(arg);
5121 if (index == (unsigned long) -1)
5122 return NULL;
5123
5124 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005125 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005126 return NULL;
5127 }
5128
Charles-François Natali60713592011-05-20 16:55:06 +02005129 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005130}
5131
5132PyDoc_STRVAR(if_indextoname_doc,
5133"if_indextoname(if_index)\n\
5134\n\
5135Returns the interface name corresponding to the interface index if_index.");
5136
5137#endif /* HAVE_IF_NAMEINDEX */
5138
5139
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005140#ifdef CMSG_LEN
5141/* Python interface to CMSG_LEN(length). */
5142
5143static PyObject *
5144socket_CMSG_LEN(PyObject *self, PyObject *args)
5145{
5146 Py_ssize_t length;
5147 size_t result;
5148
5149 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5150 return NULL;
5151 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5152 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5153 return NULL;
5154 }
5155 return PyLong_FromSize_t(result);
5156}
5157
5158PyDoc_STRVAR(CMSG_LEN_doc,
5159"CMSG_LEN(length) -> control message length\n\
5160\n\
5161Return the total length, without trailing padding, of an ancillary\n\
5162data item with associated data of the given length. This value can\n\
5163often be used as the buffer size for recvmsg() to receive a single\n\
5164item of ancillary data, but RFC 3542 requires portable applications to\n\
5165use CMSG_SPACE() and thus include space for padding, even when the\n\
5166item will be the last in the buffer. Raises OverflowError if length\n\
5167is outside the permissible range of values.");
5168
5169
5170#ifdef CMSG_SPACE
5171/* Python interface to CMSG_SPACE(length). */
5172
5173static PyObject *
5174socket_CMSG_SPACE(PyObject *self, PyObject *args)
5175{
5176 Py_ssize_t length;
5177 size_t result;
5178
5179 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5180 return NULL;
5181 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5182 PyErr_SetString(PyExc_OverflowError,
5183 "CMSG_SPACE() argument out of range");
5184 return NULL;
5185 }
5186 return PyLong_FromSize_t(result);
5187}
5188
5189PyDoc_STRVAR(CMSG_SPACE_doc,
5190"CMSG_SPACE(length) -> buffer size\n\
5191\n\
5192Return the buffer size needed for recvmsg() to receive an ancillary\n\
5193data item with associated data of the given length, along with any\n\
5194trailing padding. The buffer space needed to receive multiple items\n\
5195is the sum of the CMSG_SPACE() values for their associated data\n\
5196lengths. Raises OverflowError if length is outside the permissible\n\
5197range of values.");
5198#endif /* CMSG_SPACE */
5199#endif /* CMSG_LEN */
5200
5201
Guido van Rossum30a685f1991-06-27 15:51:29 +00005202/* List of functions exported by this module. */
5203
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005204static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 {"gethostbyname", socket_gethostbyname,
5206 METH_VARARGS, gethostbyname_doc},
5207 {"gethostbyname_ex", socket_gethostbyname_ex,
5208 METH_VARARGS, ghbn_ex_doc},
5209 {"gethostbyaddr", socket_gethostbyaddr,
5210 METH_VARARGS, gethostbyaddr_doc},
5211 {"gethostname", socket_gethostname,
5212 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005213#ifdef HAVE_SETHOSTNAME
5214 {"sethostname", socket_sethostname,
5215 METH_VARARGS, sethostname_doc},
5216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 {"getservbyname", socket_getservbyname,
5218 METH_VARARGS, getservbyname_doc},
5219 {"getservbyport", socket_getservbyport,
5220 METH_VARARGS, getservbyport_doc},
5221 {"getprotobyname", socket_getprotobyname,
5222 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005223#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 {"dup", socket_dup,
5225 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005226#endif
Dave Cole331708b2004-08-09 04:51:41 +00005227#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 {"socketpair", socket_socketpair,
5229 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 {"ntohs", socket_ntohs,
5232 METH_VARARGS, ntohs_doc},
5233 {"ntohl", socket_ntohl,
5234 METH_O, ntohl_doc},
5235 {"htons", socket_htons,
5236 METH_VARARGS, htons_doc},
5237 {"htonl", socket_htonl,
5238 METH_O, htonl_doc},
5239 {"inet_aton", socket_inet_aton,
5240 METH_VARARGS, inet_aton_doc},
5241 {"inet_ntoa", socket_inet_ntoa,
5242 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005243#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 {"inet_pton", socket_inet_pton,
5245 METH_VARARGS, inet_pton_doc},
5246 {"inet_ntop", socket_inet_ntop,
5247 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005248#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005249 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5250 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 {"getnameinfo", socket_getnameinfo,
5252 METH_VARARGS, getnameinfo_doc},
5253 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5254 METH_NOARGS, getdefaulttimeout_doc},
5255 {"setdefaulttimeout", socket_setdefaulttimeout,
5256 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005257#ifdef HAVE_IF_NAMEINDEX
5258 {"if_nameindex", socket_if_nameindex,
5259 METH_NOARGS, if_nameindex_doc},
5260 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005261 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005262 {"if_indextoname", socket_if_indextoname,
5263 METH_O, if_indextoname_doc},
5264#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005265#ifdef CMSG_LEN
5266 {"CMSG_LEN", socket_CMSG_LEN,
5267 METH_VARARGS, CMSG_LEN_doc},
5268#ifdef CMSG_SPACE
5269 {"CMSG_SPACE", socket_CMSG_SPACE,
5270 METH_VARARGS, CMSG_SPACE_doc},
5271#endif
5272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005274};
5275
Guido van Rossum30a685f1991-06-27 15:51:29 +00005276
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005277#ifdef MS_WINDOWS
5278#define OS_INIT_DEFINED
5279
5280/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005281
5282static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005283os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005286}
5287
5288static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005289os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 WSADATA WSAData;
5292 int ret;
5293 ret = WSAStartup(0x0101, &WSAData);
5294 switch (ret) {
5295 case 0: /* No error */
5296 Py_AtExit(os_cleanup);
5297 return 1; /* Success */
5298 case WSASYSNOTREADY:
5299 PyErr_SetString(PyExc_ImportError,
5300 "WSAStartup failed: network not ready");
5301 break;
5302 case WSAVERNOTSUPPORTED:
5303 case WSAEINVAL:
5304 PyErr_SetString(
5305 PyExc_ImportError,
5306 "WSAStartup failed: requested version not supported");
5307 break;
5308 default:
5309 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5310 break;
5311 }
5312 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005313}
5314
Guido van Rossum8d665e61996-06-26 18:22:49 +00005315#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005316
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005317
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005318#ifdef PYOS_OS2
5319#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005320
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005321/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005322
5323static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005324os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005325{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005326#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 if (rc == 0) {
5330 return 1; /* Success */
5331 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005336#else
Ezio Melotti13925002011-03-16 11:05:33 +02005337 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005339#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005340}
5341
5342#endif /* PYOS_OS2 */
5343
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005344
5345#ifndef OS_INIT_DEFINED
5346static int
5347os_init(void)
5348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005350}
5351#endif
5352
5353
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005354/* C API table - always add new things to the end for binary
5355 compatibility. */
5356static
5357PySocketModule_APIObject PySocketModuleAPI =
5358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005360 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005362};
5363
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005364
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005365/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005366
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005367 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005368 "socket.py" which implements some additional functionality.
5369 The import of "_socket" may fail with an ImportError exception if
5370 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005371 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005372 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005373*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005375PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005376"Implementation module for socket operations.\n\
5377\n\
5378See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005379
Martin v. Löwis1a214512008-06-11 05:26:20 +00005380static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 PyModuleDef_HEAD_INIT,
5382 PySocket_MODULE_NAME,
5383 socket_doc,
5384 -1,
5385 socket_methods,
5386 NULL,
5387 NULL,
5388 NULL,
5389 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005390};
5391
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005392PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005393PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 if (!os_init())
5398 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 Py_TYPE(&sock_type) = &PyType_Type;
5401 m = PyModule_Create(&socketmodule);
5402 if (m == NULL)
5403 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005404
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005405 Py_INCREF(PyExc_OSError);
5406 PySocketModuleAPI.error = PyExc_OSError;
5407 Py_INCREF(PyExc_OSError);
5408 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005410 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 if (socket_herror == NULL)
5412 return NULL;
5413 Py_INCREF(socket_herror);
5414 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005415 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 NULL);
5417 if (socket_gaierror == NULL)
5418 return NULL;
5419 Py_INCREF(socket_gaierror);
5420 PyModule_AddObject(m, "gaierror", socket_gaierror);
5421 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005422 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 if (socket_timeout == NULL)
5424 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005425 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 Py_INCREF(socket_timeout);
5427 PyModule_AddObject(m, "timeout", socket_timeout);
5428 Py_INCREF((PyObject *)&sock_type);
5429 if (PyModule_AddObject(m, "SocketType",
5430 (PyObject *)&sock_type) != 0)
5431 return NULL;
5432 Py_INCREF((PyObject *)&sock_type);
5433 if (PyModule_AddObject(m, "socket",
5434 (PyObject *)&sock_type) != 0)
5435 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005436
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005437#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005439#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 Py_INCREF(has_ipv6);
5443 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 /* Export C API */
5446 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5447 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5448 ) != 0)
5449 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005452#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005456#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005459#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005461#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005462#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 /* Amateur Radio AX.25 */
5464 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005465#endif
5466#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005468#endif
5469#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 /* Appletalk DDP */
5471 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005472#endif
5473#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 /* Amateur radio NetROM */
5475 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005476#endif
5477#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 /* Multiprotocol bridge */
5479 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005480#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005481#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 /* ATM PVCs */
5483 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005484#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005485#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 /* Reserved for Werner's ATM */
5487 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005488#endif
5489#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 /* Reserved for X.25 project */
5491 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005492#endif
5493#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005495#endif
5496#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 /* Amateur Radio X.25 PLP */
5498 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005499#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005500#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 /* Reserved for DECnet project */
5502 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005503#endif
5504#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 /* Reserved for 802.2LLC project */
5506 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005507#endif
5508#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 /* Security callback pseudo AF */
5510 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005511#endif
5512#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 /* PF_KEY key management API */
5514 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005515#endif
5516#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 /* */
5518 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5519 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005520#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005522#endif
5523#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5527 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005528#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005530#endif
5531#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005533#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005534#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005536#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005537#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005539#endif
5540#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005544#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005546#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005547#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005549#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005550#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005551#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 /* Alias to emulate 4.4BSD */
5553 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005554#endif
5555#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 /* Ash */
5557 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005558#endif
5559#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 /* Acorn Econet */
5561 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005562#endif
5563#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 /* ATM SVCs */
5565 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005566#endif
5567#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 /* Linux SNA Project (nutters!) */
5569 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005570#endif
5571#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 /* IRDA sockets */
5573 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005574#endif
5575#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 /* PPPoX sockets */
5577 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005578#endif
5579#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 /* Wanpipe API Sockets */
5581 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005582#endif
5583#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 /* Linux LLC */
5585 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005586#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005587
Hye-Shik Chang81268602004-02-02 06:05:24 +00005588#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5590 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5591 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5592 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005593#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005595#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005596#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005597#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5601 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5604 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5605 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005606#endif
5607
Charles-François Natali47413c12011-10-06 19:47:44 +02005608#ifdef AF_CAN
5609 /* Controller Area Network */
5610 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5611#endif
5612#ifdef PF_CAN
5613 /* Controller Area Network */
5614 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5615#endif
5616
Antoine Pitroub156a462010-10-27 20:13:57 +00005617#ifdef AF_PACKET
5618 PyModule_AddIntMacro(m, AF_PACKET);
5619#endif
5620#ifdef PF_PACKET
5621 PyModule_AddIntMacro(m, PF_PACKET);
5622#endif
5623#ifdef PACKET_HOST
5624 PyModule_AddIntMacro(m, PACKET_HOST);
5625#endif
5626#ifdef PACKET_BROADCAST
5627 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5628#endif
5629#ifdef PACKET_MULTICAST
5630 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5631#endif
5632#ifdef PACKET_OTHERHOST
5633 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5634#endif
5635#ifdef PACKET_OUTGOING
5636 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5637#endif
5638#ifdef PACKET_LOOPBACK
5639 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5640#endif
5641#ifdef PACKET_FASTROUTE
5642 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005643#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005644
Christian Heimes043d6f62008-01-07 17:19:16 +00005645#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 /* for addresses */
5649 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5650 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5651 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5654 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5655 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 /* for setsockopt() */
5658 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5659 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5660 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5661 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5662 TIPC_DEST_DROPPABLE);
5663 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5666 TIPC_LOW_IMPORTANCE);
5667 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5668 TIPC_MEDIUM_IMPORTANCE);
5669 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5670 TIPC_HIGH_IMPORTANCE);
5671 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5672 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 /* for subscriptions */
5675 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5676 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005677#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 /* doesn't seem to be available everywhere */
5679 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5682 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5683 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5684 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5685 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5686 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005687#endif
5688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 /* Socket types */
5690 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5691 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005692/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5694 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005695#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005697#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005698#ifdef SOCK_CLOEXEC
5699 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5700#endif
5701#ifdef SOCK_NONBLOCK
5702 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5703#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705#ifdef SO_DEBUG
5706 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708#ifdef SO_ACCEPTCONN
5709 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711#ifdef SO_REUSEADDR
5712 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005713#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005714#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005716#endif
5717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718#ifdef SO_KEEPALIVE
5719 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721#ifdef SO_DONTROUTE
5722 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724#ifdef SO_BROADCAST
5725 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727#ifdef SO_USELOOPBACK
5728 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730#ifdef SO_LINGER
5731 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733#ifdef SO_OOBINLINE
5734 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736#ifdef SO_REUSEPORT
5737 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739#ifdef SO_SNDBUF
5740 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742#ifdef SO_RCVBUF
5743 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745#ifdef SO_SNDLOWAT
5746 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748#ifdef SO_RCVLOWAT
5749 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751#ifdef SO_SNDTIMEO
5752 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754#ifdef SO_RCVTIMEO
5755 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757#ifdef SO_ERROR
5758 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760#ifdef SO_TYPE
5761 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763#ifdef SO_SETFIB
5764 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005765#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005766#ifdef SO_PASSCRED
5767 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5768#endif
5769#ifdef SO_PEERCRED
5770 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5771#endif
5772#ifdef LOCAL_PEERCRED
5773 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5774#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 /* Maximum number of connections for "listen" */
5777#ifdef SOMAXCONN
5778 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005779#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005781#endif
5782
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005783 /* Ancilliary message types */
5784#ifdef SCM_RIGHTS
5785 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5786#endif
5787#ifdef SCM_CREDENTIALS
5788 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5789#endif
5790#ifdef SCM_CREDS
5791 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5792#endif
5793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 /* Flags for send, recv */
5795#ifdef MSG_OOB
5796 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798#ifdef MSG_PEEK
5799 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801#ifdef MSG_DONTROUTE
5802 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804#ifdef MSG_DONTWAIT
5805 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807#ifdef MSG_EOR
5808 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810#ifdef MSG_TRUNC
5811 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813#ifdef MSG_CTRUNC
5814 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816#ifdef MSG_WAITALL
5817 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819#ifdef MSG_BTAG
5820 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822#ifdef MSG_ETAG
5823 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005824#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005825#ifdef MSG_NOSIGNAL
5826 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5827#endif
5828#ifdef MSG_NOTIFICATION
5829 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5830#endif
5831#ifdef MSG_CMSG_CLOEXEC
5832 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5833#endif
5834#ifdef MSG_ERRQUEUE
5835 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5836#endif
5837#ifdef MSG_CONFIRM
5838 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5839#endif
5840#ifdef MSG_MORE
5841 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5842#endif
5843#ifdef MSG_EOF
5844 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5845#endif
5846#ifdef MSG_BCAST
5847 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5848#endif
5849#ifdef MSG_MCAST
5850 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5851#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 /* Protocol level and numbers, usable for [gs]etsockopt */
5854#ifdef SOL_SOCKET
5855 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857#ifdef SOL_IP
5858 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005859#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862#ifdef SOL_IPX
5863 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865#ifdef SOL_AX25
5866 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868#ifdef SOL_ATALK
5869 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871#ifdef SOL_NETROM
5872 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874#ifdef SOL_ROSE
5875 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877#ifdef SOL_TCP
5878 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005879#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882#ifdef SOL_UDP
5883 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005884#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005886#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005887#ifdef SOL_CAN_BASE
5888 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5889#endif
5890#ifdef SOL_CAN_RAW
5891 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5892 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5893#endif
5894#ifdef HAVE_LINUX_CAN_H
5895 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5896 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5897 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5898
5899 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5900 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5901 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5902#endif
5903#ifdef HAVE_LINUX_CAN_RAW_H
5904 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5905 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5906 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5907 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909#ifdef IPPROTO_IP
5910 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005911#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914#ifdef IPPROTO_HOPOPTS
5915 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917#ifdef IPPROTO_ICMP
5918 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005919#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922#ifdef IPPROTO_IGMP
5923 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925#ifdef IPPROTO_GGP
5926 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928#ifdef IPPROTO_IPV4
5929 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931#ifdef IPPROTO_IPV6
5932 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934#ifdef IPPROTO_IPIP
5935 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937#ifdef IPPROTO_TCP
5938 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005939#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942#ifdef IPPROTO_EGP
5943 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945#ifdef IPPROTO_PUP
5946 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948#ifdef IPPROTO_UDP
5949 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005950#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953#ifdef IPPROTO_IDP
5954 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956#ifdef IPPROTO_HELLO
5957 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959#ifdef IPPROTO_ND
5960 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962#ifdef IPPROTO_TP
5963 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965#ifdef IPPROTO_IPV6
5966 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968#ifdef IPPROTO_ROUTING
5969 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971#ifdef IPPROTO_FRAGMENT
5972 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974#ifdef IPPROTO_RSVP
5975 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977#ifdef IPPROTO_GRE
5978 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980#ifdef IPPROTO_ESP
5981 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983#ifdef IPPROTO_AH
5984 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986#ifdef IPPROTO_MOBILE
5987 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989#ifdef IPPROTO_ICMPV6
5990 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992#ifdef IPPROTO_NONE
5993 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995#ifdef IPPROTO_DSTOPTS
5996 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998#ifdef IPPROTO_XTP
5999 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001#ifdef IPPROTO_EON
6002 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004#ifdef IPPROTO_PIM
6005 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007#ifdef IPPROTO_IPCOMP
6008 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010#ifdef IPPROTO_VRRP
6011 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006012#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006013#ifdef IPPROTO_SCTP
6014 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016#ifdef IPPROTO_BIP
6017 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006018#endif
6019/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020#ifdef IPPROTO_RAW
6021 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006022#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025#ifdef IPPROTO_MAX
6026 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006027#endif
6028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 /* Some port configuration */
6030#ifdef IPPORT_RESERVED
6031 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006032#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035#ifdef IPPORT_USERRESERVED
6036 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006037#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006039#endif
6040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 /* Some reserved IP v.4 addresses */
6042#ifdef INADDR_ANY
6043 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006044#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047#ifdef INADDR_BROADCAST
6048 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006049#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052#ifdef INADDR_LOOPBACK
6053 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006054#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006055 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057#ifdef INADDR_UNSPEC_GROUP
6058 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006059#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062#ifdef INADDR_ALLHOSTS_GROUP
6063 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6064 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006065#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068#ifdef INADDR_MAX_LOCAL_GROUP
6069 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6070 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006071#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074#ifdef INADDR_NONE
6075 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006076#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006078#endif
6079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 /* IPv4 [gs]etsockopt options */
6081#ifdef IP_OPTIONS
6082 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084#ifdef IP_HDRINCL
6085 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087#ifdef IP_TOS
6088 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090#ifdef IP_TTL
6091 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093#ifdef IP_RECVOPTS
6094 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096#ifdef IP_RECVRETOPTS
6097 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099#ifdef IP_RECVDSTADDR
6100 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102#ifdef IP_RETOPTS
6103 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105#ifdef IP_MULTICAST_IF
6106 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108#ifdef IP_MULTICAST_TTL
6109 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111#ifdef IP_MULTICAST_LOOP
6112 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114#ifdef IP_ADD_MEMBERSHIP
6115 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117#ifdef IP_DROP_MEMBERSHIP
6118 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120#ifdef IP_DEFAULT_MULTICAST_TTL
6121 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6122 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124#ifdef IP_DEFAULT_MULTICAST_LOOP
6125 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6126 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006127#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128#ifdef IP_MAX_MEMBERSHIPS
6129 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006130#endif
6131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6133#ifdef IPV6_JOIN_GROUP
6134 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136#ifdef IPV6_LEAVE_GROUP
6137 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139#ifdef IPV6_MULTICAST_HOPS
6140 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142#ifdef IPV6_MULTICAST_IF
6143 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145#ifdef IPV6_MULTICAST_LOOP
6146 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef IPV6_UNICAST_HOPS
6149 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006152#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006156#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006158#endif
6159#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006161#endif
6162#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006164#endif
6165#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006167#endif
6168#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006170#endif
6171#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006173#endif
6174#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006176#endif
6177#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006179#endif
6180#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006182#endif
6183#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006185#endif
6186#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006188#endif
6189#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006191#endif
6192#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006194#endif
6195#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006197#endif
6198#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006200#endif
6201#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006203#endif
6204#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006206#endif
6207#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006209#endif
6210#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006212#endif
6213#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006215#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 /* TCP options */
6218#ifdef TCP_NODELAY
6219 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221#ifdef TCP_MAXSEG
6222 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef TCP_CORK
6225 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227#ifdef TCP_KEEPIDLE
6228 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230#ifdef TCP_KEEPINTVL
6231 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233#ifdef TCP_KEEPCNT
6234 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236#ifdef TCP_SYNCNT
6237 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239#ifdef TCP_LINGER2
6240 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242#ifdef TCP_DEFER_ACCEPT
6243 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245#ifdef TCP_WINDOW_CLAMP
6246 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248#ifdef TCP_INFO
6249 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251#ifdef TCP_QUICKACK
6252 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006253#endif
6254
Guido van Rossum09be4091999-08-09 14:40:40 +00006255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 /* IPX options */
6257#ifdef IPX_TYPE
6258 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006259#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006262#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006264#endif
6265#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006267#endif
6268#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006270#endif
6271#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006273#endif
6274#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006276#endif
6277#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006279#endif
6280#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006282#endif
6283#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006285#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006286#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006288#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006289#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006291#endif
6292#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006294#endif
6295#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006297#endif
6298#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006300#endif
6301#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006303#endif
6304#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006306#endif
6307#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006309#endif
6310#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006312#endif
6313#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006315#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006316#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006318#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006319#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006320 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006321#endif
6322#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006324#endif
6325#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006327#endif
6328#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006330#endif
6331#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006333#endif
6334#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006336#endif
6337#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006338 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006339#endif
6340#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006342#endif
6343#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006345#endif
6346#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006347 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006348#endif
6349#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006351#endif
6352#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006353 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006354#endif
6355#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006356 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006357#endif
6358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006360#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006362#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006364#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006366#endif
6367#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006369#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006371#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006373#endif
6374#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006376#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006378#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006380#endif
6381
Christian Heimesfaf2f632008-01-06 16:59:19 +00006382#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383 {
6384 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6385 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6386 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006387 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyObject *tmp;
6389 tmp = PyLong_FromUnsignedLong(codes[i]);
6390 if (tmp == NULL)
6391 return NULL;
6392 PyModule_AddObject(m, names[i], tmp);
6393 }
6394 }
6395 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6396 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6397 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006398#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006400#endif
6401#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006403#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006404#endif /* _MSTCPIP_ */
6405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006407#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006411}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006412
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006413
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006414#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006415#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006416
6417/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006418/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006419
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006420int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006421inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006424#if (SIZEOF_INT != 4)
6425#error "Not sure if in_addr_t exists and int is not 32-bits."
6426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 unsigned int packed_addr;
6428 packed_addr = inet_addr(src);
6429 if (packed_addr == INADDR_NONE)
6430 return 0;
6431 memcpy(dst, &packed_addr, 4);
6432 return 1;
6433 }
6434 /* Should set errno to EAFNOSUPPORT */
6435 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006436}
6437
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006438const char *
6439inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 if (af == AF_INET) {
6442 struct in_addr packed_addr;
6443 if (size < 16)
6444 /* Should set errno to ENOSPC. */
6445 return NULL;
6446 memcpy(&packed_addr, src, sizeof(packed_addr));
6447 return strncpy(dst, inet_ntoa(packed_addr), size);
6448 }
6449 /* Should set errno to EAFNOSUPPORT */
6450 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006451}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006452
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006453#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006454#endif