blob: 37ae6d856902408a405083dfb450cd2c9496dedf [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 */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001076 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 }
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;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001272 int retval = 0;
1273
1274 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1275 allow embedded nulls on Linux. */
1276 if (PyUnicode_Check(args)) {
1277 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1278 return 0;
1279 }
1280 else
1281 Py_INCREF(args);
1282 if (!PyArg_Parse(args, "y#", &path, &len))
1283 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001286#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 if (len > 0 && path[0] == 0) {
1288 /* Linux abstract namespace extension */
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");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001292 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 }
1294 }
1295 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001296#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 {
1298 /* regular NULL-terminated string */
1299 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001300 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001302 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 }
1304 addr->sun_path[len] = 0;
1305 }
1306 addr->sun_family = s->sock_family;
1307 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001308#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001310#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001312#endif
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001313 retval = 1;
1314 unix_out:
1315 Py_DECREF(args);
1316 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001318#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001319
Martin v. Löwis11017b12006-01-14 18:12:57 +00001320#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case AF_NETLINK:
1322 {
1323 struct sockaddr_nl* addr;
1324 int pid, groups;
1325 addr = (struct sockaddr_nl *)addr_ret;
1326 if (!PyTuple_Check(args)) {
1327 PyErr_Format(
1328 PyExc_TypeError,
1329 "getsockaddrarg: "
1330 "AF_NETLINK address must be tuple, not %.500s",
1331 Py_TYPE(args)->tp_name);
1332 return 0;
1333 }
1334 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1335 return 0;
1336 addr->nl_family = AF_NETLINK;
1337 addr->nl_pid = pid;
1338 addr->nl_groups = groups;
1339 *len_ret = sizeof(*addr);
1340 return 1;
1341 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001342#endif
1343
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001344#ifdef AF_RDS
1345 case AF_RDS:
1346 /* RDS sockets use sockaddr_in: fall-through */
1347#endif
1348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 case AF_INET:
1350 {
1351 struct sockaddr_in* addr;
1352 char *host;
1353 int port, result;
1354 if (!PyTuple_Check(args)) {
1355 PyErr_Format(
1356 PyExc_TypeError,
1357 "getsockaddrarg: "
1358 "AF_INET address must be tuple, not %.500s",
1359 Py_TYPE(args)->tp_name);
1360 return 0;
1361 }
1362 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1363 "idna", &host, &port))
1364 return 0;
1365 addr=(struct sockaddr_in*)addr_ret;
1366 result = setipaddr(host, (struct sockaddr *)addr,
1367 sizeof(*addr), AF_INET);
1368 PyMem_Free(host);
1369 if (result < 0)
1370 return 0;
1371 if (port < 0 || port > 0xffff) {
1372 PyErr_SetString(
1373 PyExc_OverflowError,
1374 "getsockaddrarg: port must be 0-65535.");
1375 return 0;
1376 }
1377 addr->sin_family = AF_INET;
1378 addr->sin_port = htons((short)port);
1379 *len_ret = sizeof *addr;
1380 return 1;
1381 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001382
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001383#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 case AF_INET6:
1385 {
1386 struct sockaddr_in6* addr;
1387 char *host;
1388 int port, flowinfo, scope_id, result;
1389 flowinfo = scope_id = 0;
1390 if (!PyTuple_Check(args)) {
1391 PyErr_Format(
1392 PyExc_TypeError,
1393 "getsockaddrarg: "
1394 "AF_INET6 address must be tuple, not %.500s",
1395 Py_TYPE(args)->tp_name);
1396 return 0;
1397 }
1398 if (!PyArg_ParseTuple(args, "eti|ii",
1399 "idna", &host, &port, &flowinfo,
1400 &scope_id)) {
1401 return 0;
1402 }
1403 addr = (struct sockaddr_in6*)addr_ret;
1404 result = setipaddr(host, (struct sockaddr *)addr,
1405 sizeof(*addr), AF_INET6);
1406 PyMem_Free(host);
1407 if (result < 0)
1408 return 0;
1409 if (port < 0 || port > 0xffff) {
1410 PyErr_SetString(
1411 PyExc_OverflowError,
1412 "getsockaddrarg: port must be 0-65535.");
1413 return 0;
1414 }
1415 addr->sin6_family = s->sock_family;
1416 addr->sin6_port = htons((short)port);
1417 addr->sin6_flowinfo = flowinfo;
1418 addr->sin6_scope_id = scope_id;
1419 *len_ret = sizeof *addr;
1420 return 1;
1421 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001422#endif
1423
Hye-Shik Chang81268602004-02-02 06:05:24 +00001424#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 case AF_BLUETOOTH:
1426 {
1427 switch (s->sock_proto) {
1428 case BTPROTO_L2CAP:
1429 {
1430 struct sockaddr_l2 *addr;
1431 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 addr = (struct sockaddr_l2 *)addr_ret;
1434 memset(addr, 0, sizeof(struct sockaddr_l2));
1435 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1436 if (!PyArg_ParseTuple(args, "si", &straddr,
1437 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001438 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 "wrong format");
1440 return 0;
1441 }
1442 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1443 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 *len_ret = sizeof *addr;
1446 return 1;
1447 }
1448 case BTPROTO_RFCOMM:
1449 {
1450 struct sockaddr_rc *addr;
1451 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 addr = (struct sockaddr_rc *)addr_ret;
1454 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1455 if (!PyArg_ParseTuple(args, "si", &straddr,
1456 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001457 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 "wrong format");
1459 return 0;
1460 }
1461 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1462 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 *len_ret = sizeof *addr;
1465 return 1;
1466 }
1467 case BTPROTO_HCI:
1468 {
1469 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001470#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001471 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001472
Alexander Belopolskye239d232010-12-08 23:31:48 +00001473 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001474 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001475 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001476 "wrong format");
1477 return 0;
1478 }
1479 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1480 return 0;
1481#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1483 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001484 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 "wrong format");
1486 return 0;
1487 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 *len_ret = sizeof *addr;
1490 return 1;
1491 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001492#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 case BTPROTO_SCO:
1494 {
1495 struct sockaddr_sco *addr;
1496 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 addr = (struct sockaddr_sco *)addr_ret;
1499 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1500 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001501 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 "wrong format");
1503 return 0;
1504 }
1505 straddr = PyBytes_AS_STRING(args);
1506 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1507 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 *len_ret = sizeof *addr;
1510 return 1;
1511 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001514 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 return 0;
1516 }
1517 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001518#endif
1519
Antoine Pitroub156a462010-10-27 20:13:57 +00001520#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 case AF_PACKET:
1522 {
1523 struct sockaddr_ll* addr;
1524 struct ifreq ifr;
1525 char *interfaceName;
1526 int protoNumber;
1527 int hatype = 0;
1528 int pkttype = 0;
1529 char *haddr = NULL;
1530 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 if (!PyTuple_Check(args)) {
1533 PyErr_Format(
1534 PyExc_TypeError,
1535 "getsockaddrarg: "
1536 "AF_PACKET address must be tuple, not %.500s",
1537 Py_TYPE(args)->tp_name);
1538 return 0;
1539 }
1540 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1541 &protoNumber, &pkttype, &hatype,
1542 &haddr, &halen))
1543 return 0;
1544 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1545 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1546 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1547 s->errorhandler();
1548 return 0;
1549 }
1550 if (halen > 8) {
1551 PyErr_SetString(PyExc_ValueError,
1552 "Hardware address must be 8 bytes or less");
1553 return 0;
1554 }
1555 if (protoNumber < 0 || protoNumber > 0xffff) {
1556 PyErr_SetString(
1557 PyExc_OverflowError,
1558 "getsockaddrarg: protoNumber must be 0-65535.");
1559 return 0;
1560 }
1561 addr = (struct sockaddr_ll*)addr_ret;
1562 addr->sll_family = AF_PACKET;
1563 addr->sll_protocol = htons((short)protoNumber);
1564 addr->sll_ifindex = ifr.ifr_ifindex;
1565 addr->sll_pkttype = pkttype;
1566 addr->sll_hatype = hatype;
1567 if (halen != 0) {
1568 memcpy(&addr->sll_addr, haddr, halen);
1569 }
1570 addr->sll_halen = halen;
1571 *len_ret = sizeof *addr;
1572 return 1;
1573 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001574#endif
1575
Christian Heimes043d6f62008-01-07 17:19:16 +00001576#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 case AF_TIPC:
1578 {
1579 unsigned int atype, v1, v2, v3;
1580 unsigned int scope = TIPC_CLUSTER_SCOPE;
1581 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 if (!PyTuple_Check(args)) {
1584 PyErr_Format(
1585 PyExc_TypeError,
1586 "getsockaddrarg: "
1587 "AF_TIPC address must be tuple, not %.500s",
1588 Py_TYPE(args)->tp_name);
1589 return 0;
1590 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 if (!PyArg_ParseTuple(args,
1593 "IIII|I;Invalid TIPC address format",
1594 &atype, &v1, &v2, &v3, &scope))
1595 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 addr = (struct sockaddr_tipc *) addr_ret;
1598 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 addr->family = AF_TIPC;
1601 addr->scope = scope;
1602 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (atype == TIPC_ADDR_NAMESEQ) {
1605 addr->addr.nameseq.type = v1;
1606 addr->addr.nameseq.lower = v2;
1607 addr->addr.nameseq.upper = v3;
1608 } else if (atype == TIPC_ADDR_NAME) {
1609 addr->addr.name.name.type = v1;
1610 addr->addr.name.name.instance = v2;
1611 } else if (atype == TIPC_ADDR_ID) {
1612 addr->addr.id.node = v1;
1613 addr->addr.id.ref = v2;
1614 } else {
1615 /* Shouldn't happen */
1616 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1617 return 0;
1618 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 return 1;
1623 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001624#endif
1625
Charles-François Natali30589c92011-10-07 22:47:08 +02001626#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001627 case AF_CAN:
1628 switch (s->sock_proto) {
1629 case CAN_RAW:
1630 {
1631 struct sockaddr_can *addr;
1632 PyObject *interfaceName;
1633 struct ifreq ifr;
1634 addr = (struct sockaddr_can *)addr_ret;
1635 Py_ssize_t len;
1636
1637 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1638 &interfaceName))
1639 return 0;
1640
1641 len = PyBytes_GET_SIZE(interfaceName);
1642
1643 if (len == 0) {
1644 ifr.ifr_ifindex = 0;
1645 } else if (len < sizeof(ifr.ifr_name)) {
1646 strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName));
1647 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1648 s->errorhandler();
1649 Py_DECREF(interfaceName);
1650 return 0;
1651 }
1652 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001653 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001654 "AF_CAN interface name too long");
1655 Py_DECREF(interfaceName);
1656 return 0;
1657 }
1658
1659 addr->can_family = AF_CAN;
1660 addr->can_ifindex = ifr.ifr_ifindex;
1661
1662 *len_ret = sizeof(*addr);
1663 Py_DECREF(interfaceName);
1664 return 1;
1665 }
1666 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001667 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001668 "getsockaddrarg: unsupported CAN protocol");
1669 return 0;
1670 }
1671#endif
1672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001676 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680}
1681
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682
Guido van Rossum48a680c2001-03-02 06:34:14 +00001683/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001684 Return 1 if the family is known, 0 otherwise. The length is returned
1685 through len_ret. */
1686
1687static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001688getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001691
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001692#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 case AF_UNIX:
1694 {
1695 *len_ret = sizeof (struct sockaddr_un);
1696 return 1;
1697 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001698#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001699#if defined(AF_NETLINK)
1700 case AF_NETLINK:
1701 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 *len_ret = sizeof (struct sockaddr_nl);
1703 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001704 }
1705#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001706
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001707#ifdef AF_RDS
1708 case AF_RDS:
1709 /* RDS sockets use sockaddr_in: fall-through */
1710#endif
1711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 case AF_INET:
1713 {
1714 *len_ret = sizeof (struct sockaddr_in);
1715 return 1;
1716 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001717
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001718#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 case AF_INET6:
1720 {
1721 *len_ret = sizeof (struct sockaddr_in6);
1722 return 1;
1723 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001724#endif
1725
Hye-Shik Chang81268602004-02-02 06:05:24 +00001726#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 case AF_BLUETOOTH:
1728 {
1729 switch(s->sock_proto)
1730 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 case BTPROTO_L2CAP:
1733 *len_ret = sizeof (struct sockaddr_l2);
1734 return 1;
1735 case BTPROTO_RFCOMM:
1736 *len_ret = sizeof (struct sockaddr_rc);
1737 return 1;
1738 case BTPROTO_HCI:
1739 *len_ret = sizeof (struct sockaddr_hci);
1740 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001741#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 case BTPROTO_SCO:
1743 *len_ret = sizeof (struct sockaddr_sco);
1744 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001747 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 "unknown BT protocol");
1749 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 }
1752 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001753#endif
1754
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001755#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 case AF_PACKET:
1757 {
1758 *len_ret = sizeof (struct sockaddr_ll);
1759 return 1;
1760 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001761#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001762
Christian Heimes043d6f62008-01-07 17:19:16 +00001763#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 case AF_TIPC:
1765 {
1766 *len_ret = sizeof (struct sockaddr_tipc);
1767 return 1;
1768 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001769#endif
1770
Charles-François Natali30589c92011-10-07 22:47:08 +02001771#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001772 case AF_CAN:
1773 {
1774 *len_ret = sizeof (struct sockaddr_can);
1775 return 1;
1776 }
1777#endif
1778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001782 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001786}
1787
1788
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001789/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1790 Currently, these methods are only compiled if the RFC 2292/3542
1791 CMSG_LEN() macro is available. Older systems seem to have used
1792 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1793 it may be possible to define CMSG_LEN() that way if it's not
1794 provided. Some architectures might need extra padding after the
1795 cmsghdr, however, and CMSG_LEN() would have to take account of
1796 this. */
1797#ifdef CMSG_LEN
1798/* If length is in range, set *result to CMSG_LEN(length) and return
1799 true; otherwise, return false. */
1800static int
1801get_CMSG_LEN(size_t length, size_t *result)
1802{
1803 size_t tmp;
1804
1805 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1806 return 0;
1807 tmp = CMSG_LEN(length);
1808 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1809 return 0;
1810 *result = tmp;
1811 return 1;
1812}
1813
1814#ifdef CMSG_SPACE
1815/* If length is in range, set *result to CMSG_SPACE(length) and return
1816 true; otherwise, return false. */
1817static int
1818get_CMSG_SPACE(size_t length, size_t *result)
1819{
1820 size_t tmp;
1821
1822 /* Use CMSG_SPACE(1) here in order to take account of the padding
1823 necessary before *and* after the data. */
1824 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1825 return 0;
1826 tmp = CMSG_SPACE(length);
1827 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1828 return 0;
1829 *result = tmp;
1830 return 1;
1831}
1832#endif
1833
1834/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1835 pointer in msg->msg_control with at least "space" bytes after it,
1836 and its cmsg_len member inside the buffer. */
1837static int
1838cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1839{
1840 size_t cmsg_offset;
1841 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1842 sizeof(cmsgh->cmsg_len));
1843
Charles-François Natali466517d2011-08-28 18:23:43 +02001844 /* Note that POSIX allows msg_controllen to be of signed type. */
1845 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001846 return 0;
1847 if (space < cmsg_len_end)
1848 space = cmsg_len_end;
1849 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1850 return (cmsg_offset <= (size_t)-1 - space &&
1851 cmsg_offset + space <= msg->msg_controllen);
1852}
1853
1854/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1855 *space to number of bytes following it in the buffer and return
1856 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1857 msg->msg_controllen are valid. */
1858static int
1859get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1860{
1861 size_t data_offset;
1862 char *data_ptr;
1863
1864 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1865 return 0;
1866 data_offset = data_ptr - (char *)msg->msg_control;
1867 if (data_offset > msg->msg_controllen)
1868 return 0;
1869 *space = msg->msg_controllen - data_offset;
1870 return 1;
1871}
1872
1873/* If cmsgh is invalid or not contained in the buffer pointed to by
1874 msg->msg_control, return -1. If cmsgh is valid and its associated
1875 data is entirely contained in the buffer, set *data_len to the
1876 length of the associated data and return 0. If only part of the
1877 associated data is contained in the buffer but cmsgh is otherwise
1878 valid, set *data_len to the length contained in the buffer and
1879 return 1. */
1880static int
1881get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1882{
1883 size_t space, cmsg_data_len;
1884
1885 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1886 cmsgh->cmsg_len < CMSG_LEN(0))
1887 return -1;
1888 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1889 if (!get_cmsg_data_space(msg, cmsgh, &space))
1890 return -1;
1891 if (space >= cmsg_data_len) {
1892 *data_len = cmsg_data_len;
1893 return 0;
1894 }
1895 *data_len = space;
1896 return 1;
1897}
1898#endif /* CMSG_LEN */
1899
1900
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001901/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001902
Guido van Rossum73624e91994-10-10 17:59:00 +00001903static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001904sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 sock_addr_t addrbuf;
1907 SOCKET_T newfd = INVALID_SOCKET;
1908 socklen_t addrlen;
1909 PyObject *sock = NULL;
1910 PyObject *addr = NULL;
1911 PyObject *res = NULL;
1912 int timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 if (!getsockaddrlen(s, &addrlen))
1914 return NULL;
1915 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 if (!IS_SELECTABLE(s))
1918 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001919
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001920 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001922 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001923 if (!timeout) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 if (timeout == 1) {
1929 PyErr_SetString(socket_timeout, "timed out");
1930 return NULL;
1931 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001932 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 if (newfd == INVALID_SOCKET)
1935 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 sock = PyLong_FromSocket_t(newfd);
1938 if (sock == NULL) {
1939 SOCKETCLOSE(newfd);
1940 goto finally;
1941 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1944 addrlen, s->sock_proto);
1945 if (addr == NULL)
1946 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001949
Guido van Rossum67f7a382002-06-06 21:08:16 +00001950finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 Py_XDECREF(sock);
1952 Py_XDECREF(addr);
1953 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001954}
1955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001956PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001957"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001958\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001959Wait for an incoming connection. Return a new socket file descriptor\n\
1960representing the connection, and the address of the client.\n\
1961For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962
Guido van Rossum11ba0942002-06-13 15:07:44 +00001963/* s.setblocking(flag) method. Argument:
1964 False -- non-blocking mode; same as settimeout(0)
1965 True -- blocking mode; same as settimeout(None)
1966*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001967
Guido van Rossum73624e91994-10-10 17:59:00 +00001968static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001969sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 block = PyLong_AsLong(arg);
1974 if (block == -1 && PyErr_Occurred())
1975 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 s->sock_timeout = block ? -1.0 : 0.0;
1978 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 Py_INCREF(Py_None);
1981 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001982}
Guido van Rossume4485b01994-09-07 14:32:49 +00001983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001984PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001985"setblocking(flag)\n\
1986\n\
1987Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001988setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001989setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990
Guido van Rossum11ba0942002-06-13 15:07:44 +00001991/* s.settimeout(timeout) method. Argument:
1992 None -- no timeout, blocking mode; same as setblocking(True)
1993 0.0 -- non-blocking mode; same as setblocking(False)
1994 > 0 -- timeout mode; operations time out after timeout seconds
1995 < 0 -- illegal; raises an exception
1996*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 if (arg == Py_None)
2003 timeout = -1.0;
2004 else {
2005 timeout = PyFloat_AsDouble(arg);
2006 if (timeout < 0.0) {
2007 if (!PyErr_Occurred())
2008 PyErr_SetString(PyExc_ValueError,
2009 "Timeout value out of range");
2010 return NULL;
2011 }
2012 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 s->sock_timeout = timeout;
2015 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 Py_INCREF(Py_None);
2018 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002019}
2020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002021PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002022"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002023\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002024Set a timeout on socket operations. 'timeout' can be a float,\n\
2025giving in seconds, or None. Setting a timeout of None disables\n\
2026the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002028
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002029/* s.gettimeout() method.
2030 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002031static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002032sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 if (s->sock_timeout < 0.0) {
2035 Py_INCREF(Py_None);
2036 return Py_None;
2037 }
2038 else
2039 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002040}
2041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002043"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002044\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002045Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002046operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002047operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002048
Guido van Rossumaee08791992-09-08 09:05:33 +00002049/* s.setsockopt() method.
2050 With an integer third argument, sets an integer option.
2051 With a string third argument, sets an option from a buffer;
2052 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002053
Guido van Rossum73624e91994-10-10 17:59:00 +00002054static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002055sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 int level;
2058 int optname;
2059 int res;
2060 char *buf;
2061 int buflen;
2062 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 if (PyArg_ParseTuple(args, "iii:setsockopt",
2065 &level, &optname, &flag)) {
2066 buf = (char *) &flag;
2067 buflen = sizeof flag;
2068 }
2069 else {
2070 PyErr_Clear();
2071 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2072 &level, &optname, &buf, &buflen))
2073 return NULL;
2074 }
2075 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2076 if (res < 0)
2077 return s->errorhandler();
2078 Py_INCREF(Py_None);
2079 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002080}
2081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002082PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002083"setsockopt(level, option, value)\n\
2084\n\
2085Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002086The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002087
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002088
Guido van Rossumaee08791992-09-08 09:05:33 +00002089/* s.getsockopt() method.
2090 With two arguments, retrieves an integer option.
2091 With a third integer argument, retrieves a string buffer of that size;
2092 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002093
Guido van Rossum73624e91994-10-10 17:59:00 +00002094static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002095sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 int level;
2098 int optname;
2099 int res;
2100 PyObject *buf;
2101 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2104 &level, &optname, &buflen))
2105 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 if (buflen == 0) {
2108 int flag = 0;
2109 socklen_t flagsize = sizeof flag;
2110 res = getsockopt(s->sock_fd, level, optname,
2111 (void *)&flag, &flagsize);
2112 if (res < 0)
2113 return s->errorhandler();
2114 return PyLong_FromLong(flag);
2115 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002116#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 /* socklen_t is unsigned so no negative test is needed,
2118 test buflen == 0 is previously done */
2119 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002120#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002122#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002123 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 "getsockopt buflen out of range");
2125 return NULL;
2126 }
2127 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2128 if (buf == NULL)
2129 return NULL;
2130 res = getsockopt(s->sock_fd, level, optname,
2131 (void *)PyBytes_AS_STRING(buf), &buflen);
2132 if (res < 0) {
2133 Py_DECREF(buf);
2134 return s->errorhandler();
2135 }
2136 _PyBytes_Resize(&buf, buflen);
2137 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002138}
2139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002140PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002141"getsockopt(level, option[, buffersize]) -> value\n\
2142\n\
2143Get a socket option. See the Unix manual for level and option.\n\
2144If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002145string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002146
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002147
Fred Drake728819a2000-07-01 03:40:12 +00002148/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002149
Guido van Rossum73624e91994-10-10 17:59:00 +00002150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 sock_addr_t addrbuf;
2154 int addrlen;
2155 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2158 return NULL;
2159 Py_BEGIN_ALLOW_THREADS
2160 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2161 Py_END_ALLOW_THREADS
2162 if (res < 0)
2163 return s->errorhandler();
2164 Py_INCREF(Py_None);
2165 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002166}
2167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002168PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169"bind(address)\n\
2170\n\
2171Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002172pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002173sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002174
Guido van Rossum30a685f1991-06-27 15:51:29 +00002175
2176/* s.close() method.
2177 Set the file descriptor to -1 so operations tried subsequently
2178 will surely fail. */
2179
Guido van Rossum73624e91994-10-10 17:59:00 +00002180static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002181sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 if ((fd = s->sock_fd) != -1) {
2186 s->sock_fd = -1;
2187 Py_BEGIN_ALLOW_THREADS
2188 (void) SOCKETCLOSE(fd);
2189 Py_END_ALLOW_THREADS
2190 }
2191 Py_INCREF(Py_None);
2192 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002193}
2194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002195PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002196"close()\n\
2197\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002198Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002199
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002200static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002201sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002202{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002203 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002204 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002205 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002206}
2207
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002208PyDoc_STRVAR(detach_doc,
2209"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002210\n\
2211Close the socket object without closing the underlying file descriptor.\
2212The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002213can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002214
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002215static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002216internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 timeout = 0;
2222 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002223
2224#ifdef MS_WINDOWS
2225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 if (s->sock_timeout > 0.0) {
2227 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2228 IS_SELECTABLE(s)) {
2229 /* This is a mess. Best solution: trust select */
2230 fd_set fds;
2231 fd_set fds_exc;
2232 struct timeval tv;
2233 tv.tv_sec = (int)s->sock_timeout;
2234 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2235 FD_ZERO(&fds);
2236 FD_SET(s->sock_fd, &fds);
2237 FD_ZERO(&fds_exc);
2238 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002239 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2240 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (res == 0) {
2242 res = WSAEWOULDBLOCK;
2243 timeout = 1;
2244 } else if (res > 0) {
2245 if (FD_ISSET(s->sock_fd, &fds))
2246 /* The socket is in the writable set - this
2247 means connected */
2248 res = 0;
2249 else {
2250 /* As per MS docs, we need to call getsockopt()
2251 to get the underlying error */
2252 int res_size = sizeof res;
2253 /* It must be in the exception set */
2254 assert(FD_ISSET(s->sock_fd, &fds_exc));
2255 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2256 (char *)&res, &res_size))
2257 /* getsockopt also clears WSAGetLastError,
2258 so reset it back. */
2259 WSASetLastError(res);
2260 else
2261 res = WSAGetLastError();
2262 }
2263 }
2264 /* else if (res < 0) an error occurred */
2265 }
2266 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (res < 0)
2269 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002270
2271#else
2272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 if (s->sock_timeout > 0.0) {
2274 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2275 timeout = internal_select(s, 1);
2276 if (timeout == 0) {
2277 /* Bug #1019808: in case of an EINPROGRESS,
2278 use getsockopt(SO_ERROR) to get the real
2279 error. */
2280 socklen_t res_size = sizeof res;
2281 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2282 SO_ERROR, &res, &res_size);
2283 if (res == EISCONN)
2284 res = 0;
2285 errno = res;
2286 }
2287 else if (timeout == -1) {
2288 res = errno; /* had error */
2289 }
2290 else
2291 res = EWOULDBLOCK; /* timed out */
2292 }
2293 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (res < 0)
2296 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002297
2298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002302}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002303
Fred Drake728819a2000-07-01 03:40:12 +00002304/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002305
Guido van Rossum73624e91994-10-10 17:59:00 +00002306static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002307sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 sock_addr_t addrbuf;
2310 int addrlen;
2311 int res;
2312 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2315 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 Py_BEGIN_ALLOW_THREADS
2318 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2319 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 if (timeout == 1) {
2322 PyErr_SetString(socket_timeout, "timed out");
2323 return NULL;
2324 }
2325 if (res != 0)
2326 return s->errorhandler();
2327 Py_INCREF(Py_None);
2328 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002329}
2330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002331PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332"connect(address)\n\
2333\n\
2334Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002335is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002336
Guido van Rossum30a685f1991-06-27 15:51:29 +00002337
Fred Drake728819a2000-07-01 03:40:12 +00002338/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002339
2340static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002341sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 sock_addr_t addrbuf;
2344 int addrlen;
2345 int res;
2346 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2349 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 Py_BEGIN_ALLOW_THREADS
2352 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2353 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 /* Signals are not errors (though they may raise exceptions). Adapted
2356 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002357#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 if (res == EINTR && PyErr_CheckSignals())
2359 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002360#endif
2361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002363}
2364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002365PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002366"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367\n\
2368This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002369instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002370
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002371
Guido van Rossumed233a51992-06-23 09:07:03 +00002372/* s.fileno() method */
2373
Guido van Rossum73624e91994-10-10 17:59:00 +00002374static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002378}
2379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002380PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002381"fileno() -> integer\n\
2382\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002383Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002384
Guido van Rossumed233a51992-06-23 09:07:03 +00002385
Guido van Rossumc89705d1992-11-26 08:54:07 +00002386/* s.getsockname() method */
2387
Guido van Rossum73624e91994-10-10 17:59:00 +00002388static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 sock_addr_t addrbuf;
2392 int res;
2393 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (!getsockaddrlen(s, &addrlen))
2396 return NULL;
2397 memset(&addrbuf, 0, addrlen);
2398 Py_BEGIN_ALLOW_THREADS
2399 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2400 Py_END_ALLOW_THREADS
2401 if (res < 0)
2402 return s->errorhandler();
2403 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2404 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002405}
2406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002408"getsockname() -> address info\n\
2409\n\
2410Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002411info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002412
Guido van Rossumc89705d1992-11-26 08:54:07 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002415/* s.getpeername() method */
2416
Guido van Rossum73624e91994-10-10 17:59:00 +00002417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 sock_addr_t addrbuf;
2421 int res;
2422 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 if (!getsockaddrlen(s, &addrlen))
2425 return NULL;
2426 memset(&addrbuf, 0, addrlen);
2427 Py_BEGIN_ALLOW_THREADS
2428 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2429 Py_END_ALLOW_THREADS
2430 if (res < 0)
2431 return s->errorhandler();
2432 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2433 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002434}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002436PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002437"getpeername() -> address info\n\
2438\n\
2439Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002440info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002441
Guido van Rossumb6775db1994-08-01 11:34:53 +00002442#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002443
2444
Guido van Rossum30a685f1991-06-27 15:51:29 +00002445/* s.listen(n) method */
2446
Guido van Rossum73624e91994-10-10 17:59:00 +00002447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 int backlog;
2451 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 backlog = PyLong_AsLong(arg);
2454 if (backlog == -1 && PyErr_Occurred())
2455 return NULL;
2456 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002457 /* To avoid problems on systems that don't allow a negative backlog
2458 * (which doesn't make sense anyway) we force a minimum value of 0. */
2459 if (backlog < 0)
2460 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 res = listen(s->sock_fd, backlog);
2462 Py_END_ALLOW_THREADS
2463 if (res < 0)
2464 return s->errorhandler();
2465 Py_INCREF(Py_None);
2466 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002467}
2468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002469PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002470"listen(backlog)\n\
2471\n\
2472Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002473least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2474unaccepted connections that the system will allow before refusing new\n\
2475connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002476
2477
Thomas Wouters477c8d52006-05-27 19:21:47 +00002478/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002479 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002480 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002481 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002482 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002483 * also possible that we return a number of bytes smaller than the request
2484 * bytes.
2485 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002486
Antoine Pitrou19467d22010-08-17 19:33:30 +00002487static Py_ssize_t
2488sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002489{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002490 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002492#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 int remaining;
2494 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002495#endif
2496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 if (!IS_SELECTABLE(s)) {
2498 select_error();
2499 return -1;
2500 }
2501 if (len == 0) {
2502 /* If 0 bytes were requested, do nothing. */
2503 return 0;
2504 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002505
2506#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002507 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002509 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 if (!timeout)
2511 outlen = recv(s->sock_fd, cbuf, len, flags);
2512 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 if (timeout == 1) {
2515 PyErr_SetString(socket_timeout, "timed out");
2516 return -1;
2517 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002518 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 if (outlen < 0) {
2520 /* Note: the call to errorhandler() ALWAYS indirectly returned
2521 NULL, so ignore its return value */
2522 s->errorhandler();
2523 return -1;
2524 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002525#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 read_buf = cbuf;
2527 remaining = len;
2528 while (remaining != 0) {
2529 unsigned int segment;
2530 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 segment = remaining /SEGMENT_SIZE;
2533 if (segment != 0) {
2534 segment = SEGMENT_SIZE;
2535 }
2536 else {
2537 segment = remaining;
2538 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002539
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002540 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002542 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 if (!timeout)
2544 nread = recv(s->sock_fd, read_buf, segment, flags);
2545 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 if (timeout == 1) {
2547 PyErr_SetString(socket_timeout, "timed out");
2548 return -1;
2549 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002550 END_SELECT_LOOP(s)
2551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 if (nread < 0) {
2553 s->errorhandler();
2554 return -1;
2555 }
2556 if (nread != remaining) {
2557 read_buf += nread;
2558 break;
2559 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 remaining -= segment;
2562 read_buf += segment;
2563 }
2564 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002565#endif /* !__VMS */
2566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002568}
2569
Guido van Rossum48a680c2001-03-02 06:34:14 +00002570
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002571/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002572
Guido van Rossum73624e91994-10-10 17:59:00 +00002573static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002574sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002575{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002576 Py_ssize_t recvlen, outlen;
2577 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579
Antoine Pitrou19467d22010-08-17 19:33:30 +00002580 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 if (recvlen < 0) {
2584 PyErr_SetString(PyExc_ValueError,
2585 "negative buffersize in recv");
2586 return NULL;
2587 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 /* Allocate a new string. */
2590 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2591 if (buf == NULL)
2592 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 /* Call the guts */
2595 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2596 if (outlen < 0) {
2597 /* An error occurred, release the string and return an
2598 error. */
2599 Py_DECREF(buf);
2600 return NULL;
2601 }
2602 if (outlen != recvlen) {
2603 /* We did not read as many bytes as we anticipated, resize the
2604 string if possible and be successful. */
2605 _PyBytes_Resize(&buf, outlen);
2606 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002609}
2610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002611PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002612"recv(buffersize[, flags]) -> data\n\
2613\n\
2614Receive up to buffersize bytes from the socket. For the optional flags\n\
2615argument, see the Unix manual. When no data is available, block until\n\
2616at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002617the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002618
Guido van Rossum30a685f1991-06-27 15:51:29 +00002619
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002620/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002621
Thomas Wouters477c8d52006-05-27 19:21:47 +00002622static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002623sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002626
Antoine Pitrou19467d22010-08-17 19:33:30 +00002627 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 Py_buffer pbuf;
2629 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002630 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002633 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 &pbuf, &recvlen, &flags))
2635 return NULL;
2636 buf = pbuf.buf;
2637 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (recvlen < 0) {
2640 PyBuffer_Release(&pbuf);
2641 PyErr_SetString(PyExc_ValueError,
2642 "negative buffersize in recv_into");
2643 return NULL;
2644 }
2645 if (recvlen == 0) {
2646 /* If nbytes was not specified, use the buffer's length */
2647 recvlen = buflen;
2648 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 /* Check if the buffer is large enough */
2651 if (buflen < recvlen) {
2652 PyBuffer_Release(&pbuf);
2653 PyErr_SetString(PyExc_ValueError,
2654 "buffer too small for requested bytes");
2655 return NULL;
2656 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 /* Call the guts */
2659 readlen = sock_recv_guts(s, buf, recvlen, flags);
2660 if (readlen < 0) {
2661 /* Return an error. */
2662 PyBuffer_Release(&pbuf);
2663 return NULL;
2664 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 PyBuffer_Release(&pbuf);
2667 /* Return the number of bytes read. Note that we do not do anything
2668 special here in the case that readlen < recvlen. */
2669 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670}
2671
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002672PyDoc_STRVAR(recv_into_doc,
2673"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002674\n\
2675A version of recv() that stores its data into a buffer rather than creating \n\
2676a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2677is not specified (or 0), receive up to the size available in the given buffer.\n\
2678\n\
2679See recv() for documentation about the flags.");
2680
2681
2682/*
Christian Heimes99170a52007-12-19 02:07:34 +00002683 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2684 * into a char buffer. If you have any inc/def ref to do to the objects that
2685 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002686 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002687 * that it is also possible that we return a number of bytes smaller than the
2688 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002689 *
2690 * 'addr' is a return value for the address object. Note that you must decref
2691 * it yourself.
2692 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002693static Py_ssize_t
2694sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 sock_addr_t addrbuf;
2698 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002699 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 if (!getsockaddrlen(s, &addrlen))
2705 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 if (!IS_SELECTABLE(s)) {
2708 select_error();
2709 return -1;
2710 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002711
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002712 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 Py_BEGIN_ALLOW_THREADS
2714 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002715 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002717#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002718#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 n = recvfrom(s->sock_fd, cbuf, len, flags,
2720 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002721#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 n = recvfrom(s->sock_fd, cbuf, len, flags,
2723 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002724#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002725#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 n = recvfrom(s->sock_fd, cbuf, len, flags,
2727 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 }
2730 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 if (timeout == 1) {
2733 PyErr_SetString(socket_timeout, "timed out");
2734 return -1;
2735 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002736 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (n < 0) {
2738 s->errorhandler();
2739 return -1;
2740 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2743 addrlen, s->sock_proto)))
2744 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002747}
2748
2749/* s.recvfrom(nbytes [,flags]) method */
2750
2751static PyObject *
2752sock_recvfrom(PySocketSockObject *s, PyObject *args)
2753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 PyObject *buf = NULL;
2755 PyObject *addr = NULL;
2756 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002757 int flags = 0;
2758 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002759
Antoine Pitrou19467d22010-08-17 19:33:30 +00002760 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 if (recvlen < 0) {
2764 PyErr_SetString(PyExc_ValueError,
2765 "negative buffersize in recvfrom");
2766 return NULL;
2767 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2770 if (buf == NULL)
2771 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2774 recvlen, flags, &addr);
2775 if (outlen < 0) {
2776 goto finally;
2777 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 if (outlen != recvlen) {
2780 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002781 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002783 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 goto finally;
2785 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002788
2789finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 Py_XDECREF(buf);
2791 Py_XDECREF(addr);
2792 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002793}
2794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002795PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002796"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2797\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002799
Thomas Wouters477c8d52006-05-27 19:21:47 +00002800
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002801/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002802
2803static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002804sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002807
Antoine Pitrou19467d22010-08-17 19:33:30 +00002808 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 Py_buffer pbuf;
2810 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002811 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002814
Antoine Pitrou19467d22010-08-17 19:33:30 +00002815 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 kwlist, &pbuf,
2817 &recvlen, &flags))
2818 return NULL;
2819 buf = pbuf.buf;
2820 buflen = pbuf.len;
2821 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 if (recvlen < 0) {
2824 PyBuffer_Release(&pbuf);
2825 PyErr_SetString(PyExc_ValueError,
2826 "negative buffersize in recvfrom_into");
2827 return NULL;
2828 }
2829 if (recvlen == 0) {
2830 /* If nbytes was not specified, use the buffer's length */
2831 recvlen = buflen;
2832 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2835 if (readlen < 0) {
2836 PyBuffer_Release(&pbuf);
2837 /* Return an error */
2838 Py_XDECREF(addr);
2839 return NULL;
2840 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 PyBuffer_Release(&pbuf);
2843 /* Return the number of bytes read and the address. Note that we do
2844 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002845 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846}
2847
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002848PyDoc_STRVAR(recvfrom_into_doc,
2849"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002851Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002852
2853
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002854/* The sendmsg() and recvmsg[_into]() methods require a working
2855 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2856#ifdef CMSG_LEN
2857/*
2858 * Call recvmsg() with the supplied iovec structures, flags, and
2859 * ancillary data buffer size (controllen). Returns the tuple return
2860 * value for recvmsg() or recvmsg_into(), with the first item provided
2861 * by the supplied makeval() function. makeval() will be called with
2862 * the length read and makeval_data as arguments, and must return a
2863 * new reference (which will be decrefed if there is a subsequent
2864 * error). On error, closes any file descriptors received via
2865 * SCM_RIGHTS.
2866 */
2867static PyObject *
2868sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2869 int flags, Py_ssize_t controllen,
2870 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2871{
2872 ssize_t bytes_received = -1;
2873 int timeout;
2874 sock_addr_t addrbuf;
2875 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002876 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002877 PyObject *cmsg_list = NULL, *retval = NULL;
2878 void *controlbuf = NULL;
2879 struct cmsghdr *cmsgh;
2880 size_t cmsgdatalen = 0;
2881 int cmsg_status;
2882
2883 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2884 ignored" when the socket is connected (Linux fills them in
2885 anyway for AF_UNIX sockets at least). Normally msg_namelen
2886 seems to be set to 0 if there's no address, but try to
2887 initialize msg_name to something that won't be mistaken for a
2888 real address if that doesn't happen. */
2889 if (!getsockaddrlen(s, &addrbuflen))
2890 return NULL;
2891 memset(&addrbuf, 0, addrbuflen);
2892 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2893
2894 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2895 PyErr_SetString(PyExc_ValueError,
2896 "invalid ancillary data buffer length");
2897 return NULL;
2898 }
2899 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2900 return PyErr_NoMemory();
2901
2902 /* Make the system call. */
2903 if (!IS_SELECTABLE(s)) {
2904 select_error();
2905 goto finally;
2906 }
2907
2908 BEGIN_SELECT_LOOP(s)
2909 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002910 msg.msg_name = SAS2SA(&addrbuf);
2911 msg.msg_namelen = addrbuflen;
2912 msg.msg_iov = iov;
2913 msg.msg_iovlen = iovlen;
2914 msg.msg_control = controlbuf;
2915 msg.msg_controllen = controllen;
2916 timeout = internal_select_ex(s, 0, interval);
2917 if (!timeout)
2918 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2919 Py_END_ALLOW_THREADS;
2920 if (timeout == 1) {
2921 PyErr_SetString(socket_timeout, "timed out");
2922 goto finally;
2923 }
2924 END_SELECT_LOOP(s)
2925
2926 if (bytes_received < 0) {
2927 s->errorhandler();
2928 goto finally;
2929 }
2930
2931 /* Make list of (level, type, data) tuples from control messages. */
2932 if ((cmsg_list = PyList_New(0)) == NULL)
2933 goto err_closefds;
2934 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2935 implementations didn't do so. */
2936 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2937 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2938 PyObject *bytes, *tuple;
2939 int tmp;
2940
2941 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2942 if (cmsg_status != 0) {
2943 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2944 "received malformed or improperly-truncated "
2945 "ancillary data", 1) == -1)
2946 goto err_closefds;
2947 }
2948 if (cmsg_status < 0)
2949 break;
2950 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002951 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002952 goto err_closefds;
2953 }
2954
2955 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
2956 cmsgdatalen);
2957 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
2958 (int)cmsgh->cmsg_type, bytes);
2959 if (tuple == NULL)
2960 goto err_closefds;
2961 tmp = PyList_Append(cmsg_list, tuple);
2962 Py_DECREF(tuple);
2963 if (tmp != 0)
2964 goto err_closefds;
2965
2966 if (cmsg_status != 0)
2967 break;
2968 }
2969
2970 retval = Py_BuildValue("NOiN",
2971 (*makeval)(bytes_received, makeval_data),
2972 cmsg_list,
2973 (int)msg.msg_flags,
2974 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2975 ((msg.msg_namelen > addrbuflen) ?
2976 addrbuflen : msg.msg_namelen),
2977 s->sock_proto));
2978 if (retval == NULL)
2979 goto err_closefds;
2980
2981finally:
2982 Py_XDECREF(cmsg_list);
2983 PyMem_Free(controlbuf);
2984 return retval;
2985
2986err_closefds:
2987#ifdef SCM_RIGHTS
2988 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
2989 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2990 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2991 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2992 if (cmsg_status < 0)
2993 break;
2994 if (cmsgh->cmsg_level == SOL_SOCKET &&
2995 cmsgh->cmsg_type == SCM_RIGHTS) {
2996 size_t numfds;
2997 int *fdp;
2998
2999 numfds = cmsgdatalen / sizeof(int);
3000 fdp = (int *)CMSG_DATA(cmsgh);
3001 while (numfds-- > 0)
3002 close(*fdp++);
3003 }
3004 if (cmsg_status != 0)
3005 break;
3006 }
3007#endif /* SCM_RIGHTS */
3008 goto finally;
3009}
3010
3011
3012static PyObject *
3013makeval_recvmsg(ssize_t received, void *data)
3014{
3015 PyObject **buf = data;
3016
3017 if (received < PyBytes_GET_SIZE(*buf))
3018 _PyBytes_Resize(buf, received);
3019 Py_XINCREF(*buf);
3020 return *buf;
3021}
3022
3023/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3024
3025static PyObject *
3026sock_recvmsg(PySocketSockObject *s, PyObject *args)
3027{
3028 Py_ssize_t bufsize, ancbufsize = 0;
3029 int flags = 0;
3030 struct iovec iov;
3031 PyObject *buf = NULL, *retval = NULL;
3032
3033 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3034 return NULL;
3035
3036 if (bufsize < 0) {
3037 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3038 return NULL;
3039 }
3040 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3041 return NULL;
3042 iov.iov_base = PyBytes_AS_STRING(buf);
3043 iov.iov_len = bufsize;
3044
3045 /* Note that we're passing a pointer to *our pointer* to the bytes
3046 object here (&buf); makeval_recvmsg() may incref the object, or
3047 deallocate it and set our pointer to NULL. */
3048 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3049 &makeval_recvmsg, &buf);
3050 Py_XDECREF(buf);
3051 return retval;
3052}
3053
3054PyDoc_STRVAR(recvmsg_doc,
3055"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3056\n\
3057Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3058socket. The ancbufsize argument sets the size in bytes of the\n\
3059internal buffer used to receive the ancillary data; it defaults to 0,\n\
3060meaning that no ancillary data will be received. Appropriate buffer\n\
3061sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3062CMSG_LEN(), and items which do not fit into the buffer might be\n\
3063truncated or discarded. The flags argument defaults to 0 and has the\n\
3064same meaning as for recv().\n\
3065\n\
3066The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3067The data item is a bytes object holding the non-ancillary data\n\
3068received. The ancdata item is a list of zero or more tuples\n\
3069(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3070(control messages) received: cmsg_level and cmsg_type are integers\n\
3071specifying the protocol level and protocol-specific type respectively,\n\
3072and cmsg_data is a bytes object holding the associated data. The\n\
3073msg_flags item is the bitwise OR of various flags indicating\n\
3074conditions on the received message; see your system documentation for\n\
3075details. If the receiving socket is unconnected, address is the\n\
3076address of the sending socket, if available; otherwise, its value is\n\
3077unspecified.\n\
3078\n\
3079If recvmsg() raises an exception after the system call returns, it\n\
3080will first attempt to close any file descriptors received via the\n\
3081SCM_RIGHTS mechanism.");
3082
3083
3084static PyObject *
3085makeval_recvmsg_into(ssize_t received, void *data)
3086{
3087 return PyLong_FromSsize_t(received);
3088}
3089
3090/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3091
3092static PyObject *
3093sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3094{
3095 Py_ssize_t ancbufsize = 0;
3096 int flags = 0;
3097 struct iovec *iovs = NULL;
3098 Py_ssize_t i, nitems, nbufs = 0;
3099 Py_buffer *bufs = NULL;
3100 PyObject *buffers_arg, *fast, *retval = NULL;
3101
3102 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3103 &buffers_arg, &ancbufsize, &flags))
3104 return NULL;
3105
3106 if ((fast = PySequence_Fast(buffers_arg,
3107 "recvmsg_into() argument 1 must be an "
3108 "iterable")) == NULL)
3109 return NULL;
3110 nitems = PySequence_Fast_GET_SIZE(fast);
3111 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003112 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003113 goto finally;
3114 }
3115
3116 /* Fill in an iovec for each item, and save the Py_buffer
3117 structs to release afterwards. */
3118 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3119 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3120 PyErr_NoMemory();
3121 goto finally;
3122 }
3123 for (; nbufs < nitems; nbufs++) {
3124 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3125 "w*;recvmsg_into() argument 1 must be an iterable "
3126 "of single-segment read-write buffers",
3127 &bufs[nbufs]))
3128 goto finally;
3129 iovs[nbufs].iov_base = bufs[nbufs].buf;
3130 iovs[nbufs].iov_len = bufs[nbufs].len;
3131 }
3132
3133 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3134 &makeval_recvmsg_into, NULL);
3135finally:
3136 for (i = 0; i < nbufs; i++)
3137 PyBuffer_Release(&bufs[i]);
3138 PyMem_Free(bufs);
3139 PyMem_Free(iovs);
3140 Py_DECREF(fast);
3141 return retval;
3142}
3143
3144PyDoc_STRVAR(recvmsg_into_doc,
3145"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3146\n\
3147Receive normal data and ancillary data from the socket, scattering the\n\
3148non-ancillary data into a series of buffers. The buffers argument\n\
3149must be an iterable of objects that export writable buffers\n\
3150(e.g. bytearray objects); these will be filled with successive chunks\n\
3151of the non-ancillary data until it has all been written or there are\n\
3152no more buffers. The ancbufsize argument sets the size in bytes of\n\
3153the internal buffer used to receive the ancillary data; it defaults to\n\
31540, meaning that no ancillary data will be received. Appropriate\n\
3155buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3156or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3157truncated or discarded. The flags argument defaults to 0 and has the\n\
3158same meaning as for recv().\n\
3159\n\
3160The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3161The nbytes item is the total number of bytes of non-ancillary data\n\
3162written into the buffers. The ancdata item is a list of zero or more\n\
3163tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3164data (control messages) received: cmsg_level and cmsg_type are\n\
3165integers specifying the protocol level and protocol-specific type\n\
3166respectively, and cmsg_data is a bytes object holding the associated\n\
3167data. The msg_flags item is the bitwise OR of various flags\n\
3168indicating conditions on the received message; see your system\n\
3169documentation for details. If the receiving socket is unconnected,\n\
3170address is the address of the sending socket, if available; otherwise,\n\
3171its value is unspecified.\n\
3172\n\
3173If recvmsg_into() raises an exception after the system call returns,\n\
3174it will first attempt to close any file descriptors received via the\n\
3175SCM_RIGHTS mechanism.");
3176#endif /* CMSG_LEN */
3177
3178
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003179/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003180
Guido van Rossum73624e91994-10-10 17:59:00 +00003181static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003182sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003185 Py_ssize_t len, n = -1;
3186 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3190 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 if (!IS_SELECTABLE(s)) {
3193 PyBuffer_Release(&pbuf);
3194 return select_error();
3195 }
3196 buf = pbuf.buf;
3197 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003198
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003199 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003201 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003203#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003205#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003210 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 PyErr_SetString(socket_timeout, "timed out");
3212 return NULL;
3213 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003214 END_SELECT_LOOP(s)
3215
3216 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (n < 0)
3218 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003219 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003220}
3221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003222PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003223"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003224\n\
3225Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003226argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003227sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003228
3229
3230/* s.sendall(data [,flags]) method */
3231
3232static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003233sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003236 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003237 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3241 return NULL;
3242 buf = pbuf.buf;
3243 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 if (!IS_SELECTABLE(s)) {
3246 PyBuffer_Release(&pbuf);
3247 return select_error();
3248 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003251 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 timeout = internal_select(s, 1);
3253 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003254 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003255#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003256 n = sendsegmented(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003257#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003258 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003259#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003260 }
3261 Py_END_ALLOW_THREADS
3262 if (timeout == 1) {
3263 PyBuffer_Release(&pbuf);
3264 PyErr_SetString(socket_timeout, "timed out");
3265 return NULL;
3266 }
3267 /* PyErr_CheckSignals() might change errno */
3268 saved_errno = errno;
3269 /* We must run our signal handlers before looping again.
3270 send() can return a successful partial write when it is
3271 interrupted, so we can't restrict ourselves to EINTR. */
3272 if (PyErr_CheckSignals()) {
3273 PyBuffer_Release(&pbuf);
3274 return NULL;
3275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003277 /* If interrupted, try again */
3278 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003280 else
3281 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 }
3283 buf += n;
3284 len -= n;
3285 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 if (n < 0)
3289 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 Py_INCREF(Py_None);
3292 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003293}
3294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003295PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003296"sendall(data[, flags])\n\
3297\n\
3298Send a data string to the socket. For the optional flags\n\
3299argument, see the Unix manual. This calls send() repeatedly\n\
3300until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003301to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003302
Guido van Rossum30a685f1991-06-27 15:51:29 +00003303
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003304/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003305
Guido van Rossum73624e91994-10-10 17:59:00 +00003306static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003307sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 Py_buffer pbuf;
3310 PyObject *addro;
3311 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003312 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 sock_addr_t addrbuf;
3314 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003317 arglen = PyTuple_Size(args);
3318 switch (arglen) {
3319 case 2:
3320 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3321 break;
3322 case 3:
3323 PyArg_ParseTuple(args, "y*iO:sendto",
3324 &pbuf, &flags, &addro);
3325 break;
3326 default:
3327 PyErr_Format(PyExc_TypeError,
3328 "sendto() takes 2 or 3 arguments (%d given)",
3329 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003330 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003332 if (PyErr_Occurred())
3333 return NULL;
3334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 buf = pbuf.buf;
3336 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 if (!IS_SELECTABLE(s)) {
3339 PyBuffer_Release(&pbuf);
3340 return select_error();
3341 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3344 PyBuffer_Release(&pbuf);
3345 return NULL;
3346 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003347
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003348 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003350 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 if (!timeout)
3352 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
3353 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003356 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 PyErr_SetString(socket_timeout, "timed out");
3358 return NULL;
3359 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003360 END_SELECT_LOOP(s)
3361 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 if (n < 0)
3363 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003364 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003365}
3366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003367PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003368"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003369\n\
3370Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003371For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003372
Guido van Rossum30a685f1991-06-27 15:51:29 +00003373
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003374/* The sendmsg() and recvmsg[_into]() methods require a working
3375 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3376#ifdef CMSG_LEN
3377/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3378
3379static PyObject *
3380sock_sendmsg(PySocketSockObject *s, PyObject *args)
3381{
3382 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3383 Py_buffer *databufs = NULL;
3384 struct iovec *iovs = NULL;
3385 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003386 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003387 struct cmsginfo {
3388 int level;
3389 int type;
3390 Py_buffer data;
3391 } *cmsgs = NULL;
3392 void *controlbuf = NULL;
3393 size_t controllen, controllen_last;
3394 ssize_t bytes_sent = -1;
3395 int addrlen, timeout, flags = 0;
3396 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3397 *cmsg_fast = NULL, *retval = NULL;
3398
3399 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3400 &data_arg, &cmsg_arg, &flags, &addr_arg))
3401 return NULL;
3402
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003403 /* Parse destination address. */
3404 if (addr_arg != NULL && addr_arg != Py_None) {
3405 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3406 goto finally;
3407 msg.msg_name = &addrbuf;
3408 msg.msg_namelen = addrlen;
3409 }
3410
3411 /* Fill in an iovec for each message part, and save the Py_buffer
3412 structs to release afterwards. */
3413 if ((data_fast = PySequence_Fast(data_arg,
3414 "sendmsg() argument 1 must be an "
3415 "iterable")) == NULL)
3416 goto finally;
3417 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3418 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003419 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420 goto finally;
3421 }
3422 msg.msg_iovlen = ndataparts;
3423 if (ndataparts > 0 &&
3424 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3425 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3426 PyErr_NoMemory();
3427 goto finally;
3428 }
3429 for (; ndatabufs < ndataparts; ndatabufs++) {
3430 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3431 "y*;sendmsg() argument 1 must be an iterable of "
3432 "buffer-compatible objects",
3433 &databufs[ndatabufs]))
3434 goto finally;
3435 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3436 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3437 }
3438
3439 if (cmsg_arg == NULL)
3440 ncmsgs = 0;
3441 else {
3442 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3443 "sendmsg() argument 2 must be an "
3444 "iterable")) == NULL)
3445 goto finally;
3446 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3447 }
3448
3449#ifndef CMSG_SPACE
3450 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003451 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 "sending multiple control messages is not supported "
3453 "on this system");
3454 goto finally;
3455 }
3456#endif
3457 /* Save level, type and Py_buffer for each control message,
3458 and calculate total size. */
3459 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3460 PyErr_NoMemory();
3461 goto finally;
3462 }
3463 controllen = controllen_last = 0;
3464 while (ncmsgbufs < ncmsgs) {
3465 size_t bufsize, space;
3466
3467 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3468 "(iiy*):[sendmsg() ancillary data items]",
3469 &cmsgs[ncmsgbufs].level,
3470 &cmsgs[ncmsgbufs].type,
3471 &cmsgs[ncmsgbufs].data))
3472 goto finally;
3473 bufsize = cmsgs[ncmsgbufs++].data.len;
3474
3475#ifdef CMSG_SPACE
3476 if (!get_CMSG_SPACE(bufsize, &space)) {
3477#else
3478 if (!get_CMSG_LEN(bufsize, &space)) {
3479#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003480 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003481 goto finally;
3482 }
3483 controllen += space;
3484 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003485 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003486 goto finally;
3487 }
3488 controllen_last = controllen;
3489 }
3490
3491 /* Construct ancillary data block from control message info. */
3492 if (ncmsgbufs > 0) {
3493 struct cmsghdr *cmsgh = NULL;
3494
3495 if ((msg.msg_control = controlbuf =
3496 PyMem_Malloc(controllen)) == NULL) {
3497 PyErr_NoMemory();
3498 goto finally;
3499 }
3500 msg.msg_controllen = controllen;
3501
3502 /* Need to zero out the buffer as a workaround for glibc's
3503 CMSG_NXTHDR() implementation. After getting the pointer to
3504 the next header, it checks its (uninitialized) cmsg_len
3505 member to see if the "message" fits in the buffer, and
3506 returns NULL if it doesn't. Zero-filling the buffer
3507 ensures that that doesn't happen. */
3508 memset(controlbuf, 0, controllen);
3509
3510 for (i = 0; i < ncmsgbufs; i++) {
3511 size_t msg_len, data_len = cmsgs[i].data.len;
3512 int enough_space = 0;
3513
3514 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3515 if (cmsgh == NULL) {
3516 PyErr_Format(PyExc_RuntimeError,
3517 "unexpected NULL result from %s()",
3518 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3519 goto finally;
3520 }
3521 if (!get_CMSG_LEN(data_len, &msg_len)) {
3522 PyErr_SetString(PyExc_RuntimeError,
3523 "item size out of range for CMSG_LEN()");
3524 goto finally;
3525 }
3526 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3527 size_t space;
3528
3529 cmsgh->cmsg_len = msg_len;
3530 if (get_cmsg_data_space(&msg, cmsgh, &space))
3531 enough_space = (space >= data_len);
3532 }
3533 if (!enough_space) {
3534 PyErr_SetString(PyExc_RuntimeError,
3535 "ancillary data does not fit in calculated "
3536 "space");
3537 goto finally;
3538 }
3539 cmsgh->cmsg_level = cmsgs[i].level;
3540 cmsgh->cmsg_type = cmsgs[i].type;
3541 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3542 }
3543 }
3544
3545 /* Make the system call. */
3546 if (!IS_SELECTABLE(s)) {
3547 select_error();
3548 goto finally;
3549 }
3550
3551 BEGIN_SELECT_LOOP(s)
3552 Py_BEGIN_ALLOW_THREADS;
3553 timeout = internal_select_ex(s, 1, interval);
3554 if (!timeout)
3555 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3556 Py_END_ALLOW_THREADS;
3557 if (timeout == 1) {
3558 PyErr_SetString(socket_timeout, "timed out");
3559 goto finally;
3560 }
3561 END_SELECT_LOOP(s)
3562
3563 if (bytes_sent < 0) {
3564 s->errorhandler();
3565 goto finally;
3566 }
3567 retval = PyLong_FromSsize_t(bytes_sent);
3568
3569finally:
3570 PyMem_Free(controlbuf);
3571 for (i = 0; i < ncmsgbufs; i++)
3572 PyBuffer_Release(&cmsgs[i].data);
3573 PyMem_Free(cmsgs);
3574 Py_XDECREF(cmsg_fast);
3575 for (i = 0; i < ndatabufs; i++)
3576 PyBuffer_Release(&databufs[i]);
3577 PyMem_Free(databufs);
3578 PyMem_Free(iovs);
3579 Py_XDECREF(data_fast);
3580 return retval;
3581}
3582
3583PyDoc_STRVAR(sendmsg_doc,
3584"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3585\n\
3586Send normal and ancillary data to the socket, gathering the\n\
3587non-ancillary data from a series of buffers and concatenating it into\n\
3588a single message. The buffers argument specifies the non-ancillary\n\
3589data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3590The ancdata argument specifies the ancillary data (control messages)\n\
3591as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3592cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3593protocol level and protocol-specific type respectively, and cmsg_data\n\
3594is a buffer-compatible object holding the associated data. The flags\n\
3595argument defaults to 0 and has the same meaning as for send(). If\n\
3596address is supplied and not None, it sets a destination address for\n\
3597the message. The return value is the number of bytes of non-ancillary\n\
3598data sent.");
3599#endif /* CMSG_LEN */
3600
3601
Guido van Rossum30a685f1991-06-27 15:51:29 +00003602/* s.shutdown(how) method */
3603
Guido van Rossum73624e91994-10-10 17:59:00 +00003604static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003605sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 int how;
3608 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 how = PyLong_AsLong(arg);
3611 if (how == -1 && PyErr_Occurred())
3612 return NULL;
3613 Py_BEGIN_ALLOW_THREADS
3614 res = shutdown(s->sock_fd, how);
3615 Py_END_ALLOW_THREADS
3616 if (res < 0)
3617 return s->errorhandler();
3618 Py_INCREF(Py_None);
3619 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003620}
3621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003622PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003623"shutdown(flag)\n\
3624\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003625Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3626of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003627
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003628#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003629static PyObject*
3630sock_ioctl(PySocketSockObject *s, PyObject *arg)
3631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003632 unsigned long cmd = SIO_RCVALL;
3633 PyObject *argO;
3634 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3637 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 switch (cmd) {
3640 case SIO_RCVALL: {
3641 unsigned int option = RCVALL_ON;
3642 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3643 return NULL;
3644 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3645 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3646 return set_error();
3647 }
3648 return PyLong_FromUnsignedLong(recv); }
3649 case SIO_KEEPALIVE_VALS: {
3650 struct tcp_keepalive ka;
3651 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3652 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3653 return NULL;
3654 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3655 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3656 return set_error();
3657 }
3658 return PyLong_FromUnsignedLong(recv); }
3659 default:
3660 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3661 return NULL;
3662 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003663}
3664PyDoc_STRVAR(sock_ioctl_doc,
3665"ioctl(cmd, option) -> long\n\
3666\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003667Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3668SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3669SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimesfaf2f632008-01-06 16:59:19 +00003670
3671#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003672
3673/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003674
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003675static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3677 accept_doc},
3678 {"bind", (PyCFunction)sock_bind, METH_O,
3679 bind_doc},
3680 {"close", (PyCFunction)sock_close, METH_NOARGS,
3681 close_doc},
3682 {"connect", (PyCFunction)sock_connect, METH_O,
3683 connect_doc},
3684 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3685 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003686 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3687 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3689 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003690#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 {"getpeername", (PyCFunction)sock_getpeername,
3692 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 {"getsockname", (PyCFunction)sock_getsockname,
3695 METH_NOARGS, getsockname_doc},
3696 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3697 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003698#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3700 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 {"listen", (PyCFunction)sock_listen, METH_O,
3703 listen_doc},
3704 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3705 recv_doc},
3706 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3707 recv_into_doc},
3708 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3709 recvfrom_doc},
3710 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3711 recvfrom_into_doc},
3712 {"send", (PyCFunction)sock_send, METH_VARARGS,
3713 send_doc},
3714 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3715 sendall_doc},
3716 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3717 sendto_doc},
3718 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3719 setblocking_doc},
3720 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3721 settimeout_doc},
3722 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3723 gettimeout_doc},
3724 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3725 setsockopt_doc},
3726 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3727 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003728#ifdef CMSG_LEN
3729 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3730 recvmsg_doc},
3731 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3732 recvmsg_into_doc,},
3733 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3734 sendmsg_doc},
3735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003737};
3738
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003739/* SockObject members */
3740static PyMemberDef sock_memberlist[] = {
3741 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3742 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3743 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3744 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3745 {0},
3746};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003747
Guido van Rossum73624e91994-10-10 17:59:00 +00003748/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003749 First close the file description. */
3750
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003751static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003752sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003753{
Antoine Pitroue033e062010-10-29 10:38:18 +00003754 if (s->sock_fd != -1) {
3755 PyObject *exc, *val, *tb;
3756 Py_ssize_t old_refcount = Py_REFCNT(s);
3757 ++Py_REFCNT(s);
3758 PyErr_Fetch(&exc, &val, &tb);
3759 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3760 "unclosed %R", s))
3761 /* Spurious errors can appear at shutdown */
3762 if (PyErr_ExceptionMatches(PyExc_Warning))
3763 PyErr_WriteUnraisable((PyObject *) s);
3764 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003766 Py_REFCNT(s) = old_refcount;
3767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003769}
3770
Guido van Rossum30a685f1991-06-27 15:51:29 +00003771
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003772static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003773sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003774{
Fred Drakea04eaad2000-06-30 02:46:07 +00003775#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 if (s->sock_fd > LONG_MAX) {
3777 /* this can occur on Win64, and actually there is a special
3778 ugly printf formatter for decimal pointer length integer
3779 printing, only bother if necessary*/
3780 PyErr_SetString(PyExc_OverflowError,
3781 "no printf formatter to display "
3782 "the socket descriptor in decimal");
3783 return NULL;
3784 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 return PyUnicode_FromFormat(
3787 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3788 (long)s->sock_fd, s->sock_family,
3789 s->sock_type,
3790 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003791}
3792
3793
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003794/* Create a new, uninitialized socket object. */
3795
3796static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003797sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 new = type->tp_alloc(type, 0);
3802 if (new != NULL) {
3803 ((PySocketSockObject *)new)->sock_fd = -1;
3804 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3805 ((PySocketSockObject *)new)->errorhandler = &set_error;
3806 }
3807 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003808}
3809
3810
3811/* Initialize a new socket object. */
3812
3813/*ARGSUSED*/
3814static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003815sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003817 PySocketSockObject *s = (PySocketSockObject *)self;
3818 PyObject *fdobj = NULL;
3819 SOCKET_T fd = INVALID_SOCKET;
3820 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3821 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3824 "|iiiO:socket", keywords,
3825 &family, &type, &proto, &fdobj))
3826 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 if (fdobj != NULL && fdobj != Py_None) {
3829 fd = PyLong_AsSocket_t(fdobj);
3830 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3831 return -1;
3832 if (fd == INVALID_SOCKET) {
3833 PyErr_SetString(PyExc_ValueError,
3834 "can't use invalid socket value");
3835 return -1;
3836 }
3837 }
3838 else {
3839 Py_BEGIN_ALLOW_THREADS
3840 fd = socket(family, type, proto);
3841 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 if (fd == INVALID_SOCKET) {
3844 set_error();
3845 return -1;
3846 }
3847 }
3848 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003851
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003852}
3853
3854
Guido van Rossumb6775db1994-08-01 11:34:53 +00003855/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003856
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003857static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3859 "_socket.socket", /* tp_name */
3860 sizeof(PySocketSockObject), /* tp_basicsize */
3861 0, /* tp_itemsize */
3862 (destructor)sock_dealloc, /* tp_dealloc */
3863 0, /* tp_print */
3864 0, /* tp_getattr */
3865 0, /* tp_setattr */
3866 0, /* tp_reserved */
3867 (reprfunc)sock_repr, /* tp_repr */
3868 0, /* tp_as_number */
3869 0, /* tp_as_sequence */
3870 0, /* tp_as_mapping */
3871 0, /* tp_hash */
3872 0, /* tp_call */
3873 0, /* tp_str */
3874 PyObject_GenericGetAttr, /* tp_getattro */
3875 0, /* tp_setattro */
3876 0, /* tp_as_buffer */
3877 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3878 sock_doc, /* tp_doc */
3879 0, /* tp_traverse */
3880 0, /* tp_clear */
3881 0, /* tp_richcompare */
3882 0, /* tp_weaklistoffset */
3883 0, /* tp_iter */
3884 0, /* tp_iternext */
3885 sock_methods, /* tp_methods */
3886 sock_memberlist, /* tp_members */
3887 0, /* tp_getset */
3888 0, /* tp_base */
3889 0, /* tp_dict */
3890 0, /* tp_descr_get */
3891 0, /* tp_descr_set */
3892 0, /* tp_dictoffset */
3893 sock_initobj, /* tp_init */
3894 PyType_GenericAlloc, /* tp_alloc */
3895 sock_new, /* tp_new */
3896 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003897};
3898
Guido van Rossum30a685f1991-06-27 15:51:29 +00003899
Guido van Rossum81194471991-07-27 21:42:02 +00003900/* Python interface to gethostname(). */
3901
3902/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003903static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003904socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003905{
Martin v. Löwis72f48422010-10-29 18:20:08 +00003906#ifdef MS_WINDOWS
3907 /* Don't use winsock's gethostname, as this returns the ANSI
3908 version of the hostname, whereas we need a Unicode string.
3909 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003910 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02003911 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01003912 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00003913 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01003914
3915 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01003916 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01003917
3918 if (GetLastError() != ERROR_MORE_DATA)
3919 return PyErr_SetFromWindowsErr(0);
3920
3921 if (size == 0)
3922 return PyUnicode_New(0, 0);
3923
3924 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
3925 names */
3926 name = PyMem_Malloc(size * sizeof(wchar_t));
3927 if (!name)
3928 return NULL;
3929 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
3930 name,
3931 &size))
3932 {
3933 PyMem_Free(name);
3934 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003935 }
Victor Stinner74168972011-11-17 01:11:36 +01003936
3937 result = PyUnicode_FromWideChar(name, size);
3938 PyMem_Free(name);
3939 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00003940#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 char buf[1024];
3942 int res;
3943 Py_BEGIN_ALLOW_THREADS
3944 res = gethostname(buf, (int) sizeof buf - 1);
3945 Py_END_ALLOW_THREADS
3946 if (res < 0)
3947 return set_error();
3948 buf[sizeof buf - 1] = '\0';
3949 return PyUnicode_FromString(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00003950#endif
Guido van Rossum81194471991-07-27 21:42:02 +00003951}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003952
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003953PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003954"gethostname() -> string\n\
3955\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003956Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003957
Antoine Pitrou061cfb52011-02-28 22:25:22 +00003958#ifdef HAVE_SETHOSTNAME
3959PyDoc_STRVAR(sethostname_doc,
3960"sethostname(name)\n\n\
3961Sets the hostname to name.");
3962
3963static PyObject *
3964socket_sethostname(PyObject *self, PyObject *args)
3965{
3966 PyObject *hnobj;
3967 Py_buffer buf;
3968 int res, flag = 0;
3969
3970 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
3971 PyErr_Clear();
3972 if (!PyArg_ParseTuple(args, "O&:sethostname",
3973 PyUnicode_FSConverter, &hnobj))
3974 return NULL;
3975 flag = 1;
3976 }
3977 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
3978 if (!res) {
3979 res = sethostname(buf.buf, buf.len);
3980 PyBuffer_Release(&buf);
3981 }
3982 if (flag)
3983 Py_DECREF(hnobj);
3984 if (res)
3985 return set_error();
3986 Py_RETURN_NONE;
3987}
3988#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00003989
Guido van Rossum30a685f1991-06-27 15:51:29 +00003990/* Python interface to gethostbyname(name). */
3991
3992/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003993static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003994socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003996 char *name;
3997 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00003998 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003999
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004000 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 return NULL;
4002 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004003 goto finally;
4004 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4005finally:
4006 PyMem_Free(name);
4007 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004008}
4009
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004010PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004011"gethostbyname(host) -> address\n\
4012\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004013Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004014
4015
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004016/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4017
4018static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004019gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 char **pch;
4022 PyObject *rtn_tuple = (PyObject *)NULL;
4023 PyObject *name_list = (PyObject *)NULL;
4024 PyObject *addr_list = (PyObject *)NULL;
4025 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004027 if (h == NULL) {
4028 /* Let's get real error message to return */
4029 set_herror(h_errno);
4030 return NULL;
4031 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004033 if (h->h_addrtype != af) {
4034 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004035 errno = EAFNOSUPPORT;
4036 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 return NULL;
4038 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004040 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 case AF_INET:
4043 if (alen < sizeof(struct sockaddr_in))
4044 return NULL;
4045 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004046
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004047#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 case AF_INET6:
4049 if (alen < sizeof(struct sockaddr_in6))
4050 return NULL;
4051 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004052#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 if ((name_list = PyList_New(0)) == NULL)
4057 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 if ((addr_list = PyList_New(0)) == NULL)
4060 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 /* SF #1511317: h_aliases can be NULL */
4063 if (h->h_aliases) {
4064 for (pch = h->h_aliases; *pch != NULL; pch++) {
4065 int status;
4066 tmp = PyUnicode_FromString(*pch);
4067 if (tmp == NULL)
4068 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 status = PyList_Append(name_list, tmp);
4071 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 if (status)
4074 goto err;
4075 }
4076 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4079 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004083 case AF_INET:
4084 {
4085 struct sockaddr_in sin;
4086 memset(&sin, 0, sizeof(sin));
4087 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004088#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4092 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 if (pch == h->h_addr_list && alen >= sizeof(sin))
4095 memcpy((char *) addr, &sin, sizeof(sin));
4096 break;
4097 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004098
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004099#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004100 case AF_INET6:
4101 {
4102 struct sockaddr_in6 sin6;
4103 memset(&sin6, 0, sizeof(sin6));
4104 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004105#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004106 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4109 tmp = makeipaddr((struct sockaddr *)&sin6,
4110 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4113 memcpy((char *) addr, &sin6, sizeof(sin6));
4114 break;
4115 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004116#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004119 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 "unsupported address family");
4121 return NULL;
4122 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 if (tmp == NULL)
4125 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 status = PyList_Append(addr_list, tmp);
4128 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 if (status)
4131 goto err;
4132 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004135
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004136 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 Py_XDECREF(name_list);
4138 Py_XDECREF(addr_list);
4139 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004140}
4141
4142
4143/* Python interface to gethostbyname_ex(name). */
4144
4145/*ARGSUSED*/
4146static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004147socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 char *name;
4150 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004151#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004153#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00004155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004157 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004158#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004160#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004162#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 char buf[16384];
4164 int buf_len = (sizeof buf) - 1;
4165 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004166#endif
4167#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004169#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004170#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004171
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004172 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 return NULL;
4174 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004175 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004177#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004178#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
4180 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004181#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004183#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 memset((void *) &data, '\0', sizeof(data));
4185 result = gethostbyname_r(name, &hp_allocated, &data);
4186 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004187#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004188#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004189#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004193#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 Py_END_ALLOW_THREADS
4195 /* Some C libraries would require addr.__ss_family instead of
4196 addr.ss_family.
4197 Therefore, we cast the sockaddr_storage into sockaddr to
4198 access sa_family. */
4199 sa = (struct sockaddr*)&addr;
4200 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
4201 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004202#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004203 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004204#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004205finally:
4206 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004208}
4209
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004210PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004211"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4212\n\
4213Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004214for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004215
4216
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004217/* Python interface to gethostbyaddr(IP). */
4218
4219/*ARGSUSED*/
4220static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004221socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004222{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004223#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004224 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004225#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 struct sockaddr *sa = (struct sockaddr *)&addr;
4229 char *ip_num;
4230 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004231 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004232#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004234#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 /* glibcs up to 2.10 assume that the buf argument to
4238 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4239 does not ensure. The attribute below instructs the compiler
4240 to maintain this alignment. */
4241 char buf[16384] Py_ALIGNED(8);
4242 int buf_len = (sizeof buf) - 1;
4243 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004244#endif
4245#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004247#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004248#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 char *ap;
4250 int al;
4251 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004252
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004253 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 return NULL;
4255 af = AF_UNSPEC;
4256 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004257 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 af = sa->sa_family;
4259 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004260 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 switch (af) {
4262 case AF_INET:
4263 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4264 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4265 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004266#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 case AF_INET6:
4268 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4269 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4270 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004273 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004274 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 }
4276 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004277#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004278#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004279 result = gethostbyaddr_r(ap, al, af,
4280 &hp_allocated, buf, buf_len,
4281 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004282#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 h = gethostbyaddr_r(ap, al, af,
4284 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004285#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004286 memset((void *) &data, '\0', sizeof(data));
4287 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4288 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004289#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004290#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004291#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004295#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 Py_END_ALLOW_THREADS
4297 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004298#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004299 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004300#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004301finally:
4302 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004304}
4305
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004306PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004307"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4308\n\
4309Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004310for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004311
Guido van Rossum30a685f1991-06-27 15:51:29 +00004312
4313/* Python interface to getservbyname(name).
4314 This only returns the port number, since the other info is already
4315 known or not useful (like the list of aliases). */
4316
4317/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004318static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004319socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 char *name, *proto=NULL;
4322 struct servent *sp;
4323 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4324 return NULL;
4325 Py_BEGIN_ALLOW_THREADS
4326 sp = getservbyname(name, proto);
4327 Py_END_ALLOW_THREADS
4328 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004329 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 return NULL;
4331 }
4332 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004333}
4334
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004335PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004336"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004337\n\
4338Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004339The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4340otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004341
Guido van Rossum30a685f1991-06-27 15:51:29 +00004342
Barry Warsaw11b91a02004-06-28 00:50:43 +00004343/* Python interface to getservbyport(port).
4344 This only returns the service name, since the other info is already
4345 known or not useful (like the list of aliases). */
4346
4347/*ARGSUSED*/
4348static PyObject *
4349socket_getservbyport(PyObject *self, PyObject *args)
4350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 int port;
4352 char *proto=NULL;
4353 struct servent *sp;
4354 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4355 return NULL;
4356 if (port < 0 || port > 0xffff) {
4357 PyErr_SetString(
4358 PyExc_OverflowError,
4359 "getservbyport: port must be 0-65535.");
4360 return NULL;
4361 }
4362 Py_BEGIN_ALLOW_THREADS
4363 sp = getservbyport(htons((short)port), proto);
4364 Py_END_ALLOW_THREADS
4365 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004366 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 return NULL;
4368 }
4369 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004370}
4371
4372PyDoc_STRVAR(getservbyport_doc,
4373"getservbyport(port[, protocolname]) -> string\n\
4374\n\
4375Return the service name from a port number and protocol name.\n\
4376The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4377otherwise any protocol will match.");
4378
Guido van Rossum3901d851996-12-19 16:35:04 +00004379/* Python interface to getprotobyname(name).
4380 This only returns the protocol number, since the other info is
4381 already known or not useful (like the list of aliases). */
4382
4383/*ARGSUSED*/
4384static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004385socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 char *name;
4388 struct protoent *sp;
4389 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4390 return NULL;
4391 Py_BEGIN_ALLOW_THREADS
4392 sp = getprotobyname(name);
4393 Py_END_ALLOW_THREADS
4394 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004395 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004396 return NULL;
4397 }
4398 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004399}
4400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004401PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004402"getprotobyname(name) -> integer\n\
4403\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004404Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004405
Guido van Rossum3901d851996-12-19 16:35:04 +00004406
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004407#ifndef NO_DUP
4408/* dup() function for socket fds */
4409
4410static PyObject *
4411socket_dup(PyObject *self, PyObject *fdobj)
4412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 SOCKET_T fd, newfd;
4414 PyObject *newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004415
4416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 fd = PyLong_AsSocket_t(fdobj);
4418 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4419 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 newfd = dup_socket(fd);
4422 if (newfd == INVALID_SOCKET)
4423 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 newfdobj = PyLong_FromSocket_t(newfd);
4426 if (newfdobj == NULL)
4427 SOCKETCLOSE(newfd);
4428 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004429}
4430
4431PyDoc_STRVAR(dup_doc,
4432"dup(integer) -> integer\n\
4433\n\
4434Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4435sockets; on some platforms os.dup() won't work for socket file descriptors.");
4436#endif
4437
4438
Dave Cole331708b2004-08-09 04:51:41 +00004439#ifdef HAVE_SOCKETPAIR
4440/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004441 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004442 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004443
4444/*ARGSUSED*/
4445static PyObject *
4446socket_socketpair(PyObject *self, PyObject *args)
4447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 PySocketSockObject *s0 = NULL, *s1 = NULL;
4449 SOCKET_T sv[2];
4450 int family, type = SOCK_STREAM, proto = 0;
4451 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00004452
4453#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004455#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4459 &family, &type, &proto))
4460 return NULL;
4461 /* Create a pair of socket fds */
4462 if (socketpair(family, type, proto, sv) < 0)
4463 return set_error();
4464 s0 = new_sockobject(sv[0], family, type, proto);
4465 if (s0 == NULL)
4466 goto finally;
4467 s1 = new_sockobject(sv[1], family, type, proto);
4468 if (s1 == NULL)
4469 goto finally;
4470 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004471
4472finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 if (res == NULL) {
4474 if (s0 == NULL)
4475 SOCKETCLOSE(sv[0]);
4476 if (s1 == NULL)
4477 SOCKETCLOSE(sv[1]);
4478 }
4479 Py_XDECREF(s0);
4480 Py_XDECREF(s1);
4481 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004482}
4483
4484PyDoc_STRVAR(socketpair_doc,
4485"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
4486\n\
4487Create a pair of socket objects from the sockets returned by the platform\n\
4488socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004489The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004490AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004491
4492#endif /* HAVE_SOCKETPAIR */
4493
4494
Guido van Rossum006bf911996-06-12 04:04:55 +00004495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004496socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4501 return NULL;
4502 }
4503 if (x1 < 0) {
4504 PyErr_SetString(PyExc_OverflowError,
4505 "can't convert negative number to unsigned long");
4506 return NULL;
4507 }
4508 x2 = (unsigned int)ntohs((unsigned short)x1);
4509 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004510}
4511
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004512PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004513"ntohs(integer) -> integer\n\
4514\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004515Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004516
4517
Guido van Rossum006bf911996-06-12 04:04:55 +00004518static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004519socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 if (PyLong_Check(arg)) {
4524 x = PyLong_AsUnsignedLong(arg);
4525 if (x == (unsigned long) -1 && PyErr_Occurred())
4526 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004527#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 {
4529 unsigned long y;
4530 /* only want the trailing 32 bits */
4531 y = x & 0xFFFFFFFFUL;
4532 if (y ^ x)
4533 return PyErr_Format(PyExc_OverflowError,
4534 "long int larger than 32 bits");
4535 x = y;
4536 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 }
4539 else
4540 return PyErr_Format(PyExc_TypeError,
4541 "expected int/long, %s found",
4542 Py_TYPE(arg)->tp_name);
4543 if (x == (unsigned long) -1 && PyErr_Occurred())
4544 return NULL;
4545 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004546}
4547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004548PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004549"ntohl(integer) -> integer\n\
4550\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004551Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004552
4553
Guido van Rossum006bf911996-06-12 04:04:55 +00004554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004555socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4560 return NULL;
4561 }
4562 if (x1 < 0) {
4563 PyErr_SetString(PyExc_OverflowError,
4564 "can't convert negative number to unsigned long");
4565 return NULL;
4566 }
4567 x2 = (unsigned int)htons((unsigned short)x1);
4568 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004569}
4570
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004571PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004572"htons(integer) -> integer\n\
4573\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004574Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004575
4576
Guido van Rossum006bf911996-06-12 04:04:55 +00004577static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004578socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 if (PyLong_Check(arg)) {
4583 x = PyLong_AsUnsignedLong(arg);
4584 if (x == (unsigned long) -1 && PyErr_Occurred())
4585 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004586#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 {
4588 unsigned long y;
4589 /* only want the trailing 32 bits */
4590 y = x & 0xFFFFFFFFUL;
4591 if (y ^ x)
4592 return PyErr_Format(PyExc_OverflowError,
4593 "long int larger than 32 bits");
4594 x = y;
4595 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 }
4598 else
4599 return PyErr_Format(PyExc_TypeError,
4600 "expected int/long, %s found",
4601 Py_TYPE(arg)->tp_name);
4602 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004603}
4604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004605PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606"htonl(integer) -> integer\n\
4607\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004608Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004609
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004610/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004612PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004613"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004614\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004615Convert 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 +00004616binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004617
4618static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004619socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004620{
Guido van Rossuma2e48551999-09-09 15:42:59 +00004621#ifndef INADDR_NONE
4622#define INADDR_NONE (-1)
4623#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00004624#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004626#endif
4627
4628#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004629#if (SIZEOF_INT != 4)
4630#error "Not sure if in_addr_t exists and int is not 32-bits."
4631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 /* Have to use inet_addr() instead */
4633 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4638 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004639
Tim Peters1df9fdd2003-02-13 03:13:40 +00004640
4641#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004642
4643#ifdef USE_INET_ATON_WEAKLINK
4644 if (inet_aton != NULL) {
4645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 if (inet_aton(ip_addr, &buf))
4647 return PyBytes_FromStringAndSize((char *)(&buf),
4648 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004649
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004650 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 "illegal IP address string passed to inet_aton");
4652 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004653
Thomas Wouters477c8d52006-05-27 19:21:47 +00004654#ifdef USE_INET_ATON_WEAKLINK
4655 } else {
4656#endif
4657
4658#endif
4659
4660#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 /* special-case this address as inet_addr might return INADDR_NONE
4663 * for this */
4664 if (strcmp(ip_addr, "255.255.255.255") == 0) {
4665 packed_addr = 0xFFFFFFFF;
4666 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004671 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 "illegal IP address string passed to inet_aton");
4673 return NULL;
4674 }
4675 }
4676 return PyBytes_FromStringAndSize((char *) &packed_addr,
4677 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004678
4679#ifdef USE_INET_ATON_WEAKLINK
4680 }
4681#endif
4682
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004683#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004684}
4685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004686PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004687"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004688\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004689Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004690
4691static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004692socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 char *packed_str;
4695 int addr_len;
4696 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4699 return NULL;
4700 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004703 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 "packed IP wrong length for inet_ntoa");
4705 return NULL;
4706 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004711}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004712
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004713#ifdef HAVE_INET_PTON
4714
4715PyDoc_STRVAR(inet_pton_doc,
4716"inet_pton(af, ip) -> packed IP address string\n\
4717\n\
4718Convert an IP address from string format to a packed string suitable\n\
4719for use with low-level network functions.");
4720
4721static PyObject *
4722socket_inet_pton(PyObject *self, PyObject *args)
4723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 int af;
4725 char* ip;
4726 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004727#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004729#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4733 return NULL;
4734 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004735
Martin v. Löwis04697e82004-06-02 12:35:29 +00004736#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004738 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 "can't use AF_INET6, IPv6 is disabled");
4740 return NULL;
4741 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004742#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 retval = inet_pton(af, ip, packed);
4745 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004746 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 return NULL;
4748 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004749 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 "illegal IP address string passed to inet_pton");
4751 return NULL;
4752 } else if (af == AF_INET) {
4753 return PyBytes_FromStringAndSize(packed,
4754 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004755#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 } else if (af == AF_INET6) {
4757 return PyBytes_FromStringAndSize(packed,
4758 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004761 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 return NULL;
4763 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004764}
Thomas Wouters477c8d52006-05-27 19:21:47 +00004765
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004766PyDoc_STRVAR(inet_ntop_doc,
4767"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4768\n\
4769Convert a packed IP address of the given family to string format.");
4770
4771static PyObject *
4772socket_inet_ntop(PyObject *self, PyObject *args)
4773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 int af;
4775 char* packed;
4776 int len;
4777 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004778#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004780#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004782#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00004783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 /* Guarantee NUL-termination for PyUnicode_FromString() below */
4785 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
4788 return NULL;
4789 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 if (af == AF_INET) {
4792 if (len != sizeof(struct in_addr)) {
4793 PyErr_SetString(PyExc_ValueError,
4794 "invalid length of packed IP address string");
4795 return NULL;
4796 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004797#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 } else if (af == AF_INET6) {
4799 if (len != sizeof(struct in6_addr)) {
4800 PyErr_SetString(PyExc_ValueError,
4801 "invalid length of packed IP address string");
4802 return NULL;
4803 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 } else {
4806 PyErr_Format(PyExc_ValueError,
4807 "unknown address family %d", af);
4808 return NULL;
4809 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 retval = inet_ntop(af, packed, ip, sizeof(ip));
4812 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004813 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 return NULL;
4815 } else {
4816 return PyUnicode_FromString(retval);
4817 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 /* NOTREACHED */
4820 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4821 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004822}
4823
4824#endif /* HAVE_INET_PTON */
4825
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004826/* Python interface to getaddrinfo(host, port). */
4827
4828/*ARGSUSED*/
4829static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004830socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004831{
Victor Stinner77af1722011-05-26 14:05:59 +02004832 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004833 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 struct addrinfo hints, *res;
4835 struct addrinfo *res0 = NULL;
4836 PyObject *hobj = NULL;
4837 PyObject *pobj = (PyObject *)NULL;
4838 char pbuf[30];
4839 char *hptr, *pptr;
4840 int family, socktype, protocol, flags;
4841 int error;
4842 PyObject *all = (PyObject *)NULL;
4843 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 family = socktype = protocol = flags = 0;
4846 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02004847 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00004848 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 &protocol, &flags)) {
4850 return NULL;
4851 }
4852 if (hobj == Py_None) {
4853 hptr = NULL;
4854 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004855 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02004856
4857 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 if (!idna)
4859 return NULL;
4860 assert(PyBytes_Check(idna));
4861 hptr = PyBytes_AS_STRING(idna);
4862 } else if (PyBytes_Check(hobj)) {
4863 hptr = PyBytes_AsString(hobj);
4864 } else {
4865 PyErr_SetString(PyExc_TypeError,
4866 "getaddrinfo() argument 1 must be string or None");
4867 return NULL;
4868 }
4869 if (PyLong_CheckExact(pobj)) {
4870 long value = PyLong_AsLong(pobj);
4871 if (value == -1 && PyErr_Occurred())
4872 goto err;
4873 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
4874 pptr = pbuf;
4875 } else if (PyUnicode_Check(pobj)) {
4876 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00004877 if (pptr == NULL)
4878 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00004880 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 } else if (pobj == Py_None) {
4882 pptr = (char *)NULL;
4883 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004884 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 goto err;
4886 }
4887 memset(&hints, 0, sizeof(hints));
4888 hints.ai_family = family;
4889 hints.ai_socktype = socktype;
4890 hints.ai_protocol = protocol;
4891 hints.ai_flags = flags;
4892 Py_BEGIN_ALLOW_THREADS
4893 ACQUIRE_GETADDRINFO_LOCK
4894 error = getaddrinfo(hptr, pptr, &hints, &res0);
4895 Py_END_ALLOW_THREADS
4896 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4897 if (error) {
4898 set_gaierror(error);
4899 goto err;
4900 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 if ((all = PyList_New(0)) == NULL)
4903 goto err;
4904 for (res = res0; res; res = res->ai_next) {
4905 PyObject *single;
4906 PyObject *addr =
4907 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4908 if (addr == NULL)
4909 goto err;
4910 single = Py_BuildValue("iiisO", res->ai_family,
4911 res->ai_socktype, res->ai_protocol,
4912 res->ai_canonname ? res->ai_canonname : "",
4913 addr);
4914 Py_DECREF(addr);
4915 if (single == NULL)
4916 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 if (PyList_Append(all, single))
4919 goto err;
4920 Py_XDECREF(single);
4921 }
4922 Py_XDECREF(idna);
4923 if (res0)
4924 freeaddrinfo(res0);
4925 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004926 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 Py_XDECREF(all);
4928 Py_XDECREF(idna);
4929 if (res0)
4930 freeaddrinfo(res0);
4931 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004932}
4933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004934PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004935"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4936 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004937\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004938Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004939
4940/* Python interface to getnameinfo(sa, flags). */
4941
4942/*ARGSUSED*/
4943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004944socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 PyObject *sa = (PyObject *)NULL;
4947 int flags;
4948 char *hostp;
4949 int port, flowinfo, scope_id;
4950 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4951 struct addrinfo hints, *res = NULL;
4952 int error;
4953 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 flags = flowinfo = scope_id = 0;
4956 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4957 return NULL;
4958 if (!PyTuple_Check(sa)) {
4959 PyErr_SetString(PyExc_TypeError,
4960 "getnameinfo() argument 1 must be a tuple");
4961 return NULL;
4962 }
4963 if (!PyArg_ParseTuple(sa, "si|ii",
4964 &hostp, &port, &flowinfo, &scope_id))
4965 return NULL;
4966 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4967 memset(&hints, 0, sizeof(hints));
4968 hints.ai_family = AF_UNSPEC;
4969 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00004970 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 Py_BEGIN_ALLOW_THREADS
4972 ACQUIRE_GETADDRINFO_LOCK
4973 error = getaddrinfo(hostp, pbuf, &hints, &res);
4974 Py_END_ALLOW_THREADS
4975 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4976 if (error) {
4977 set_gaierror(error);
4978 goto fail;
4979 }
4980 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004981 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 "sockaddr resolved to multiple addresses");
4983 goto fail;
4984 }
4985 switch (res->ai_family) {
4986 case AF_INET:
4987 {
4988 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004989 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 "IPv4 sockaddr must be 2 tuple");
4991 goto fail;
4992 }
4993 break;
4994 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004995#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 case AF_INET6:
4997 {
4998 struct sockaddr_in6 *sin6;
4999 sin6 = (struct sockaddr_in6 *)res->ai_addr;
5000 sin6->sin6_flowinfo = flowinfo;
5001 sin6->sin6_scope_id = scope_id;
5002 break;
5003 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005006 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5008 if (error) {
5009 set_gaierror(error);
5010 goto fail;
5011 }
5012 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005013
5014fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (res)
5016 freeaddrinfo(res);
5017 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005018}
5019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005020PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005021"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005022\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005023Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005024
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005025
5026/* Python API to getting and setting the default timeout value. */
5027
5028static PyObject *
5029socket_getdefaulttimeout(PyObject *self)
5030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 if (defaulttimeout < 0.0) {
5032 Py_INCREF(Py_None);
5033 return Py_None;
5034 }
5035 else
5036 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005037}
5038
5039PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005040"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005041\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005042Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005043A value of None indicates that new socket objects have no timeout.\n\
5044When the socket module is first imported, the default is None.");
5045
5046static PyObject *
5047socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 if (arg == Py_None)
5052 timeout = -1.0;
5053 else {
5054 timeout = PyFloat_AsDouble(arg);
5055 if (timeout < 0.0) {
5056 if (!PyErr_Occurred())
5057 PyErr_SetString(PyExc_ValueError,
5058 "Timeout value out of range");
5059 return NULL;
5060 }
5061 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 Py_INCREF(Py_None);
5066 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005067}
5068
5069PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005070"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005071\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005072Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005073A value of None indicates that new socket objects have no timeout.\n\
5074When the socket module is first imported, the default is None.");
5075
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005076#ifdef HAVE_IF_NAMEINDEX
5077/* Python API for getting interface indices and names */
5078
5079static PyObject *
5080socket_if_nameindex(PyObject *self, PyObject *arg)
5081{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005082 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005083 int i;
5084 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005085
Charles-François Natali60713592011-05-20 16:55:06 +02005086 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005087 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005088 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005089 return NULL;
5090 }
5091
5092 list = PyList_New(0);
5093 if (list == NULL) {
5094 if_freenameindex(ni);
5095 return NULL;
5096 }
5097
Charles-François Natali60713592011-05-20 16:55:06 +02005098 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5099 PyObject *ni_tuple = Py_BuildValue("IO&",
5100 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005101
5102 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5103 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005104 Py_DECREF(list);
5105 if_freenameindex(ni);
5106 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005107 }
5108 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005109 }
5110
5111 if_freenameindex(ni);
5112 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005113}
5114
5115PyDoc_STRVAR(if_nameindex_doc,
5116"if_nameindex()\n\
5117\n\
5118Returns a list of network interface information (index, name) tuples.");
5119
Charles-François Natali60713592011-05-20 16:55:06 +02005120static PyObject *
5121socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005122{
Charles-François Natali60713592011-05-20 16:55:06 +02005123 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005124 unsigned long index;
5125
Charles-François Natali60713592011-05-20 16:55:06 +02005126 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5127 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005128 return NULL;
5129
Charles-François Natali60713592011-05-20 16:55:06 +02005130 index = if_nametoindex(PyBytes_AS_STRING(oname));
5131 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005132 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005133 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005134 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005135 return NULL;
5136 }
5137
5138 return PyLong_FromUnsignedLong(index);
5139}
5140
5141PyDoc_STRVAR(if_nametoindex_doc,
5142"if_nametoindex(if_name)\n\
5143\n\
5144Returns the interface index corresponding to the interface name if_name.");
5145
Charles-François Natali60713592011-05-20 16:55:06 +02005146static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005147socket_if_indextoname(PyObject *self, PyObject *arg)
5148{
Charles-François Natali60713592011-05-20 16:55:06 +02005149 unsigned long index;
5150 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005151
Charles-François Natali60713592011-05-20 16:55:06 +02005152 index = PyLong_AsUnsignedLong(arg);
5153 if (index == (unsigned long) -1)
5154 return NULL;
5155
5156 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005157 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005158 return NULL;
5159 }
5160
Charles-François Natali60713592011-05-20 16:55:06 +02005161 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005162}
5163
5164PyDoc_STRVAR(if_indextoname_doc,
5165"if_indextoname(if_index)\n\
5166\n\
5167Returns the interface name corresponding to the interface index if_index.");
5168
5169#endif /* HAVE_IF_NAMEINDEX */
5170
5171
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005172#ifdef CMSG_LEN
5173/* Python interface to CMSG_LEN(length). */
5174
5175static PyObject *
5176socket_CMSG_LEN(PyObject *self, PyObject *args)
5177{
5178 Py_ssize_t length;
5179 size_t result;
5180
5181 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5182 return NULL;
5183 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5184 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5185 return NULL;
5186 }
5187 return PyLong_FromSize_t(result);
5188}
5189
5190PyDoc_STRVAR(CMSG_LEN_doc,
5191"CMSG_LEN(length) -> control message length\n\
5192\n\
5193Return the total length, without trailing padding, of an ancillary\n\
5194data item with associated data of the given length. This value can\n\
5195often be used as the buffer size for recvmsg() to receive a single\n\
5196item of ancillary data, but RFC 3542 requires portable applications to\n\
5197use CMSG_SPACE() and thus include space for padding, even when the\n\
5198item will be the last in the buffer. Raises OverflowError if length\n\
5199is outside the permissible range of values.");
5200
5201
5202#ifdef CMSG_SPACE
5203/* Python interface to CMSG_SPACE(length). */
5204
5205static PyObject *
5206socket_CMSG_SPACE(PyObject *self, PyObject *args)
5207{
5208 Py_ssize_t length;
5209 size_t result;
5210
5211 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5212 return NULL;
5213 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5214 PyErr_SetString(PyExc_OverflowError,
5215 "CMSG_SPACE() argument out of range");
5216 return NULL;
5217 }
5218 return PyLong_FromSize_t(result);
5219}
5220
5221PyDoc_STRVAR(CMSG_SPACE_doc,
5222"CMSG_SPACE(length) -> buffer size\n\
5223\n\
5224Return the buffer size needed for recvmsg() to receive an ancillary\n\
5225data item with associated data of the given length, along with any\n\
5226trailing padding. The buffer space needed to receive multiple items\n\
5227is the sum of the CMSG_SPACE() values for their associated data\n\
5228lengths. Raises OverflowError if length is outside the permissible\n\
5229range of values.");
5230#endif /* CMSG_SPACE */
5231#endif /* CMSG_LEN */
5232
5233
Guido van Rossum30a685f1991-06-27 15:51:29 +00005234/* List of functions exported by this module. */
5235
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005236static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 {"gethostbyname", socket_gethostbyname,
5238 METH_VARARGS, gethostbyname_doc},
5239 {"gethostbyname_ex", socket_gethostbyname_ex,
5240 METH_VARARGS, ghbn_ex_doc},
5241 {"gethostbyaddr", socket_gethostbyaddr,
5242 METH_VARARGS, gethostbyaddr_doc},
5243 {"gethostname", socket_gethostname,
5244 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005245#ifdef HAVE_SETHOSTNAME
5246 {"sethostname", socket_sethostname,
5247 METH_VARARGS, sethostname_doc},
5248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 {"getservbyname", socket_getservbyname,
5250 METH_VARARGS, getservbyname_doc},
5251 {"getservbyport", socket_getservbyport,
5252 METH_VARARGS, getservbyport_doc},
5253 {"getprotobyname", socket_getprotobyname,
5254 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005255#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 {"dup", socket_dup,
5257 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005258#endif
Dave Cole331708b2004-08-09 04:51:41 +00005259#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 {"socketpair", socket_socketpair,
5261 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 {"ntohs", socket_ntohs,
5264 METH_VARARGS, ntohs_doc},
5265 {"ntohl", socket_ntohl,
5266 METH_O, ntohl_doc},
5267 {"htons", socket_htons,
5268 METH_VARARGS, htons_doc},
5269 {"htonl", socket_htonl,
5270 METH_O, htonl_doc},
5271 {"inet_aton", socket_inet_aton,
5272 METH_VARARGS, inet_aton_doc},
5273 {"inet_ntoa", socket_inet_ntoa,
5274 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005275#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 {"inet_pton", socket_inet_pton,
5277 METH_VARARGS, inet_pton_doc},
5278 {"inet_ntop", socket_inet_ntop,
5279 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005280#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005281 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5282 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 {"getnameinfo", socket_getnameinfo,
5284 METH_VARARGS, getnameinfo_doc},
5285 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5286 METH_NOARGS, getdefaulttimeout_doc},
5287 {"setdefaulttimeout", socket_setdefaulttimeout,
5288 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005289#ifdef HAVE_IF_NAMEINDEX
5290 {"if_nameindex", socket_if_nameindex,
5291 METH_NOARGS, if_nameindex_doc},
5292 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005293 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005294 {"if_indextoname", socket_if_indextoname,
5295 METH_O, if_indextoname_doc},
5296#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005297#ifdef CMSG_LEN
5298 {"CMSG_LEN", socket_CMSG_LEN,
5299 METH_VARARGS, CMSG_LEN_doc},
5300#ifdef CMSG_SPACE
5301 {"CMSG_SPACE", socket_CMSG_SPACE,
5302 METH_VARARGS, CMSG_SPACE_doc},
5303#endif
5304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005306};
5307
Guido van Rossum30a685f1991-06-27 15:51:29 +00005308
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005309#ifdef MS_WINDOWS
5310#define OS_INIT_DEFINED
5311
5312/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005313
5314static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005315os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005318}
5319
5320static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005321os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 WSADATA WSAData;
5324 int ret;
5325 ret = WSAStartup(0x0101, &WSAData);
5326 switch (ret) {
5327 case 0: /* No error */
5328 Py_AtExit(os_cleanup);
5329 return 1; /* Success */
5330 case WSASYSNOTREADY:
5331 PyErr_SetString(PyExc_ImportError,
5332 "WSAStartup failed: network not ready");
5333 break;
5334 case WSAVERNOTSUPPORTED:
5335 case WSAEINVAL:
5336 PyErr_SetString(
5337 PyExc_ImportError,
5338 "WSAStartup failed: requested version not supported");
5339 break;
5340 default:
5341 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5342 break;
5343 }
5344 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005345}
5346
Guido van Rossum8d665e61996-06-26 18:22:49 +00005347#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005348
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005349
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005350#ifdef PYOS_OS2
5351#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005352
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005353/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005354
5355static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005356os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005357{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005358#ifndef PYCC_GCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 if (rc == 0) {
5362 return 1; /* Success */
5363 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005368#else
Ezio Melotti13925002011-03-16 11:05:33 +02005369 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00005371#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005372}
5373
5374#endif /* PYOS_OS2 */
5375
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005376
5377#ifndef OS_INIT_DEFINED
5378static int
5379os_init(void)
5380{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005382}
5383#endif
5384
5385
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005386/* C API table - always add new things to the end for binary
5387 compatibility. */
5388static
5389PySocketModule_APIObject PySocketModuleAPI =
5390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005392 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005394};
5395
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005396
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005397/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005398
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005399 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005400 "socket.py" which implements some additional functionality.
5401 The import of "_socket" may fail with an ImportError exception if
5402 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005403 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005404 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005405*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005407PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005408"Implementation module for socket operations.\n\
5409\n\
5410See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005411
Martin v. Löwis1a214512008-06-11 05:26:20 +00005412static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 PyModuleDef_HEAD_INIT,
5414 PySocket_MODULE_NAME,
5415 socket_doc,
5416 -1,
5417 socket_methods,
5418 NULL,
5419 NULL,
5420 NULL,
5421 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005422};
5423
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005424PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005425PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 if (!os_init())
5430 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 Py_TYPE(&sock_type) = &PyType_Type;
5433 m = PyModule_Create(&socketmodule);
5434 if (m == NULL)
5435 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005436
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005437 Py_INCREF(PyExc_OSError);
5438 PySocketModuleAPI.error = PyExc_OSError;
5439 Py_INCREF(PyExc_OSError);
5440 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005442 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 if (socket_herror == NULL)
5444 return NULL;
5445 Py_INCREF(socket_herror);
5446 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005447 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 NULL);
5449 if (socket_gaierror == NULL)
5450 return NULL;
5451 Py_INCREF(socket_gaierror);
5452 PyModule_AddObject(m, "gaierror", socket_gaierror);
5453 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005454 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 if (socket_timeout == NULL)
5456 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005457 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 Py_INCREF(socket_timeout);
5459 PyModule_AddObject(m, "timeout", socket_timeout);
5460 Py_INCREF((PyObject *)&sock_type);
5461 if (PyModule_AddObject(m, "SocketType",
5462 (PyObject *)&sock_type) != 0)
5463 return NULL;
5464 Py_INCREF((PyObject *)&sock_type);
5465 if (PyModule_AddObject(m, "socket",
5466 (PyObject *)&sock_type) != 0)
5467 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005468
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005469#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005471#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 Py_INCREF(has_ipv6);
5475 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 /* Export C API */
5478 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5479 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5480 ) != 0)
5481 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005484#ifdef AF_UNSPEC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005488#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005490#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005491#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005493#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005494#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 /* Amateur Radio AX.25 */
5496 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005497#endif
5498#ifdef AF_IPX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005500#endif
5501#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 /* Appletalk DDP */
5503 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005504#endif
5505#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 /* Amateur radio NetROM */
5507 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005508#endif
5509#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 /* Multiprotocol bridge */
5511 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005512#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005513#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 /* ATM PVCs */
5515 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005516#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005517#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 /* Reserved for Werner's ATM */
5519 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005520#endif
5521#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 /* Reserved for X.25 project */
5523 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005524#endif
5525#ifdef AF_INET6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005527#endif
5528#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 /* Amateur Radio X.25 PLP */
5530 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005531#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005532#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 /* Reserved for DECnet project */
5534 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005535#endif
5536#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 /* Reserved for 802.2LLC project */
5538 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005539#endif
5540#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 /* Security callback pseudo AF */
5542 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005543#endif
5544#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 /* PF_KEY key management API */
5546 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005547#endif
5548#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 /* */
5550 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
5551 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005552#ifdef NETLINK_SKIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005554#endif
5555#ifdef NETLINK_W1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
5559 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005560#ifdef NETLINK_TCPDIAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005561 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005562#endif
5563#ifdef NETLINK_NFLOG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005565#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005566#ifdef NETLINK_XFRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005568#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005569#ifdef NETLINK_ARPD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005571#endif
5572#ifdef NETLINK_ROUTE6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005576#ifdef NETLINK_DNRTMSG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005578#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005579#ifdef NETLINK_TAPBASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005581#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005582#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005583#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 /* Alias to emulate 4.4BSD */
5585 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005586#endif
5587#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 /* Ash */
5589 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005590#endif
5591#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 /* Acorn Econet */
5593 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005594#endif
5595#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 /* ATM SVCs */
5597 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005598#endif
5599#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 /* Linux SNA Project (nutters!) */
5601 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005602#endif
5603#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 /* IRDA sockets */
5605 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005606#endif
5607#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 /* PPPoX sockets */
5609 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005610#endif
5611#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 /* Wanpipe API Sockets */
5613 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005614#endif
5615#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 /* Linux LLC */
5617 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005618#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005619
Hye-Shik Chang81268602004-02-02 06:05:24 +00005620#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
5622 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
5623 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
5624 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005625#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005627#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005628#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005629#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
5633 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
5636 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5637 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00005638#endif
5639
Charles-François Natali47413c12011-10-06 19:47:44 +02005640#ifdef AF_CAN
5641 /* Controller Area Network */
5642 PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
5643#endif
5644#ifdef PF_CAN
5645 /* Controller Area Network */
5646 PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
5647#endif
5648
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005649/* Reliable Datagram Sockets */
5650#ifdef AF_RDS
5651 PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
5652#endif
5653#ifdef PF_RDS
5654 PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
5655#endif
5656
Antoine Pitroub156a462010-10-27 20:13:57 +00005657#ifdef AF_PACKET
5658 PyModule_AddIntMacro(m, AF_PACKET);
5659#endif
5660#ifdef PF_PACKET
5661 PyModule_AddIntMacro(m, PF_PACKET);
5662#endif
5663#ifdef PACKET_HOST
5664 PyModule_AddIntMacro(m, PACKET_HOST);
5665#endif
5666#ifdef PACKET_BROADCAST
5667 PyModule_AddIntMacro(m, PACKET_BROADCAST);
5668#endif
5669#ifdef PACKET_MULTICAST
5670 PyModule_AddIntMacro(m, PACKET_MULTICAST);
5671#endif
5672#ifdef PACKET_OTHERHOST
5673 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
5674#endif
5675#ifdef PACKET_OUTGOING
5676 PyModule_AddIntMacro(m, PACKET_OUTGOING);
5677#endif
5678#ifdef PACKET_LOOPBACK
5679 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
5680#endif
5681#ifdef PACKET_FASTROUTE
5682 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00005683#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005684
Christian Heimes043d6f62008-01-07 17:19:16 +00005685#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00005687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 /* for addresses */
5689 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
5690 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
5691 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00005692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
5694 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
5695 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 /* for setsockopt() */
5698 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
5699 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
5700 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
5701 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
5702 TIPC_DEST_DROPPABLE);
5703 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00005704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
5706 TIPC_LOW_IMPORTANCE);
5707 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
5708 TIPC_MEDIUM_IMPORTANCE);
5709 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
5710 TIPC_HIGH_IMPORTANCE);
5711 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
5712 TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00005713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 /* for subscriptions */
5715 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
5716 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00005717#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 /* doesn't seem to be available everywhere */
5719 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00005720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
5722 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
5723 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
5724 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
5725 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
5726 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00005727#endif
5728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 /* Socket types */
5730 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
5731 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005732/* We have incomplete socket support. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
5734 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00005735#if defined(SOCK_RDM)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00005737#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00005738#ifdef SOCK_CLOEXEC
5739 PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
5740#endif
5741#ifdef SOCK_NONBLOCK
5742 PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
5743#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745#ifdef SO_DEBUG
5746 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748#ifdef SO_ACCEPTCONN
5749 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751#ifdef SO_REUSEADDR
5752 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005753#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005754#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00005756#endif
5757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758#ifdef SO_KEEPALIVE
5759 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761#ifdef SO_DONTROUTE
5762 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764#ifdef SO_BROADCAST
5765 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767#ifdef SO_USELOOPBACK
5768 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770#ifdef SO_LINGER
5771 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773#ifdef SO_OOBINLINE
5774 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776#ifdef SO_REUSEPORT
5777 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779#ifdef SO_SNDBUF
5780 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782#ifdef SO_RCVBUF
5783 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005785#ifdef SO_SNDLOWAT
5786 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788#ifdef SO_RCVLOWAT
5789 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791#ifdef SO_SNDTIMEO
5792 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794#ifdef SO_RCVTIMEO
5795 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797#ifdef SO_ERROR
5798 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800#ifdef SO_TYPE
5801 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803#ifdef SO_SETFIB
5804 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00005805#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005806#ifdef SO_PASSCRED
5807 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
5808#endif
5809#ifdef SO_PEERCRED
5810 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
5811#endif
5812#ifdef LOCAL_PEERCRED
5813 PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
5814#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02005815#ifdef SO_BINDTODEVICE
5816 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
5817#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819 /* Maximum number of connections for "listen" */
5820#ifdef SOMAXCONN
5821 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005822#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005824#endif
5825
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005826 /* Ancilliary message types */
5827#ifdef SCM_RIGHTS
5828 PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
5829#endif
5830#ifdef SCM_CREDENTIALS
5831 PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
5832#endif
5833#ifdef SCM_CREDS
5834 PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
5835#endif
5836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 /* Flags for send, recv */
5838#ifdef MSG_OOB
5839 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841#ifdef MSG_PEEK
5842 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005844#ifdef MSG_DONTROUTE
5845 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847#ifdef MSG_DONTWAIT
5848 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00005849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850#ifdef MSG_EOR
5851 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853#ifdef MSG_TRUNC
5854 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856#ifdef MSG_CTRUNC
5857 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859#ifdef MSG_WAITALL
5860 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862#ifdef MSG_BTAG
5863 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865#ifdef MSG_ETAG
5866 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005867#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005868#ifdef MSG_NOSIGNAL
5869 PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
5870#endif
5871#ifdef MSG_NOTIFICATION
5872 PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
5873#endif
5874#ifdef MSG_CMSG_CLOEXEC
5875 PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
5876#endif
5877#ifdef MSG_ERRQUEUE
5878 PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
5879#endif
5880#ifdef MSG_CONFIRM
5881 PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
5882#endif
5883#ifdef MSG_MORE
5884 PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
5885#endif
5886#ifdef MSG_EOF
5887 PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
5888#endif
5889#ifdef MSG_BCAST
5890 PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
5891#endif
5892#ifdef MSG_MCAST
5893 PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
5894#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 /* Protocol level and numbers, usable for [gs]etsockopt */
5897#ifdef SOL_SOCKET
5898 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900#ifdef SOL_IP
5901 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005902#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905#ifdef SOL_IPX
5906 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908#ifdef SOL_AX25
5909 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911#ifdef SOL_ATALK
5912 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914#ifdef SOL_NETROM
5915 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917#ifdef SOL_ROSE
5918 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920#ifdef SOL_TCP
5921 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005922#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925#ifdef SOL_UDP
5926 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005927#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005929#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02005930#ifdef SOL_CAN_BASE
5931 PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
5932#endif
5933#ifdef SOL_CAN_RAW
5934 PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
5935 PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
5936#endif
5937#ifdef HAVE_LINUX_CAN_H
5938 PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
5939 PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
5940 PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
5941
5942 PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
5943 PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
5944 PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
5945#endif
5946#ifdef HAVE_LINUX_CAN_RAW_H
5947 PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
5948 PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
5949 PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
5950 PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
5951#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005952#ifdef SOL_RDS
5953 PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
5954#endif
5955#ifdef RDS_CANCEL_SENT_TO
5956 PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
5957#endif
5958#ifdef RDS_GET_MR
5959 PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
5960#endif
5961#ifdef RDS_FREE_MR
5962 PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
5963#endif
5964#ifdef RDS_RECVERR
5965 PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
5966#endif
5967#ifdef RDS_CONG_MONITOR
5968 PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
5969#endif
5970#ifdef RDS_GET_MR_FOR_DEST
5971 PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
5972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973#ifdef IPPROTO_IP
5974 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978#ifdef IPPROTO_HOPOPTS
5979 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981#ifdef IPPROTO_ICMP
5982 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005983#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986#ifdef IPPROTO_IGMP
5987 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989#ifdef IPPROTO_GGP
5990 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992#ifdef IPPROTO_IPV4
5993 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995#ifdef IPPROTO_IPV6
5996 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998#ifdef IPPROTO_IPIP
5999 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001#ifdef IPPROTO_TCP
6002 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006003#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006#ifdef IPPROTO_EGP
6007 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009#ifdef IPPROTO_PUP
6010 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012#ifdef IPPROTO_UDP
6013 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006014#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017#ifdef IPPROTO_IDP
6018 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020#ifdef IPPROTO_HELLO
6021 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023#ifdef IPPROTO_ND
6024 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026#ifdef IPPROTO_TP
6027 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029#ifdef IPPROTO_IPV6
6030 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032#ifdef IPPROTO_ROUTING
6033 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035#ifdef IPPROTO_FRAGMENT
6036 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038#ifdef IPPROTO_RSVP
6039 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041#ifdef IPPROTO_GRE
6042 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044#ifdef IPPROTO_ESP
6045 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047#ifdef IPPROTO_AH
6048 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050#ifdef IPPROTO_MOBILE
6051 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053#ifdef IPPROTO_ICMPV6
6054 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056#ifdef IPPROTO_NONE
6057 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059#ifdef IPPROTO_DSTOPTS
6060 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062#ifdef IPPROTO_XTP
6063 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065#ifdef IPPROTO_EON
6066 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068#ifdef IPPROTO_PIM
6069 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071#ifdef IPPROTO_IPCOMP
6072 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074#ifdef IPPROTO_VRRP
6075 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006076#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006077#ifdef IPPROTO_SCTP
6078 PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
6079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080#ifdef IPPROTO_BIP
6081 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006082#endif
6083/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084#ifdef IPPROTO_RAW
6085 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006086#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089#ifdef IPPROTO_MAX
6090 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006091#endif
6092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 /* Some port configuration */
6094#ifdef IPPORT_RESERVED
6095 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006096#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099#ifdef IPPORT_USERRESERVED
6100 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006103#endif
6104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 /* Some reserved IP v.4 addresses */
6106#ifdef INADDR_ANY
6107 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006108#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111#ifdef INADDR_BROADCAST
6112 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006113#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116#ifdef INADDR_LOOPBACK
6117 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121#ifdef INADDR_UNSPEC_GROUP
6122 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006123#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef INADDR_ALLHOSTS_GROUP
6127 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6128 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006129#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef INADDR_MAX_LOCAL_GROUP
6133 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
6134 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006135#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef INADDR_NONE
6139 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006140#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006142#endif
6143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 /* IPv4 [gs]etsockopt options */
6145#ifdef IP_OPTIONS
6146 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148#ifdef IP_HDRINCL
6149 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151#ifdef IP_TOS
6152 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154#ifdef IP_TTL
6155 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157#ifdef IP_RECVOPTS
6158 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160#ifdef IP_RECVRETOPTS
6161 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163#ifdef IP_RECVDSTADDR
6164 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166#ifdef IP_RETOPTS
6167 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169#ifdef IP_MULTICAST_IF
6170 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172#ifdef IP_MULTICAST_TTL
6173 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175#ifdef IP_MULTICAST_LOOP
6176 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178#ifdef IP_ADD_MEMBERSHIP
6179 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181#ifdef IP_DROP_MEMBERSHIP
6182 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184#ifdef IP_DEFAULT_MULTICAST_TTL
6185 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
6186 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188#ifdef IP_DEFAULT_MULTICAST_LOOP
6189 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
6190 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192#ifdef IP_MAX_MEMBERSHIPS
6193 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006194#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006195#ifdef IP_TRANSPARENT
6196 PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
6197#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6200#ifdef IPV6_JOIN_GROUP
6201 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203#ifdef IPV6_LEAVE_GROUP
6204 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206#ifdef IPV6_MULTICAST_HOPS
6207 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209#ifdef IPV6_MULTICAST_IF
6210 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212#ifdef IPV6_MULTICAST_LOOP
6213 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215#ifdef IPV6_UNICAST_HOPS
6216 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006219#ifdef IPV6_V6ONLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006223#ifdef IPV6_CHECKSUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006225#endif
6226#ifdef IPV6_DONTFRAG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006228#endif
6229#ifdef IPV6_DSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006231#endif
6232#ifdef IPV6_HOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006234#endif
6235#ifdef IPV6_HOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006237#endif
6238#ifdef IPV6_NEXTHOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006240#endif
6241#ifdef IPV6_PATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006243#endif
6244#ifdef IPV6_PKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006246#endif
6247#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006249#endif
6250#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006252#endif
6253#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006255#endif
6256#ifdef IPV6_RECVPKTINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006258#endif
6259#ifdef IPV6_RECVRTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006260 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006261#endif
6262#ifdef IPV6_RECVTCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006264#endif
6265#ifdef IPV6_RTHDR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006267#endif
6268#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006270#endif
6271#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006273#endif
6274#ifdef IPV6_RECVPATHMTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006276#endif
6277#ifdef IPV6_TCLASS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006279#endif
6280#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006282#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 /* TCP options */
6285#ifdef TCP_NODELAY
6286 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288#ifdef TCP_MAXSEG
6289 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291#ifdef TCP_CORK
6292 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294#ifdef TCP_KEEPIDLE
6295 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef TCP_KEEPINTVL
6298 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300#ifdef TCP_KEEPCNT
6301 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303#ifdef TCP_SYNCNT
6304 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306#ifdef TCP_LINGER2
6307 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309#ifdef TCP_DEFER_ACCEPT
6310 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312#ifdef TCP_WINDOW_CLAMP
6313 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315#ifdef TCP_INFO
6316 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318#ifdef TCP_QUICKACK
6319 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006320#endif
6321
Guido van Rossum09be4091999-08-09 14:40:40 +00006322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 /* IPX options */
6324#ifdef IPX_TYPE
6325 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006326#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006327
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006328/* Reliable Datagram Sockets */
6329#ifdef RDS_CMSG_RDMA_ARGS
6330 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
6331#endif
6332#ifdef RDS_CMSG_RDMA_DEST
6333 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
6334#endif
6335#ifdef RDS_CMSG_RDMA_MAP
6336 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
6337#endif
6338#ifdef RDS_CMSG_RDMA_STATUS
6339 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
6340#endif
6341#ifdef RDS_CMSG_RDMA_UPDATE
6342 PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
6343#endif
6344#ifdef RDS_RDMA_READWRITE
6345 PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
6346#endif
6347#ifdef RDS_RDMA_FENCE
6348 PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
6349#endif
6350#ifdef RDS_RDMA_INVALIDATE
6351 PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
6352#endif
6353#ifdef RDS_RDMA_USE_ONCE
6354 PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
6355#endif
6356#ifdef RDS_RDMA_DONTWAIT
6357 PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
6358#endif
6359#ifdef RDS_RDMA_NOTIFY_ME
6360 PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
6361#endif
6362#ifdef RDS_RDMA_SILENT
6363 PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
6364#endif
6365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006367#ifdef EAI_ADDRFAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006369#endif
6370#ifdef EAI_AGAIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006372#endif
6373#ifdef EAI_BADFLAGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006375#endif
6376#ifdef EAI_FAIL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006378#endif
6379#ifdef EAI_FAMILY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006381#endif
6382#ifdef EAI_MEMORY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006384#endif
6385#ifdef EAI_NODATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006387#endif
6388#ifdef EAI_NONAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006390#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006391#ifdef EAI_OVERFLOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006393#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006394#ifdef EAI_SERVICE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006396#endif
6397#ifdef EAI_SOCKTYPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006399#endif
6400#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006402#endif
6403#ifdef EAI_BADHINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006405#endif
6406#ifdef EAI_PROTOCOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006408#endif
6409#ifdef EAI_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006411#endif
6412#ifdef AI_PASSIVE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006414#endif
6415#ifdef AI_CANONNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006417#endif
6418#ifdef AI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006420#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006421#ifdef AI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006423#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006424#ifdef AI_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006426#endif
6427#ifdef AI_ALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006429#endif
6430#ifdef AI_V4MAPPED_CFG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006432#endif
6433#ifdef AI_ADDRCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006435#endif
6436#ifdef AI_V4MAPPED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006438#endif
6439#ifdef AI_DEFAULT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006441#endif
6442#ifdef NI_MAXHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006444#endif
6445#ifdef NI_MAXSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006447#endif
6448#ifdef NI_NOFQDN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006450#endif
6451#ifdef NI_NUMERICHOST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006453#endif
6454#ifdef NI_NAMEREQD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006456#endif
6457#ifdef NI_NUMERICSERV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006459#endif
6460#ifdef NI_DGRAM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006462#endif
6463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006465#ifdef SHUT_RD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006467#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006469#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006471#endif
6472#ifdef SHUT_WR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006474#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006476#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006478#endif
6479#ifdef SHUT_RDWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006480 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006481#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006483#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006485#endif
6486
Christian Heimesfaf2f632008-01-06 16:59:19 +00006487#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488 {
6489 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6490 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6491 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006492 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493 PyObject *tmp;
6494 tmp = PyLong_FromUnsignedLong(codes[i]);
6495 if (tmp == NULL)
6496 return NULL;
6497 PyModule_AddObject(m, names[i], tmp);
6498 }
6499 }
6500 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
6501 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
6502 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006503#ifdef RCVALL_IPLEVEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006505#endif
6506#ifdef RCVALL_MAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006508#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006509#endif /* _MSTCPIP_ */
6510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006512#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006516}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006517
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006518
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006519#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006520#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006521
6522/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006523/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006524
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006525int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006526inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006529#if (SIZEOF_INT != 4)
6530#error "Not sure if in_addr_t exists and int is not 32-bits."
6531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 unsigned int packed_addr;
6533 packed_addr = inet_addr(src);
6534 if (packed_addr == INADDR_NONE)
6535 return 0;
6536 memcpy(dst, &packed_addr, 4);
6537 return 1;
6538 }
6539 /* Should set errno to EAFNOSUPPORT */
6540 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006541}
6542
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006543const char *
6544inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 if (af == AF_INET) {
6547 struct in_addr packed_addr;
6548 if (size < 16)
6549 /* Should set errno to ENOSPC. */
6550 return NULL;
6551 memcpy(&packed_addr, src, sizeof(packed_addr));
6552 return strncpy(dst, inet_ntoa(packed_addr), size);
6553 }
6554 /* Should set errno to EAFNOSUPPORT */
6555 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006556}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006557
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006558#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006559#endif